From f58b11823cfb994c351722ce130f28f794db2c0e Mon Sep 17 00:00:00 2001 From: Hans Fugal Date: Thu, 11 Jun 2015 11:52:33 -0700 Subject: [PATCH] use LifoSem instead of sem_t for ManualExecutor Summary: OSX apparently knows better than all of us plebes, and got rid of anonymous semaphores. Rather than try to work around that directly, I just switched to folly::LifoSem, which seems like a not-terrible idea anyway. Reviewed By: @jsedgwick Differential Revision: D2143566 --- folly/futures/ManualExecutor.cpp | 18 +++--------------- folly/futures/ManualExecutor.h | 8 +++----- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/folly/futures/ManualExecutor.cpp b/folly/futures/ManualExecutor.cpp index 8dcd5f12..9a0d1e7b 100644 --- a/folly/futures/ManualExecutor.cpp +++ b/folly/futures/ManualExecutor.cpp @@ -24,16 +24,10 @@ namespace folly { -ManualExecutor::ManualExecutor() { - if (sem_init(&sem_, 0, 0) == -1) { - throw std::runtime_error(std::string("sem_init: ") + strerror(errno)); - } -} - void ManualExecutor::add(Func callback) { std::lock_guard lock(lock_); funcs_.push(std::move(callback)); - sem_post(&sem_); + sem_.post(); } size_t ManualExecutor::run() { @@ -65,7 +59,7 @@ size_t ManualExecutor::run() { // Balance the semaphore so it doesn't grow without bound // if nobody is calling wait(). // This may fail (with EAGAIN), that's fine. - sem_trywait(&sem_); + sem_.tryWait(); func = std::move(funcs_.front()); funcs_.pop(); @@ -84,13 +78,7 @@ void ManualExecutor::wait() { break; } - auto ret = sem_wait(&sem_); - if (ret == 0) { - break; - } - if (errno != EINVAL) { - throw std::runtime_error(std::string("sem_wait: ") + strerror(errno)); - } + sem_.wait(); } } diff --git a/folly/futures/ManualExecutor.h b/folly/futures/ManualExecutor.h index cfb65ff0..afdf0597 100644 --- a/folly/futures/ManualExecutor.h +++ b/folly/futures/ManualExecutor.h @@ -15,9 +15,9 @@ */ #pragma once +#include #include #include -#include #include #include #include @@ -35,8 +35,6 @@ namespace folly { class ManualExecutor : public DrivableExecutor, public ScheduledExecutor { public: - ManualExecutor(); - void add(Func) override; /// Do work. Returns the number of functions that were executed (maybe 0). @@ -78,7 +76,7 @@ namespace folly { virtual void scheduleAt(Func&& f, TimePoint const& t) override { std::lock_guard lock(lock_); scheduledFuncs_.emplace(t, std::move(f)); - sem_post(&sem_); + sem_.post(); } /// Advance the clock. The clock never advances on its own. @@ -98,7 +96,7 @@ namespace folly { private: std::mutex lock_; std::queue funcs_; - sem_t sem_; + LifoSem sem_; // helper class to enable ordering of scheduled events in the priority // queue -- 2.34.1