Skip to content

Commit

Permalink
flow::Semaphore for simple platform specific unnamed semaphores. (flu…
Browse files Browse the repository at this point in the history
  • Loading branch information
chinmaygarde authored Aug 17, 2016
1 parent d3c6ac1 commit 4eeaa07
Show file tree
Hide file tree
Showing 4 changed files with 175 additions and 0 deletions.
1 change: 1 addition & 0 deletions flow/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ source_set("flow") {
deps = [
"//flutter/glue",
"//flutter/skia",
"//flutter/synchronization",
"//lib/ftl",
"//mojo/services/gfx/composition/interfaces",
]
Expand Down
14 changes: 14 additions & 0 deletions synchronization/BUILD.gn
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# 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",
]
}
121 changes: 121 additions & 0 deletions synchronization/semaphore.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
// 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
39 changes: 39 additions & 0 deletions synchronization/semaphore.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// 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_

0 comments on commit 4eeaa07

Please sign in to comment.