Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Unified Diff: trunk/src/base/message_loop/message_pump_io_ios.cc

Issue 16897005: Revert 206507 "Move message_pump to base/message_loop." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: trunk/src/base/message_loop/message_pump_io_ios.cc
===================================================================
--- trunk/src/base/message_loop/message_pump_io_ios.cc (revision 206508)
+++ trunk/src/base/message_loop/message_pump_io_ios.cc (working copy)
@@ -1,209 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_pump_io_ios.h"
-
-namespace base {
-
-MessagePumpIOSForIO::FileDescriptorWatcher::FileDescriptorWatcher()
- : is_persistent_(false),
- fdref_(NULL),
- callback_types_(0),
- fd_source_(NULL),
- pump_(NULL),
- watcher_(NULL) {
-}
-
-MessagePumpIOSForIO::FileDescriptorWatcher::~FileDescriptorWatcher() {
- StopWatchingFileDescriptor();
-}
-
-bool MessagePumpIOSForIO::FileDescriptorWatcher::StopWatchingFileDescriptor() {
- if (fdref_ == NULL)
- return true;
-
- CFFileDescriptorDisableCallBacks(fdref_, callback_types_);
- pump_->RemoveRunLoopSource(fd_source_);
- fd_source_.reset();
- fdref_.reset();
- callback_types_ = 0;
- pump_ = NULL;
- watcher_ = NULL;
- return true;
-}
-
-void MessagePumpIOSForIO::FileDescriptorWatcher::Init(
- CFFileDescriptorRef fdref,
- CFOptionFlags callback_types,
- CFRunLoopSourceRef fd_source,
- bool is_persistent) {
- DCHECK(fdref);
- DCHECK(!fdref_);
-
- is_persistent_ = is_persistent;
- fdref_.reset(fdref);
- callback_types_ = callback_types;
- fd_source_.reset(fd_source);
-}
-
-void MessagePumpIOSForIO::FileDescriptorWatcher::OnFileCanReadWithoutBlocking(
- int fd,
- MessagePumpIOSForIO* pump) {
- DCHECK(callback_types_ & kCFFileDescriptorReadCallBack);
- pump->WillProcessIOEvent();
- watcher_->OnFileCanReadWithoutBlocking(fd);
- pump->DidProcessIOEvent();
-}
-
-void MessagePumpIOSForIO::FileDescriptorWatcher::OnFileCanWriteWithoutBlocking(
- int fd,
- MessagePumpIOSForIO* pump) {
- DCHECK(callback_types_ & kCFFileDescriptorWriteCallBack);
- pump->WillProcessIOEvent();
- watcher_->OnFileCanWriteWithoutBlocking(fd);
- pump->DidProcessIOEvent();
-}
-
-MessagePumpIOSForIO::MessagePumpIOSForIO() {
-}
-
-MessagePumpIOSForIO::~MessagePumpIOSForIO() {
-}
-
-bool MessagePumpIOSForIO::WatchFileDescriptor(
- int fd,
- bool persistent,
- int mode,
- FileDescriptorWatcher *controller,
- Watcher *delegate) {
- DCHECK_GE(fd, 0);
- DCHECK(controller);
- DCHECK(delegate);
- DCHECK(mode == WATCH_READ || mode == WATCH_WRITE || mode == WATCH_READ_WRITE);
-
- // WatchFileDescriptor should be called on the pump thread. It is not
- // threadsafe, and your watcher may never be registered.
- DCHECK(watch_file_descriptor_caller_checker_.CalledOnValidThread());
-
- CFFileDescriptorContext source_context = {0};
- source_context.info = controller;
-
- CFOptionFlags callback_types = 0;
- if (mode & WATCH_READ) {
- callback_types |= kCFFileDescriptorReadCallBack;
- }
- if (mode & WATCH_WRITE) {
- callback_types |= kCFFileDescriptorWriteCallBack;
- }
-
- CFFileDescriptorRef fdref = controller->fdref_;
- if (fdref == NULL) {
- base::mac::ScopedCFTypeRef<CFFileDescriptorRef> scoped_fdref(
- CFFileDescriptorCreate(kCFAllocatorDefault, fd, false, HandleFdIOEvent,
- &source_context));
- if (scoped_fdref == NULL) {
- NOTREACHED() << "CFFileDescriptorCreate failed";
- return false;
- }
-
- CFFileDescriptorEnableCallBacks(scoped_fdref, callback_types);
-
- // TODO(wtc): what should the 'order' argument be?
- base::mac::ScopedCFTypeRef<CFRunLoopSourceRef> scoped_fd_source(
- CFFileDescriptorCreateRunLoopSource(kCFAllocatorDefault,
- scoped_fdref,
- 0));
- if (scoped_fd_source == NULL) {
- NOTREACHED() << "CFFileDescriptorCreateRunLoopSource failed";
- return false;
- }
- CFRunLoopAddSource(run_loop(), scoped_fd_source, kCFRunLoopCommonModes);
-
- // Transfer ownership of scoped_fdref and fd_source to controller.
- controller->Init(scoped_fdref.release(), callback_types,
- scoped_fd_source.release(), persistent);
- } else {
- // It's illegal to use this function to listen on 2 separate fds with the
- // same |controller|.
- if (CFFileDescriptorGetNativeDescriptor(fdref) != fd) {
- NOTREACHED() << "FDs don't match: "
- << CFFileDescriptorGetNativeDescriptor(fdref)
- << " != " << fd;
- return false;
- }
- if (persistent != controller->is_persistent_) {
- NOTREACHED() << "persistent doesn't match";
- return false;
- }
-
- // Combine old/new event masks.
- CFFileDescriptorDisableCallBacks(fdref, controller->callback_types_);
- controller->callback_types_ |= callback_types;
- CFFileDescriptorEnableCallBacks(fdref, controller->callback_types_);
- }
-
- controller->set_watcher(delegate);
- controller->set_pump(this);
-
- return true;
-}
-
-void MessagePumpIOSForIO::RemoveRunLoopSource(CFRunLoopSourceRef source) {
- CFRunLoopRemoveSource(run_loop(), source, kCFRunLoopCommonModes);
-}
-
-void MessagePumpIOSForIO::AddIOObserver(IOObserver *obs) {
- io_observers_.AddObserver(obs);
-}
-
-void MessagePumpIOSForIO::RemoveIOObserver(IOObserver *obs) {
- io_observers_.RemoveObserver(obs);
-}
-
-void MessagePumpIOSForIO::WillProcessIOEvent() {
- FOR_EACH_OBSERVER(IOObserver, io_observers_, WillProcessIOEvent());
-}
-
-void MessagePumpIOSForIO::DidProcessIOEvent() {
- FOR_EACH_OBSERVER(IOObserver, io_observers_, DidProcessIOEvent());
-}
-
-// static
-void MessagePumpIOSForIO::HandleFdIOEvent(CFFileDescriptorRef fdref,
- CFOptionFlags callback_types,
- void* context) {
- FileDescriptorWatcher* controller =
- static_cast<FileDescriptorWatcher*>(context);
- DCHECK_EQ(fdref, controller->fdref_);
-
- // Ensure that |fdref| will remain live for the duration of this function
- // call even if |controller| is deleted or |StopWatchingFileDescriptor()| is
- // called, either of which will cause |fdref| to be released.
- mac::ScopedCFTypeRef<CFFileDescriptorRef> scoped_fdref(
- fdref, base::scoped_policy::RETAIN);
-
- int fd = CFFileDescriptorGetNativeDescriptor(fdref);
- MessagePumpIOSForIO* pump = controller->pump();
- if (callback_types & kCFFileDescriptorWriteCallBack)
- controller->OnFileCanWriteWithoutBlocking(fd, pump);
-
- // Perform the read callback only if the file descriptor has not been
- // invalidated in the write callback. As |FileDescriptorWatcher| invalidates
- // its file descriptor on destruction, the file descriptor being valid also
- // guarantees that |controller| has not been deleted.
- if (callback_types & kCFFileDescriptorReadCallBack &&
- CFFileDescriptorIsValid(fdref)) {
- DCHECK_EQ(fdref, controller->fdref_);
- controller->OnFileCanReadWithoutBlocking(fd, pump);
- }
-
- // Re-enable callbacks after the read/write if the file descriptor is still
- // valid and the controller is persistent.
- if (CFFileDescriptorIsValid(fdref) && controller->is_persistent_) {
- DCHECK_EQ(fdref, controller->fdref_);
- CFFileDescriptorEnableCallBacks(fdref, callback_types);
- }
-}
-
-} // namespace base
« no previous file with comments | « trunk/src/base/message_loop/message_pump_io_ios.h ('k') | trunk/src/base/message_loop/message_pump_io_ios_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698