| Index: runtime/bin/thread_pool_macos.cc
|
| diff --git a/runtime/bin/thread_pool_macos.cc b/runtime/bin/thread_pool_macos.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..962bb0bfbd23264b05a6f0c93cea220bab79a480
|
| --- /dev/null
|
| +++ b/runtime/bin/thread_pool_macos.cc
|
| @@ -0,0 +1,67 @@
|
| +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +#include <pthread.h>
|
| +
|
| +#include "bin/thread_pool.h"
|
| +
|
| +TaskQueue::TaskQueue() : head_(NULL), tail_(NULL) {
|
| + int result;
|
| +
|
| + result = pthread_mutex_init(data_.mutex(), NULL);
|
| + if (result != 0) {
|
| + FATAL("pthread_mutex_init failed");
|
| + }
|
| +
|
| + result = pthread_cond_init(data_.cond(), NULL);
|
| + if (result != 0) {
|
| + FATAL("pthread_cond_init failed");
|
| + }
|
| +}
|
| +
|
| +
|
| +void TaskQueue::Insert(TaskQueueEntry* entry) {
|
| + pthread_mutex_lock(data_.mutex());
|
| + if (head_ == NULL) {
|
| + head_ = entry;
|
| + tail_ = entry;
|
| + pthread_cond_signal(data_.cond());
|
| + } else {
|
| + tail_->set_next(entry);
|
| + tail_ = entry;
|
| + }
|
| + pthread_mutex_unlock(data_.mutex());
|
| +}
|
| +
|
| +
|
| +TaskQueueEntry* TaskQueue::Remove() {
|
| + pthread_mutex_lock(data_.mutex());
|
| + TaskQueueEntry* result = head_;
|
| + while (result == NULL) {
|
| + pthread_cond_wait(data_.cond(), data_.mutex());
|
| + result = head_;
|
| + }
|
| + head_ = result->next();
|
| + ASSERT(head_ != NULL || tail_ == result);
|
| + pthread_mutex_unlock(data_.mutex());
|
| + return result;
|
| +}
|
| +
|
| +
|
| +void ThreadPool::Start() {
|
| + pthread_t* threads
|
| + = reinterpret_cast<pthread_t*>(calloc(size_, sizeof(pthread_t*)));
|
| + data_.set_threads(threads);
|
| + for (int i = 0; i < size_; i++) {
|
| + pthread_t handler_thread;
|
| + int result = pthread_create(&handler_thread,
|
| + NULL,
|
| + &ThreadPool::Main,
|
| + this);
|
| + if (result != 0) {
|
| + FATAL("Create and start thread pool thread");
|
| + }
|
| + data_.threads()[i] = handler_thread;
|
| + }
|
| +}
|
|
|