| Index: base/message_pump_libevent.cc
|
| ===================================================================
|
| --- base/message_pump_libevent.cc (revision 6915)
|
| +++ base/message_pump_libevent.cc (working copy)
|
| @@ -15,48 +15,17 @@
|
|
|
| // Return 0 on success
|
| // Too small a function to bother putting in a library?
|
| -static int SetNonBlocking(int fd) {
|
| - int flags = fcntl(fd, F_GETFL, 0);
|
| - if (flags == -1)
|
| - flags = 0;
|
| - return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
|
| +static int SetNonBlocking(int fd)
|
| +{
|
| + int flags = fcntl(fd, F_GETFL, 0);
|
| + if (-1 == flags)
|
| + flags = 0;
|
| + return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
|
| }
|
|
|
| -MessagePumpLibevent::FileDescriptorWatcher::FileDescriptorWatcher()
|
| - : is_persistent_(false),
|
| - event_(NULL) {
|
| -}
|
| -
|
| -MessagePumpLibevent::FileDescriptorWatcher::~FileDescriptorWatcher() {
|
| - if (event_.get()) {
|
| - StopWatchingFileDescriptor();
|
| - }
|
| -}
|
| -
|
| -void MessagePumpLibevent::FileDescriptorWatcher::Init(event *e,
|
| - bool is_persistent) {
|
| - DCHECK(e);
|
| -
|
| - // Cleanup any old event we might have been watching.
|
| - if (event_.get()) {
|
| - StopWatchingFileDescriptor();
|
| - }
|
| -
|
| - is_persistent = is_persistent_;
|
| - event_.reset(e);
|
| -}
|
| -
|
| -bool MessagePumpLibevent::FileDescriptorWatcher::StopWatchingFileDescriptor() {
|
| - if (event_.get() == NULL) {
|
| - return true;
|
| - }
|
| -
|
| - // event_del() is a no-op of the event isn't active.
|
| - return (event_del(event_.get()) == 0);
|
| -}
|
| -
|
| // Called if a byte is received on the wakeup pipe.
|
| void MessagePumpLibevent::OnWakeup(int socket, short flags, void* context) {
|
| +
|
| base::MessagePumpLibevent* that =
|
| static_cast<base::MessagePumpLibevent*>(context);
|
| DCHECK(that->wakeup_pipe_out_ == socket);
|
| @@ -92,7 +61,7 @@
|
|
|
| wakeup_event_ = new event;
|
| event_set(wakeup_event_, wakeup_pipe_out_, EV_READ | EV_PERSIST,
|
| - OnWakeup, this);
|
| + OnWakeup, this);
|
| event_base_set(event_base_, wakeup_event_);
|
|
|
| if (event_add(wakeup_event_, 0))
|
| @@ -108,58 +77,69 @@
|
| event_base_free(event_base_);
|
| }
|
|
|
| -bool MessagePumpLibevent::WatchFileDescriptor(int fd,
|
| - bool persistent,
|
| - Mode mode,
|
| - FileDescriptorWatcher *controller,
|
| - Watcher *delegate) {
|
| - DCHECK(fd > 0);
|
| - DCHECK(controller);
|
| - DCHECK(delegate);
|
| - DCHECK(mode == WATCH_READ || mode == WATCH_WRITE || mode == WATCH_READ_WRITE);
|
| +void MessagePumpLibevent::WatchSocket(int socket, short interest_mask,
|
| + event* e, Watcher* watcher) {
|
|
|
| - int event_mask = persistent ? EV_PERSIST : 0;
|
| - if (mode == WATCH_READ || mode == WATCH_READ_WRITE) {
|
| - event_mask |= EV_READ;
|
| - }
|
| - if (mode == WATCH_WRITE || mode == WATCH_READ_WRITE) {
|
| - event_mask |= EV_WRITE;
|
| - }
|
| + // Set current interest mask and message pump for this event
|
| + event_set(e, socket, interest_mask, OnReadinessNotification, watcher);
|
|
|
| - // Ownership is transferred to the controller.
|
| - scoped_ptr<event> evt(new event);
|
| - // Set current interest mask and message pump for this event.
|
| - event_set(evt.get(), fd, event_mask | EV_READ, OnLibeventNotification,
|
| - delegate);
|
| -
|
| // Tell libevent which message pump this socket will belong to when we add it.
|
| - if (event_base_set(event_base_, evt.get()) != 0) {
|
| - return false;
|
| - }
|
| + event_base_set(event_base_, e);
|
|
|
| // Add this socket to the list of monitored sockets.
|
| - if (event_add(evt.get(), NULL) != 0) {
|
| - return false;
|
| + if (event_add(e, NULL))
|
| + NOTREACHED();
|
| +}
|
| +
|
| +void MessagePumpLibevent::WatchFileHandle(int fd, short interest_mask,
|
| + event* e, FileWatcher* watcher) {
|
| + // Set current interest mask and message pump for this event
|
| + if ((interest_mask & EV_READ) != 0) {
|
| + event_set(e, fd, interest_mask, OnFileReadReadinessNotification, watcher);
|
| + } else {
|
| + event_set(e, fd, interest_mask, OnFileWriteReadinessNotification, watcher);
|
| }
|
|
|
| - // Transfer ownership of e to controller.
|
| - controller->Init(evt.release(), persistent);
|
| - return true;
|
| + // Tell libevent which message pump this fd will belong to when we add it.
|
| + event_base_set(event_base_, e);
|
| +
|
| + // Add this fd to the list of monitored sockets.
|
| + if (event_add(e, NULL))
|
| + NOTREACHED();
|
| }
|
|
|
| +void MessagePumpLibevent::UnwatchSocket(event* e) {
|
| + // Remove this socket from the list of monitored sockets.
|
| + if (event_del(e))
|
| + NOTREACHED();
|
| +}
|
|
|
| -void MessagePumpLibevent::OnLibeventNotification(int fd, short flags,
|
| - void* context) {
|
| +void MessagePumpLibevent::UnwatchFileHandle(event* e) {
|
| + // Remove this fd from the list of monitored fds.
|
| + if (event_del(e))
|
| + NOTREACHED();
|
| +}
|
| +
|
| +void MessagePumpLibevent::OnReadinessNotification(int socket, short flags,
|
| + void* context) {
|
| + // The given socket is ready for I/O.
|
| + // Tell the owner what kind of I/O the socket is ready for.
|
| Watcher* watcher = static_cast<Watcher*>(context);
|
| + watcher->OnSocketReady(flags);
|
| +}
|
|
|
| - if (flags & EV_WRITE) {
|
| - watcher->OnFileCanWriteWithoutBlocking(fd);
|
| - }
|
| - if (flags & EV_READ) {
|
| - watcher->OnFileCanReadWithoutBlocking(fd);
|
| - }
|
| +void MessagePumpLibevent::OnFileReadReadinessNotification(int fd, short flags,
|
| + void* context) {
|
| + FileWatcher* watcher = static_cast<FileWatcher*>(context);
|
| + watcher->OnFileReadReady(fd);
|
| }
|
|
|
| +void MessagePumpLibevent::OnFileWriteReadinessNotification(int fd, short flags,
|
| + void* context) {
|
| + FileWatcher* watcher = static_cast<FileWatcher*>(context);
|
| + watcher->OnFileWriteReady(fd);
|
| +}
|
| +
|
| // Reentrant!
|
| void MessagePumpLibevent::Run(Delegate* delegate) {
|
| DCHECK(keep_running_) << "Quit must have been called outside of Run!";
|
|
|