Description
the code:
int64_t r = vc->load_buffer_and_write(towrite, wattempted, total_written, buf, needs);
At the end of write_to_net_io,
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;
another issue in write_to_net_io(): did not check the change of lock at the return callback with wbe.
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; } }