lichao
2021-05-10 77a6c3512a44dfe6540dde71946e6484fe4f173f
src/bh_util.h
@@ -18,6 +18,7 @@
#ifndef BH_UTIL_SOXWOK67
#define BH_UTIL_SOXWOK67
#include "macro.h"
#include <functional>
#include <mutex>
#include <stdint.h>
@@ -123,13 +124,13 @@
   D &operator*() const { return *p_; }
};
template <class T, class Mutex = std::mutex, class Lock = std::unique_lock<Mutex>>
template <class T, class TMutex = std::mutex, class Lock = std::unique_lock<TMutex>>
class Synced
{
   typedef T Data;
   Mutex mutex_;
   TMutex mutex_;
   Data data_;
   typedef SyncedPtr<Data, Mutex, Lock> Ptr;
   typedef SyncedPtr<Data, TMutex, Lock> Ptr;
public:
   template <class... P>
@@ -143,12 +144,29 @@
   }
};
// macro helper
#define JOIN_IMPL(a, b) a##b
#define JOIN(a, b) JOIN_IMPL(a, b)
// defer function / lambda.
#define DEFERF(func) ExitCall JOIN(defer_, __LINE__)(func)
// defer simple expression
#define DEFER1(expr) DEFERF([&]() { expr; })
template <class T, class Tag>
class StaticDataRef
{
   typedef T *Ptr;
   static inline Ptr &ptr()
   {
      static Ptr sp(nullptr);
      return sp;
   }
protected:
   static inline T &GetData()
   {
      if (!ptr()) { throw std::string("Must set ShmMsg shm before use!"); }
      return *ptr();
   }
public:
   static bool SetData(T &t)
   {
      auto Bind = [&]() { ptr() = &t; return true; };
      return ptr() ? false : Bind();
   }
};
#endif /* end of include guard: BH_UTIL_SOXWOK67 */