void DBusWatcher::StartWatching() { MOZ_ASSERT(!NS_IsMainThread()); MOZ_ASSERT(mWatch); int fd = dbus_watch_get_unix_fd(mWatch); MessageLoopForIO* ioLoop = MessageLoopForIO::current(); ioLoop->WatchFileDescriptor(fd, true, MessageLoopForIO::WATCH_READ, &mReadWatcher, this); ioLoop->WatchFileDescriptor(fd, true, MessageLoopForIO::WATCH_WRITE, &mWriteWatcher, this); }
bool NetlinkPoller::OpenSocket() { mSocket.rwget() = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); if (mSocket.get() < 0) return false; int sz = kBuffsize; if (setsockopt(mSocket.get(), SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)) < 0) return false; // add FD_CLOEXEC flag int flags = fcntl(mSocket.get(), F_GETFD); if (flags == -1) { return false; } flags |= FD_CLOEXEC; if (fcntl(mSocket.get(), F_SETFD, flags) == -1) return false; // set non-blocking if (fcntl(mSocket.get(), F_SETFL, O_NONBLOCK) == -1) return false; struct sockaddr_nl saddr; bzero(&saddr, sizeof(saddr)); saddr.nl_family = AF_NETLINK; saddr.nl_groups = 1; saddr.nl_pid = gettid(); do { if (bind(mSocket.get(), (struct sockaddr *)&saddr, sizeof(saddr)) == 0) { break; } if (errno != EADDRINUSE) { return false; } if (saddr.nl_pid == 0) { return false; } // Once there was any other place in the same process assigning saddr.nl_pid by // gettid(), we can detect it and print warning message. printf_stderr("The netlink socket address saddr.nl_pid=%u is in use. Let the kernel re-assign.\n", saddr.nl_pid); saddr.nl_pid = 0; } while (true); if (!mIOLoop->WatchFileDescriptor(mSocket.get(), true, MessageLoopForIO::WATCH_READ, &mReadWatcher, this)) { return false; } return true; }
void EnqueueTask(int aDelayMs, CancelableTask* aTask) { MessageLoopForIO* ioLoop = MessageLoopForIO::current(); if (!ioLoop) { NS_WARNING("No IOLoop to attach to, cancelling self!"); return; } if (mTask) { return; } if (mCurrentTaskIsCanceled) { return; } mTask = aTask; if (aDelayMs) { ioLoop->PostDelayedTask(FROM_HERE, mTask, aDelayMs); } else { ioLoop->PostTask(FROM_HERE, mTask); } }
// NB: Any CancelableTask that is passed into EnqueueTask *must* set mTask to // nullptr in its run method if it was not already canceled. void EnqueueTask(int aDelayMs, CancelableTask* aTask) { MOZ_ASSERT(!NS_IsMainThread()); nsAutoPtr<CancelableTask> task(aTask); MessageLoopForIO* ioLoop = MessageLoopForIO::current(); if (!ioLoop) { NS_WARNING("No IOLoop to attach to, cancelling self!"); return; } if (mTask) { return; } if (mShuttingDownOnIOThread) { return; } mTask = task.forget(); if (aDelayMs) { ioLoop->PostDelayedTask(FROM_HERE, mTask, aDelayMs); } else { ioLoop->PostTask(FROM_HERE, mTask); } }
bool NetlinkPoller::OpenSocket() { mSocket.rwget() = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); if (mSocket.get() < 0) return false; int sz = kBuffsize; if (setsockopt(mSocket.get(), SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)) < 0) return false; // add FD_CLOEXEC flag int flags = fcntl(mSocket.get(), F_GETFD); if (flags == -1) { return false; } flags |= FD_CLOEXEC; if (fcntl(mSocket.get(), F_SETFD, flags) == -1) return false; // set non-blocking if (fcntl(mSocket.get(), F_SETFL, O_NONBLOCK) == -1) return false; struct sockaddr_nl saddr; bzero(&saddr, sizeof(saddr)); saddr.nl_family = AF_NETLINK; saddr.nl_groups = 1; saddr.nl_pid = getpid(); if (bind(mSocket.get(), (struct sockaddr *)&saddr, sizeof(saddr)) == -1) return false; if (!mIOLoop->WatchFileDescriptor(mSocket.get(), true, MessageLoopForIO::WATCH_READ, &mReadWatcher, this)) { return false; } return true; }