mirror of
https://github.com/encounter/engine.git
synced 2026-03-30 11:09:55 -07:00
21ad7f051c
This makes room for the Dart runner at //flutter/shell/platform/fuchsia/dart.
104 lines
2.0 KiB
C++
104 lines
2.0 KiB
C++
// Copyright 2013 The Flutter 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 "thread.h"
|
|
|
|
#include <limits.h>
|
|
#include <unistd.h>
|
|
|
|
#include <algorithm>
|
|
|
|
#include <lib/async-loop/cpp/loop.h>
|
|
|
|
#include "flutter/fml/logging.h"
|
|
#include "loop.h"
|
|
|
|
namespace flutter_runner {
|
|
|
|
typedef void (*ThreadEntry)(Thread*);
|
|
|
|
namespace {
|
|
|
|
size_t NextPageSizeMultiple(size_t size) {
|
|
const size_t page_size = sysconf(_SC_PAGE_SIZE);
|
|
FML_CHECK(page_size != 0);
|
|
|
|
size = std::max<size_t>(size, page_size);
|
|
|
|
size_t rem = size % page_size;
|
|
|
|
if (rem == 0) {
|
|
return size;
|
|
}
|
|
|
|
return size + page_size - rem;
|
|
}
|
|
|
|
bool CreateThread(pthread_t* thread,
|
|
ThreadEntry main,
|
|
Thread* argument,
|
|
size_t stack_size) {
|
|
pthread_attr_t thread_attributes;
|
|
|
|
if (pthread_attr_init(&thread_attributes) != 0) {
|
|
return false;
|
|
}
|
|
|
|
stack_size = std::max<size_t>(NextPageSizeMultiple(PTHREAD_STACK_MIN),
|
|
NextPageSizeMultiple(stack_size));
|
|
|
|
if (pthread_attr_setstacksize(&thread_attributes, stack_size) != 0) {
|
|
return false;
|
|
}
|
|
|
|
auto result =
|
|
pthread_create(thread, &thread_attributes,
|
|
reinterpret_cast<void* (*)(void*)>(main), argument);
|
|
|
|
pthread_attr_destroy(&thread_attributes);
|
|
|
|
return result == 0;
|
|
}
|
|
|
|
} // anonymous namespace
|
|
|
|
Thread::Thread() {
|
|
loop_.reset(MakeObservableLoop(false));
|
|
valid_ = CreateThread(
|
|
&thread_, [](Thread* thread) { thread->Main(); }, this, 1 << 20);
|
|
}
|
|
|
|
Thread::~Thread() {
|
|
Join();
|
|
}
|
|
|
|
bool Thread::IsValid() const {
|
|
return valid_;
|
|
}
|
|
|
|
async_dispatcher_t* Thread::dispatcher() const {
|
|
return loop_->dispatcher();
|
|
}
|
|
|
|
void Thread::Main() {
|
|
async_set_default_dispatcher(loop_->dispatcher());
|
|
loop_->Run();
|
|
}
|
|
|
|
void Thread::Quit() {
|
|
loop_->Quit();
|
|
}
|
|
|
|
bool Thread::Join() {
|
|
if (!valid_) {
|
|
return false;
|
|
}
|
|
|
|
bool result = pthread_join(thread_, nullptr) == 0;
|
|
valid_ = false;
|
|
return result;
|
|
}
|
|
|
|
} // namespace flutter_runner
|