WorkerPool implementation for Mac, using NSOperationQueue
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@1493 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
base
@ -84,6 +84,8 @@
|
||||
7BD8F6D30E65DB0200034DE9 /* bzip2_error_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7BD8F6D20E65DB0200034DE9 /* bzip2_error_handler.cc */; };
|
||||
7BD8F7740E65E89800034DE9 /* string16.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7BD8F7730E65E89800034DE9 /* string16.cc */; };
|
||||
7BF164F30E660CA500AA999E /* platform_thread_mac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7BF164F20E660CA500AA999E /* platform_thread_mac.mm */; };
|
||||
7BF1658D0E663B4800AA999E /* worker_pool_mac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7BF1658B0E663B3500AA999E /* worker_pool_mac.mm */; };
|
||||
7BF1658E0E663B4A00AA999E /* worker_pool_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7BF1658C0E663B3500AA999E /* worker_pool_unittest.cc */; };
|
||||
820EB4F70E3A613F009668FC /* string_piece.cc in Sources */ = {isa = PBXBuildFile; fileRef = 820EB4F50E3A613F009668FC /* string_piece.cc */; };
|
||||
820EB4FA0E3A6178009668FC /* string_util_icu.cc in Sources */ = {isa = PBXBuildFile; fileRef = 820EB4F90E3A6178009668FC /* string_util_icu.cc */; };
|
||||
820EB5020E3A618B009668FC /* tracked.cc in Sources */ = {isa = PBXBuildFile; fileRef = 820EB4FE0E3A618B009668FC /* tracked.cc */; };
|
||||
@ -362,6 +364,10 @@
|
||||
7BEFC29C0D99832D000829AD /* lock_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock_impl.h; sourceTree = "<group>"; };
|
||||
7BEFC29D0D99832D000829AD /* lock_impl_posix.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lock_impl_posix.cc; sourceTree = "<group>"; };
|
||||
7BF164F20E660CA500AA999E /* platform_thread_mac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = platform_thread_mac.mm; sourceTree = "<group>"; };
|
||||
7BF165810E663AA800AA999E /* singleton_objc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = singleton_objc.h; sourceTree = "<group>"; };
|
||||
7BF1658A0E663B3500AA999E /* worker_pool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = worker_pool.h; sourceTree = "<group>"; };
|
||||
7BF1658B0E663B3500AA999E /* worker_pool_mac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = worker_pool_mac.mm; sourceTree = "<group>"; };
|
||||
7BF1658C0E663B3500AA999E /* worker_pool_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = worker_pool_unittest.cc; sourceTree = "<group>"; };
|
||||
820EB4EB0E3A60FE009668FC /* idle_timer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = idle_timer.cc; sourceTree = "<group>"; };
|
||||
820EB4EC0E3A60FE009668FC /* idle_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = idle_timer.h; sourceTree = "<group>"; };
|
||||
820EB4EF0E3A610A009668FC /* linked_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linked_ptr.h; sourceTree = "<group>"; };
|
||||
@ -831,6 +837,7 @@
|
||||
825403760D92D2CF0006B936 /* shared_memory.h */,
|
||||
824653730DC12D0E007C2BAA /* shared_memory_posix.cc */,
|
||||
7BD9E84E0DA447F800FC7A01 /* singleton.h */,
|
||||
7BF165810E663AA800AA999E /* singleton_objc.h */,
|
||||
E4AFA4BE0E50DE7400201347 /* singleton_unittest.cc */,
|
||||
BA73AA420E5F62F400A20026 /* spin_wait.h */,
|
||||
825403770D92D2CF0006B936 /* stack_container.h */,
|
||||
@ -888,6 +895,9 @@
|
||||
8254038E0D92D2CF0006B936 /* word_iterator.cc */,
|
||||
8254038F0D92D2CF0006B936 /* word_iterator.h */,
|
||||
E4AFA4CE0E50E0C500201347 /* word_iterator_unittest.cc */,
|
||||
7BF1658A0E663B3500AA999E /* worker_pool.h */,
|
||||
7BF1658B0E663B3500AA999E /* worker_pool_mac.mm */,
|
||||
7BF1658C0E663B3500AA999E /* worker_pool_unittest.cc */,
|
||||
);
|
||||
name = base;
|
||||
sourceTree = "<group>";
|
||||
@ -1218,6 +1228,7 @@
|
||||
ABF4B9C30DC2BD6C00A6E319 /* values.cc in Sources */,
|
||||
9301C03B0E54C839001EF103 /* waitable_event_generic.cc in Sources */,
|
||||
824655DD0DC659B8007C2BAA /* word_iterator.cc in Sources */,
|
||||
7BF1658D0E663B4800AA999E /* worker_pool_mac.mm in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -1279,6 +1290,7 @@
|
||||
7B78D3A30E54FE0100609465 /* values_unittest.cc in Sources */,
|
||||
7B78D3A40E54FE0100609465 /* waitable_event_unittest.cc in Sources */,
|
||||
7B78D3A50E54FE0100609465 /* word_iterator_unittest.cc in Sources */,
|
||||
7BF1658E0E663B4A00AA999E /* worker_pool_unittest.cc in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
60
base/singleton_objc.h
Normal file
60
base/singleton_objc.h
Normal file
@ -0,0 +1,60 @@
|
||||
// Copyright (c) 2008 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.
|
||||
|
||||
// Support for using the Singleton<T> pattern with Objective-C objects. A
|
||||
// SingletonObjC is the same as a Singleton, except the default traits are
|
||||
// appropriate for Objective-C objects. A typical Objective-C object of type
|
||||
// NSExampleType can be maintained as a singleton and accessed with:
|
||||
//
|
||||
// NSExampleType* exampleSingleton = SingletonObjC<NSExampleType>::get();
|
||||
//
|
||||
// The first time this is used, it will create exampleSingleton as the result
|
||||
// of [[NSExampleType alloc] init]. Subsequent calls will return the same
|
||||
// NSExampleType* object. The object will be released by calling
|
||||
// -[NSExampleType release] when Singleton's atexit routines run
|
||||
// (see singleton.h).
|
||||
//
|
||||
// For Objective-C objects initialized through means other than the
|
||||
// no-parameter -init selector, DefaultSingletonObjCTraits may be extended
|
||||
// as needed:
|
||||
//
|
||||
// struct FooSingletonTraits : public DefaultSingletonObjCTraits<Foo> {
|
||||
// static Foo* New() {
|
||||
// return [[Foo alloc] initWithName:@"selecty"];
|
||||
// }
|
||||
// }
|
||||
// ...
|
||||
// Foo* widgetSingleton = SingletonObjC<Foo, FooSingletonTraits>::get();
|
||||
|
||||
#ifndef BASE_SINGLETON_OBJC_H_
|
||||
#define BASE_SINGLETON_OBJC_H_
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#include "base/singleton.h"
|
||||
|
||||
// Singleton traits usable to manage traditional Objective-C objects, which
|
||||
// are instantiated by sending |alloc| and |init| messages, and are deallocated
|
||||
// in a memory-managed environment when their retain counts drop to 0 by
|
||||
// sending |release| messages.
|
||||
template<typename Type>
|
||||
struct DefaultSingletonObjCTraits : public DefaultSingletonTraits<Type> {
|
||||
static Type* New() {
|
||||
return [[Type alloc] init];
|
||||
}
|
||||
|
||||
static void Delete(Type* object) {
|
||||
[object release];
|
||||
}
|
||||
};
|
||||
|
||||
// Exactly like Singleton, but without the DefaultSingletonObjCTraits as the
|
||||
// default trait class. This makes it straightforward for Objective-C++ code
|
||||
// to hold Objective-C objects as singletons.
|
||||
template<typename Type,
|
||||
typename Traits = DefaultSingletonObjCTraits<Type>,
|
||||
typename DifferentiatingType = Type>
|
||||
class SingletonObjC : public Singleton<Type, Traits, DifferentiatingType> {
|
||||
};
|
||||
|
||||
#endif // BASE_SINGLETON_OBJC_H_
|
72
base/worker_pool_mac.mm
Normal file
72
base/worker_pool_mac.mm
Normal file
@ -0,0 +1,72 @@
|
||||
// Copyright (c) 2008 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/worker_pool.h"
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#include "base/logging.h"
|
||||
#import "base/singleton_objc.h"
|
||||
#include "base/task.h"
|
||||
|
||||
// TaskOperation adapts Task->Run() for use in an NSOperationQueue.
|
||||
@interface TaskOperation : NSOperation {
|
||||
@private
|
||||
Task* task_; // (strong)
|
||||
}
|
||||
|
||||
// Returns an autoreleased instance of TaskOperation. See -initWithTask: for
|
||||
// details.
|
||||
+ (id)taskOperationWithTask:(Task*)task;
|
||||
|
||||
// Designated initializer. |task| is adopted as the Task* whose Run method
|
||||
// this operation will call when executed.
|
||||
- (id)initWithTask:(Task*)task;
|
||||
|
||||
@end
|
||||
|
||||
@implementation TaskOperation
|
||||
|
||||
+ (id)taskOperationWithTask:(Task*)task {
|
||||
return [[[TaskOperation alloc] initWithTask:task] autorelease];
|
||||
}
|
||||
|
||||
- (id)init {
|
||||
return [self initWithTask:NULL];
|
||||
}
|
||||
|
||||
- (id)initWithTask:(Task*)task {
|
||||
if ((self = [super init])) {
|
||||
task_ = task;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)main {
|
||||
DCHECK(task_) << "-[TaskOperation main] called with no task";
|
||||
task_->Run();
|
||||
delete task_;
|
||||
task_ = NULL;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
DCHECK(!task_) << "-[TaskOperation dealloc] called on unused TaskOperation";
|
||||
delete task_;
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
bool WorkerPool::PostTask(const tracked_objects::Location& from_here,
|
||||
Task* task, bool task_is_slow) {
|
||||
// Ignore |task_is_slow|, it doesn't map directly to any tunable aspect of
|
||||
// an NSOperation.
|
||||
|
||||
task->SetBirthPlace(from_here);
|
||||
|
||||
NSOperationQueue* operation_queue = SingletonObjC<NSOperationQueue>::get();
|
||||
[operation_queue addOperation:[TaskOperation taskOperationWithTask:task]];
|
||||
|
||||
return true;
|
||||
}
|
@ -2,6 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "base/platform_test.h"
|
||||
#include "base/task.h"
|
||||
#include "base/waitable_event.h"
|
||||
#include "base/worker_pool.h"
|
||||
@ -9,6 +10,8 @@
|
||||
|
||||
using base::WaitableEvent;
|
||||
|
||||
typedef PlatformTest WorkerPoolTest;
|
||||
|
||||
namespace {
|
||||
|
||||
class PostTaskTestTask : public Task {
|
||||
@ -24,7 +27,7 @@ class PostTaskTestTask : public Task {
|
||||
WaitableEvent* event_;
|
||||
};
|
||||
|
||||
TEST(WorkerPoolTest, PostTask) {
|
||||
TEST_F(WorkerPoolTest, PostTask) {
|
||||
WaitableEvent test_event(false, false);
|
||||
WaitableEvent long_test_event(false, false);
|
||||
bool signaled;
|
||||
|
Reference in New Issue
Block a user