blob: e650f3a003da11bd9704e9ac24b999b32798f208 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/task/thread_pool/thread_group_native_mac.h"
#include "base/files/file_descriptor_watcher_posix.h"
#include "base/check.h"
#include "base/task/thread_pool/task_tracker.h"
namespace base {
namespace internal {
ThreadGroupNativeMac::ThreadGroupNativeMac(
ThreadType thread_type_hint,
scoped_refptr<SingleThreadTaskRunner> io_thread_task_runner,
TrackedRef<TaskTracker> task_tracker,
TrackedRef<Delegate> delegate,
ThreadGroup* predecessor_thread_group)
: ThreadGroupNative(std::move(task_tracker),
std::move(delegate),
predecessor_thread_group),
thread_type_hint_(thread_type_hint),
io_thread_task_runner_(std::move(io_thread_task_runner)) {
// The thread group only support kNormal or kBackground type.
DCHECK(thread_type_hint_ == ThreadType::kDefault ||
thread_type_hint_ == ThreadType::kBackground);
DCHECK(io_thread_task_runner_);
}
ThreadGroupNativeMac::~ThreadGroupNativeMac() {}
void ThreadGroupNativeMac::StartImpl() {
dispatch_queue_attr_t attributes = dispatch_queue_attr_make_with_qos_class(
DISPATCH_QUEUE_CONCURRENT,
thread_type_hint_ == ThreadType::kDefault ? QOS_CLASS_USER_INITIATED
: QOS_CLASS_BACKGROUND,
/*relative_priority=*/-1);
queue_.reset(dispatch_queue_create("org.chromium.base.ThreadPool.ThreadGroup",
attributes));
group_.reset(dispatch_group_create());
}
void ThreadGroupNativeMac::JoinImpl() {
dispatch_group_wait(group_, DISPATCH_TIME_FOREVER);
}
void ThreadGroupNativeMac::SubmitWork() {
dispatch_group_async(group_, queue_, ^{
FileDescriptorWatcher file_descriptor_watcher(io_thread_task_runner_);
RunNextTaskSourceImpl();
});
}
} // namespace internal
} // namespace base