Change MessagePumpLibevent::Run to process I/O events before doing idle
work. R=jar@chromium.org,mark@chromium.org,rvargas@chromium.org BUG=87707 TEST=covered by existing unit tests Review URL: http://codereview.chromium.org/7291010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91252 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
@@ -107,6 +107,7 @@ void MessagePumpLibevent::FileDescriptorWatcher::OnFileCanWriteWithoutBlocking(
|
|||||||
MessagePumpLibevent::MessagePumpLibevent()
|
MessagePumpLibevent::MessagePumpLibevent()
|
||||||
: keep_running_(true),
|
: keep_running_(true),
|
||||||
in_run_(false),
|
in_run_(false),
|
||||||
|
processed_io_events_(false),
|
||||||
event_base_(event_base_new()),
|
event_base_(event_base_new()),
|
||||||
wakeup_pipe_in_(-1),
|
wakeup_pipe_in_(-1),
|
||||||
wakeup_pipe_out_(-1) {
|
wakeup_pipe_out_(-1) {
|
||||||
@@ -226,6 +227,12 @@ void MessagePumpLibevent::Run(Delegate* delegate) {
|
|||||||
if (!keep_running_)
|
if (!keep_running_)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
event_base_loop(event_base_, EVLOOP_NONBLOCK);
|
||||||
|
did_work |= processed_io_events_;
|
||||||
|
processed_io_events_ = false;
|
||||||
|
if (!keep_running_)
|
||||||
|
break;
|
||||||
|
|
||||||
did_work |= delegate->DoDelayedWork(&delayed_work_time_);
|
did_work |= delegate->DoDelayedWork(&delayed_work_time_);
|
||||||
if (!keep_running_)
|
if (!keep_running_)
|
||||||
break;
|
break;
|
||||||
@@ -331,6 +338,7 @@ void MessagePumpLibevent::OnLibeventNotification(int fd, short flags,
|
|||||||
static_cast<FileDescriptorWatcher*>(context);
|
static_cast<FileDescriptorWatcher*>(context);
|
||||||
|
|
||||||
MessagePumpLibevent* pump = controller->pump();
|
MessagePumpLibevent* pump = controller->pump();
|
||||||
|
pump->processed_io_events_ = true;
|
||||||
|
|
||||||
if (flags & EV_WRITE) {
|
if (flags & EV_WRITE) {
|
||||||
controller->OnFileCanWriteWithoutBlocking(fd, pump);
|
controller->OnFileCanWriteWithoutBlocking(fd, pump);
|
||||||
@@ -351,6 +359,7 @@ void MessagePumpLibevent::OnWakeup(int socket, short flags, void* context) {
|
|||||||
char buf;
|
char buf;
|
||||||
int nread = HANDLE_EINTR(read(socket, &buf, 1));
|
int nread = HANDLE_EINTR(read(socket, &buf, 1));
|
||||||
DCHECK_EQ(nread, 1);
|
DCHECK_EQ(nread, 1);
|
||||||
|
that->processed_io_events_ = true;
|
||||||
// Tell libevent to break out of inner loop.
|
// Tell libevent to break out of inner loop.
|
||||||
event_base_loopbreak(that->event_base_);
|
event_base_loopbreak(that->event_base_);
|
||||||
}
|
}
|
||||||
|
@@ -144,6 +144,9 @@ class BASE_API MessagePumpLibevent : public MessagePump {
|
|||||||
// This flag is set when inside Run.
|
// This flag is set when inside Run.
|
||||||
bool in_run_;
|
bool in_run_;
|
||||||
|
|
||||||
|
// This flag is set if libevent has processed I/O events.
|
||||||
|
bool processed_io_events_;
|
||||||
|
|
||||||
// The time at which we should call DoDelayedWork.
|
// The time at which we should call DoDelayedWork.
|
||||||
TimeTicks delayed_work_time_;
|
TimeTicks delayed_work_time_;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user