[
https://issues.apache.org/jira/browse/TS-4487?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15355328#comment-15355328
]
ASF GitHub Bot commented on TS-4487:
------------------------------------
Github user shinrich commented on a diff in the pull request:
https://github.com/apache/trafficserver/pull/754#discussion_r68956117
--- Diff: iocore/net/UnixNetVConnection.cc ---
@@ -556,13 +556,17 @@ write_to_net_io(NetHandler *nh, UnixNetVConnection
*vc, EThread *thread)
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)) {
+ }
+ int e = 0;
+ if (!signalled) {
+ e = VC_EVENT_WRITE_READY;
+ } else if (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;
- } else if (!signalled) {
- if (write_signal_and_update(VC_EVENT_WRITE_READY, vc) != EVENT_CONT)
{
+ e = wbe_event;
+ }
+ if (e) {
+ if (write_signal_and_update(e, vc) != EVENT_CONT) {
--- End diff --
Took me a bit to understand the point of this tidying up. But looking back
at the bug description, this rearrangement stops the early return which would
miss the lock change detection. So that makes sense.
> 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)