提交 4eeaa074 编写于 作者: C Chinmay Garde 提交者: GitHub

flow::Semaphore for simple platform specific unnamed semaphores. (#2937)

上级 d3c6ac11
...@@ -46,6 +46,7 @@ source_set("flow") { ...@@ -46,6 +46,7 @@ source_set("flow") {
deps = [ deps = [
"//flutter/glue", "//flutter/glue",
"//flutter/skia", "//flutter/skia",
"//flutter/synchronization",
"//lib/ftl", "//lib/ftl",
"//mojo/services/gfx/composition/interfaces", "//mojo/services/gfx/composition/interfaces",
] ]
......
# Copyright 2016 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.
source_set("synchronization") {
sources = [
"semaphore.cc",
"semaphore.h",
]
deps = [
"//lib/ftl",
]
}
// Copyright 2016 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 "flutter/synchronization/semaphore.h"
#include "lib/ftl/build_config.h"
#include "lib/ftl/logging.h"
#if OS_MACOSX
#include <dispatch/dispatch.h>
namespace flutter {
class PlatformSemaphore {
public:
explicit PlatformSemaphore(uint32_t count)
: _sem(dispatch_semaphore_create(count)) {}
~PlatformSemaphore() {
if (_sem != nullptr) {
dispatch_release(reinterpret_cast<dispatch_object_t>(_sem));
_sem = nullptr;
}
}
bool IsValid() const { return _sem != nullptr; }
bool TryWait() {
if (_sem == nullptr) {
return false;
}
return dispatch_semaphore_wait(_sem, DISPATCH_TIME_NOW) == 0;
}
void Signal() {
if (_sem != nullptr) {
dispatch_semaphore_signal(_sem);
}
}
private:
dispatch_semaphore_t _sem;
FTL_DISALLOW_COPY_AND_ASSIGN(PlatformSemaphore);
};
} // namespace flutter
#else // OS_MACOSX
#include <semaphore.h>
#include "lib/ftl/files/eintr_wrapper.h"
namespace flutter {
class PlatformSemaphore {
public:
explicit PlatformSemaphore(uint32_t count)
: valid_(::sem_init(&sem_, 0 /* not shared */, count) == 0) {}
~PlatformSemaphore() {
if (valid_) {
int result = ::sem_destroy(&sem_);
// Can only be EINVAL which should not be possible since we checked for
// validity.
FTL_DCHECK(result == 0);
}
}
bool IsValid() const { return valid_; }
bool TryWait() {
if (!valid_) {
return false;
}
return HANDLE_EINTR(::sem_trywait(&sem_)) == 0;
}
void Signal() {
if (!valid_) {
return;
}
::sem_post(&sem_);
return;
}
private:
bool valid_;
sem_t sem_;
FTL_DISALLOW_COPY_AND_ASSIGN(PlatformSemaphore);
};
} // namespace flutter
#endif
namespace flutter {
Semaphore::Semaphore(uint32_t count) : _impl(new PlatformSemaphore(count)) {}
Semaphore::~Semaphore() = default;
bool Semaphore::IsValid() const {
return _impl->IsValid();
}
bool Semaphore::TryWait() {
return _impl->TryWait();
}
void Semaphore::Signal() {
return _impl->Signal();
}
} // namespace flutter
// Copyright 2016 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.
#ifndef SYNCHRONIZATION_SEMAPHORE_H_
#define SYNCHRONIZATION_SEMAPHORE_H_
#include <memory>
#include "lib/ftl/macros.h"
#include "lib/ftl/time/time_delta.h"
#include "lib/ftl/compiler_specific.h"
namespace flutter {
class PlatformSemaphore;
class Semaphore {
public:
explicit Semaphore(uint32_t count);
~Semaphore();
bool IsValid() const;
FTL_WARN_UNUSED_RESULT
bool TryWait();
void Signal();
private:
std::unique_ptr<PlatformSemaphore> _impl;
FTL_DISALLOW_COPY_AND_ASSIGN(Semaphore);
};
} // namespace flutter
#endif // SYNCHRONIZATION_SEMAPHORE_H_
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册