Arquivos
chromium/base/worker_pool_mac.mm
mmentovai@google.com bc9bfa52bf WorkerPool implementation for Mac, using NSOperationQueue
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@1493 0039d316-1c4b-4281-b951-d872f2087c98
2008-08-28 17:40:59 +00:00

73 linhas
1.7 KiB
Plaintext

// 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;
}