void DBusWatcher::StopWatching() { MOZ_ASSERT(!NS_IsMainThread()); mReadWatcher.StopWatchingFileDescriptor(); mWriteWatcher.StopWatchingFileDescriptor(); }
void UnixSocketImpl::OnFileCanReadWithoutBlocking(int aFd) { // Keep reading data until either // // - mIncoming is completely read // If so, sConsumer->MessageReceived(mIncoming.forget()) // // - mIncoming isn't completely read, but there's no more // data available on the socket // If so, break; while (true) { if (!mIncoming) { mIncoming = new UnixSocketRawData(); ssize_t ret = read(aFd, mIncoming->mData, UnixSocketRawData::MAX_DATA_SIZE); if (ret <= 0) { if (ret == -1) { if (errno == EINTR) { continue; // retry system call when interrupted } else if (errno == EAGAIN || errno == EWOULDBLOCK) { mIncoming.forget(); return; // no data available: return and re-poll } // else fall through to error handling on other errno's } #ifdef DEBUG NS_WARNING("Cannot read from network"); #endif // At this point, assume that we can't actually access // the socket anymore mIncoming.forget(); mReadWatcher.StopWatchingFileDescriptor(); mWriteWatcher.StopWatchingFileDescriptor(); nsRefPtr<SocketCloseTask> t = new SocketCloseTask(this); NS_DispatchToMainThread(t); return; } mIncoming->mData[ret] = 0; mIncoming->mSize = ret; nsRefPtr<SocketReceiveTask> t = new SocketReceiveTask(this, mIncoming.forget()); NS_DispatchToMainThread(t); if (ret < ssize_t(UnixSocketRawData::MAX_DATA_SIZE)) { return; } } } }
void UnixSocketImpl::OnFileCanReadWithoutBlocking(int aFd) { MOZ_ASSERT(!NS_IsMainThread()); MOZ_ASSERT(!mShuttingDownOnIOThread); // Read up to MAX_READ_SIZE bytes. while (true) { uint8_t data[MAX_READ_SIZE]; ssize_t ret = read(aFd, data, sizeof(data)); if (ret <= 0) { if (ret == -1) { if (errno == EINTR) { continue; // retry system call when interrupted } if (errno == EAGAIN || errno == EWOULDBLOCK) { return; // no data available: return and re-poll } // else fall through to error handling on other errno's } #ifdef DEBUG NS_WARNING("Cannot read from network"); #endif // We're done with our descriptors. Ensure that spurious events don't // cause us to end up back here. mReadWatcher.StopWatchingFileDescriptor(); mWriteWatcher.StopWatchingFileDescriptor(); nsRefPtr<SocketCloseTask> t = new SocketCloseTask(this); NS_DispatchToMainThread(t); return; } UnixSocketRawData* incoming = new UnixSocketRawData(ret); memcpy(incoming->mData, data, ret); nsRefPtr<SocketReceiveTask> t = new SocketReceiveTask(this, incoming); NS_DispatchToMainThread(t); if (ret < ssize_t(MAX_READ_SIZE)) { return; } } }
void GonkDiskSpaceWatcher::DoStop() { NS_ASSERTION(XRE_GetIOMessageLoop() == MessageLoopForIO::current(), "Not on the correct message loop"); if (mFd != -1) { mReadWatcher.StopWatchingFileDescriptor(); fanotify_mark(mFd, FAN_MARK_FLUSH, 0, 0, kWatchedPath); close(mFd); mFd = -1; } // Dispatch the cleanup to the main thread. nsCOMPtr<nsIRunnable> runnable = new DiskSpaceCleaner(); NS_DispatchToMainThread(runnable); }
void UnixSocketImpl::OnFileCanReadWithoutBlocking(int aFd) { MOZ_ASSERT(!NS_IsMainThread()); MOZ_ASSERT(!mShuttingDownOnIOThread); SocketConnectionStatus status = mConsumer->GetConnectionStatus(); if (status == SOCKET_CONNECTED) { // Read all of the incoming data. while (true) { uint8_t data[MAX_READ_SIZE]; ssize_t ret = read(aFd, data, MAX_READ_SIZE); if (ret <= 0) { if (ret == -1) { if (errno == EINTR) { continue; // retry system call when interrupted } if (errno == EAGAIN || errno == EWOULDBLOCK) { return; // no data available: return and re-poll } #ifdef DEBUG NS_WARNING("Cannot read from network"); #endif // else fall through to error handling on other errno's } // We're done with our descriptors. Ensure that spurious events don't // cause us to end up back here. mReadWatcher.StopWatchingFileDescriptor(); mWriteWatcher.StopWatchingFileDescriptor(); nsRefPtr<RequestClosingSocketTask> t = new RequestClosingSocketTask(this); NS_DispatchToMainThread(t); return; } UnixSocketRawData* incoming = new UnixSocketRawData(ret); memcpy(incoming->mData, data, ret); nsRefPtr<SocketReceiveTask> t = new SocketReceiveTask(this, incoming); NS_DispatchToMainThread(t); // If ret is less than MAX_READ_SIZE, there's no more data in the socket // for us to read now. if (ret < ssize_t(MAX_READ_SIZE)) { return; } } MOZ_NOT_REACHED("We returned early"); } if (status == SOCKET_LISTENING) { int client_fd = accept(mFd.get(), (struct sockaddr*)&mAddr, &mAddrSize); if (client_fd < 0) { return; } if (!mConnector->SetUp(client_fd)) { NS_WARNING("Could not set up socket!"); return; } mReadWatcher.StopWatchingFileDescriptor(); mWriteWatcher.StopWatchingFileDescriptor(); mFd.reset(client_fd); if (!SetSocketFlags()) { return; } mIOLoop = nullptr; nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_SUCCESS); NS_DispatchToMainThread(t); SetUpIO(); } }