1// Copyright (c) 2008 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/worker_pool_mac.h" 6 7#include "base/logging.h" 8#import "base/scoped_nsautorelease_pool.h" 9#include "base/scoped_ptr.h" 10#import "base/singleton_objc.h" 11#include "base/task.h" 12 13@implementation WorkerPoolObjC 14 15+ (NSOperationQueue*)sharedOperationQueue { 16 return SingletonObjC<NSOperationQueue>::get(); 17} 18 19@end // @implementation WorkerPoolObjC 20 21// TaskOperation adapts Task->Run() for use in an NSOperationQueue. 22@interface TaskOperation : NSOperation { 23 @private 24 scoped_ptr<Task> task_; 25} 26 27// Returns an autoreleased instance of TaskOperation. See -initWithTask: for 28// details. 29+ (id)taskOperationWithTask:(Task*)task; 30 31// Designated initializer. |task| is adopted as the Task* whose Run method 32// this operation will call when executed. 33- (id)initWithTask:(Task*)task; 34 35@end // @interface TaskOperation 36 37@implementation TaskOperation 38 39+ (id)taskOperationWithTask:(Task*)task { 40 return [[[TaskOperation alloc] initWithTask:task] autorelease]; 41} 42 43- (id)init { 44 return [self initWithTask:NULL]; 45} 46 47- (id)initWithTask:(Task*)task { 48 if ((self = [super init])) { 49 task_.reset(task); 50 } 51 return self; 52} 53 54- (void)main { 55 DCHECK(task_.get()) << "-[TaskOperation main] called with no task"; 56 if (!task_.get()) { 57 return; 58 } 59 60 base::ScopedNSAutoreleasePool autoreleasePool; 61 62 task_->Run(); 63 task_.reset(NULL); 64} 65 66- (void)dealloc { 67 DCHECK(!task_.get()) 68 << "-[TaskOperation dealloc] called without running task"; 69 70 [super dealloc]; 71} 72 73@end // @implementation TaskOperation 74 75bool WorkerPool::PostTask(const tracked_objects::Location& from_here, 76 Task* task, bool task_is_slow) { 77 // Ignore |task_is_slow|, it doesn't map directly to any tunable aspect of 78 // an NSOperation. 79 80 DCHECK(task) << "WorkerPool::PostTask called with no task"; 81 if (!task) { 82 return false; 83 } 84 85 task->SetBirthPlace(from_here); 86 87 NSOperationQueue* operation_queue = [WorkerPoolObjC sharedOperationQueue]; 88 [operation_queue addOperation:[TaskOperation taskOperationWithTask:task]]; 89 90 return true; 91} 92