Don't use Pthread in EventBase
authorChristopher Dykes <cdykes@fb.com>
Mon, 16 Jan 2017 01:46:24 +0000 (17:46 -0800)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Mon, 16 Jan 2017 01:48:03 +0000 (17:48 -0800)
Summary:
Pthread is currently a dependency of Folly that is not really necessary on Windows, or even with standard C++ for the most part, so start work on killing it in Folly.
This switches EventBase to using `std::thread::id`'s instead, which also means we aren't reliant on the implementation detail that thread id 0 is invalid. Well, we are, but it's now the standard library's fault not ours.

Reviewed By: yfeldblum

Differential Revision: D4418128

fbshipit-source-id: a9c95ac6c7305c960156a4ad684b6db89b5856d9

folly/io/async/EventBase.cpp
folly/io/async/EventBase.h

index febf227e5b14cb1916d6c8ff377352021fb6bcba..31cec0bfd5e787aeee4fc121df2a1b66e3117b8d 100644 (file)
@@ -27,7 +27,6 @@
 #include <condition_variable>
 #include <fcntl.h>
 #include <mutex>
-#include <pthread.h>
 
 namespace folly {
 
@@ -271,7 +270,7 @@ bool EventBase::loopBody(int flags) {
   std::chrono::microseconds busy;
   std::chrono::microseconds idle;
 
-  loopThread_.store(pthread_self(), std::memory_order_release);
+  loopThread_.store(std::this_thread::get_id(), std::memory_order_release);
 
   if (!name_.empty()) {
     setThreadName(name_);
index 955fab02703a66541cb62de38cce5d2daa39a161..8bfb684d281fae24cb24ef7ca0153e14e5512b33 100644 (file)
@@ -466,7 +466,7 @@ class EventBase : private boost::noncopyable,
     * check if the event base loop is running.
    */
   bool isRunning() const {
-    return loopThread_.load(std::memory_order_relaxed) != 0;
+    return loopThread_.load(std::memory_order_relaxed) != std::thread::id();
   }
 
   /**
@@ -484,12 +484,12 @@ class EventBase : private boost::noncopyable,
    */
   bool isInEventBaseThread() const {
     auto tid = loopThread_.load(std::memory_order_relaxed);
-    return tid == 0 || pthread_equal(tid, pthread_self());
+    return tid == std::thread::id() || tid == std::this_thread::get_id();
   }
 
   bool inRunningEventBaseThread() const {
-    return pthread_equal(
-      loopThread_.load(std::memory_order_relaxed), pthread_self());
+    return loopThread_.load(std::memory_order_relaxed) ==
+        std::this_thread::get_id();
   }
 
   HHWheelTimer& timer() {
@@ -685,11 +685,8 @@ class EventBase : private boost::noncopyable,
   std::atomic<bool> stop_;
 
   // The ID of the thread running the main loop.
-  // 0 if loop is not running.
-  // Note: POSIX doesn't guarantee that 0 is an invalid pthread_t (or
-  // even that atomic<pthread_t> is valid), but that's how it is
-  // everywhere (at least on Linux, FreeBSD, and OSX).
-  std::atomic<pthread_t> loopThread_;
+  // std::thread::id{} if loop is not running.
+  std::atomic<std::thread::id> loopThread_;
 
   // pointer to underlying event_base class doing the heavy lifting
   event_base* evb_;