use LifoSem instead of sem_t for ManualExecutor
authorHans Fugal <fugalh@fb.com>
Thu, 11 Jun 2015 18:52:33 +0000 (11:52 -0700)
committerSara Golemon <sgolemon@fb.com>
Thu, 11 Jun 2015 20:15:13 +0000 (13:15 -0700)
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
folly/futures/ManualExecutor.h

index 8dcd5f12649f0622ab54e6ad6e04a5dac892e781..9a0d1e7ba47ae79063adf142f7cf862ff80ba45f 100644 (file)
 
 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<std::mutex> 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();
   }
 }
 
index cfb65ff0cf8b98701797bf40cc2b831a9bd94729..afdf059743e2e9aa9d0c4c04fcac90a7e48c606b 100644 (file)
@@ -15,9 +15,9 @@
  */
 
 #pragma once
+#include <folly/LifoSem.h>
 #include <folly/futures/DrivableExecutor.h>
 #include <folly/futures/ScheduledExecutor.h>
-#include <semaphore.h>
 #include <memory>
 #include <mutex>
 #include <queue>
@@ -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<std::mutex> 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<Func> funcs_;
-    sem_t sem_;
+    LifoSem sem_;
 
     // helper class to enable ordering of scheduled events in the priority
     // queue