barrier_sync_server.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #ifndef __BARRIER_SYNC_SERVER_H__
  2. #define __BARRIER_SYNC_SERVER_H__
  3. #include "fixed_types.h"
  4. #include "cond.h"
  5. #include "hooks_manager.h"
  6. #include <vector>
  7. class CoreManager;
  8. class BarrierSyncServer : public ClockSkewMinimizationServer
  9. {
  10. private:
  11. SubsecondTime m_barrier_interval;
  12. SubsecondTime m_next_barrier_time;
  13. std::vector<SubsecondTime> m_local_clock_list;
  14. std::vector<bool> m_barrier_acquire_list;
  15. std::vector<ConditionVariable*> m_core_cond;
  16. std::vector<core_id_t> m_to_release;
  17. std::vector<core_id_t> m_core_group;
  18. std::vector<thread_id_t> m_core_thread;
  19. SubsecondTime m_global_time;
  20. bool m_fastforward;
  21. volatile bool m_disable;
  22. bool isBarrierReached(void);
  23. bool barrierRelease(thread_id_t thread_id = INVALID_THREAD_ID, bool continue_until_release = false);
  24. void abortBarrier(void);
  25. bool isCoreRunning(core_id_t core_id, bool siblings = true);
  26. void releaseThread(thread_id_t thread_id);
  27. void signal();
  28. void doRelease(int n);
  29. static SInt64 hookThreadExit(UInt64 object, UInt64 argument) {
  30. ((BarrierSyncServer*)object)->threadExit((HooksManager::ThreadTime*)argument); return 0;
  31. }
  32. static SInt64 hookThreadStall(UInt64 object, UInt64 argument) {
  33. ((BarrierSyncServer*)object)->threadStall((HooksManager::ThreadStall*)argument); return 0;
  34. }
  35. static SInt64 hookThreadMigrate(UInt64 object, UInt64 argument) {
  36. ((BarrierSyncServer*)object)->threadMigrate((HooksManager::ThreadMigrate*)argument); return 0;
  37. }
  38. void threadExit(HooksManager::ThreadTime *argument);
  39. void threadStall(HooksManager::ThreadStall *argument);
  40. void threadMigrate(HooksManager::ThreadMigrate *argument);
  41. public:
  42. BarrierSyncServer();
  43. ~BarrierSyncServer();
  44. virtual void setDisable(bool disable);
  45. virtual void setGroup(core_id_t core_id, core_id_t master_core_id);
  46. void synchronize(core_id_t core_id, SubsecondTime time);
  47. void release() { abortBarrier(); }
  48. void advance();
  49. void setFastForward(bool fastforward, SubsecondTime next_barrier_time = SubsecondTime::MaxTime());
  50. SubsecondTime getGlobalTime(bool upper_bound = false) { return upper_bound ? m_next_barrier_time : m_global_time; }
  51. void setBarrierInterval(SubsecondTime barrier_interval) { m_barrier_interval = barrier_interval; }
  52. SubsecondTime getBarrierInterval() const { return m_barrier_interval; }
  53. void printState(void);
  54. };
  55. #endif /* __BARRIER_SYNC_SERVER_H__ */