scheduler_pinned_base.h 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #ifndef __SCHEDULER_PINNED_BASE_H
  2. #define __SCHEDULER_PINNED_BASE_H
  3. #include "scheduler_dynamic.h"
  4. #include "simulator.h"
  5. class SchedulerPinnedBase : public SchedulerDynamic
  6. {
  7. public:
  8. SchedulerPinnedBase(ThreadManager *thread_manager, SubsecondTime quantum);
  9. virtual core_id_t threadCreate(thread_id_t);
  10. virtual void threadYield(thread_id_t thread_id);
  11. virtual bool threadSetAffinity(thread_id_t calling_thread_id, thread_id_t thread_id, size_t cpusetsize, const cpu_set_t *mask);
  12. virtual bool threadGetAffinity(thread_id_t thread_id, size_t cpusetsize, cpu_set_t *mask);
  13. virtual void periodic(SubsecondTime time);
  14. virtual void threadStart(thread_id_t thread_id, SubsecondTime time);
  15. virtual void threadStall(thread_id_t thread_id, ThreadManager::stall_type_t reason, SubsecondTime time);
  16. virtual void threadResume(thread_id_t thread_id, thread_id_t thread_by, SubsecondTime time);
  17. virtual void threadExit(thread_id_t thread_id, SubsecondTime time);
  18. protected:
  19. class ThreadInfo
  20. {
  21. public:
  22. ThreadInfo()
  23. : m_has_affinity(false)
  24. , m_explicit_affinity(false)
  25. , m_core_affinity(Sim()->getConfig()->getApplicationCores(), false)
  26. , m_core_running(INVALID_CORE_ID)
  27. , m_last_scheduled_in(SubsecondTime::Zero())
  28. , m_last_scheduled_out(SubsecondTime::Zero())
  29. {}
  30. /* affinity */
  31. void clearAffinity()
  32. {
  33. for(auto it = m_core_affinity.begin(); it != m_core_affinity.end(); ++it)
  34. *it = false;
  35. }
  36. void setAffinitySingle(core_id_t core_id)
  37. {
  38. clearAffinity();
  39. addAffinity(core_id);
  40. }
  41. void addAffinity(core_id_t core_id) { m_core_affinity[core_id] = true; m_has_affinity = true; }
  42. bool hasAffinity(core_id_t core_id) const { return m_core_affinity[core_id]; }
  43. String getAffinityString() const;
  44. /* running on core */
  45. bool hasAffinity() const { return m_has_affinity; }
  46. bool hasExplicitAffinity() const { return m_explicit_affinity; }
  47. void setExplicitAffinity() { m_explicit_affinity = true; }
  48. void setCoreRunning(core_id_t core_id) { m_core_running = core_id; }
  49. core_id_t getCoreRunning() const { return m_core_running; }
  50. bool isRunning() const { return m_core_running != INVALID_CORE_ID; }
  51. /* last scheduled */
  52. void setLastScheduledIn(SubsecondTime time) { m_last_scheduled_in = time; }
  53. void setLastScheduledOut(SubsecondTime time) { m_last_scheduled_out = time; }
  54. SubsecondTime getLastScheduledIn() const { return m_last_scheduled_in; }
  55. SubsecondTime getLastScheduledOut() const { return m_last_scheduled_out; }
  56. private:
  57. bool m_has_affinity;
  58. bool m_explicit_affinity;
  59. std::vector<bool> m_core_affinity;
  60. core_id_t m_core_running;
  61. SubsecondTime m_last_scheduled_in;
  62. SubsecondTime m_last_scheduled_out;
  63. };
  64. // Configuration
  65. const SubsecondTime m_quantum;
  66. // Global state
  67. SubsecondTime m_last_periodic;
  68. // Keyed by thread_id
  69. std::vector<ThreadInfo> m_thread_info;
  70. // Keyed by core_id
  71. std::vector<thread_id_t> m_core_thread_running;
  72. std::vector<SubsecondTime> m_quantum_left;
  73. virtual void threadSetInitialAffinity(thread_id_t thread_id) = 0;
  74. core_id_t findFreeCoreForThread(thread_id_t thread_id);
  75. void reschedule(SubsecondTime time, core_id_t core_id, bool is_periodic);
  76. void printState();
  77. };
  78. #endif // __SCHEDULER_PINNED_BASE_H