[
https://issues.apache.org/jira/browse/TS-4487?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15353014#comment-15353014
]
ASF GitHub Bot commented on TS-4487:
------------------------------------
GitHub user oknet opened a pull request:
https://github.com/apache/trafficserver/pull/754
TS-4487: check the change of lock after return from wbe callback
and handle (needs & EVENTIO_READ) first.
You can merge this pull request into a Git repository by running:
$ git pull https://github.com/oknet/trafficserver TS-4487
Alternatively you can review and apply these changes as the patch at:
https://github.com/apache/trafficserver/pull/754.patch
To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:
This closes #754
----
commit 2f50842b5034a6eacba991787d1842b84c136429
Author: Oknet Xu <[email protected]>
Date: 2016-06-28T13:52:06Z
check the change of lock after return from wbe callback and handle (needs &
EVENTIO_READ) first.
----
> haven't check the change of lock after return from wbe callback
> ---------------------------------------------------------------
>
> Key: TS-4487
> URL: https://issues.apache.org/jira/browse/TS-4487
> Project: Traffic Server
> Issue Type: Improvement
> Components: SSL
> Reporter: Oknet Xu
> Assignee: Oknet Xu
> Fix For: 7.0.0
>
>
> the code:
> {code}
> int64_t r = vc->load_buffer_and_write(towrite, wattempted, total_written,
> buf, needs);
> {code}
> At the end of write_to_net_io,
> {code}
> if (!buf.reader()->read_avail()) { // should check needs==0
> write_disable(nh, vc);
> return;
> }
> if ((needs & EVENTIO_WRITE) == EVENTIO_WRITE) {
> write_reschedule(nh, vc);
> }
> if ((needs & EVENTIO_READ) == EVENTIO_READ) {
> read_reschedule(nh, vc);
> }
> return;
> {code}
> another issue in write_to_net_io(): did not check the change of lock at the
> return callback with wbe.
> {code}
> if (s->vio.ntodo() <= 0) {
> write_signal_done(VC_EVENT_WRITE_COMPLETE, nh, vc);
> return;
> } else if (signalled && (wbe_event != vc->write_buffer_empty_event)) {
> // @a signalled means we won't send an event, and the event values
> differing means we
> // had a write buffer trap and cleared it, so we need to send it now.
> if (write_signal_and_update(wbe_event, vc) != EVENT_CONT)
> return;
> // ============> did not check the change of lock at the return callback
> with wbe.
> } else if (!signalled) {
> if (write_signal_and_update(VC_EVENT_WRITE_READY, vc) != EVENT_CONT) {
> return;
> }
> // change of lock... don't look at shared variables!
> if (lock.get_mutex() != s->vio.mutex.get()) {
> write_reschedule(nh, vc);
> return;
> }
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)