• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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