core_manager.cc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include <sched.h>
  2. #include <linux/unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/syscall.h>
  5. #include <unistd.h>
  6. #include <limits.h>
  7. #include <algorithm>
  8. #include <vector>
  9. #include "core_manager.h"
  10. #include "core.h"
  11. #include "network.h"
  12. #include "cache.h"
  13. #include "config.h"
  14. #include "log.h"
  15. CoreManager::CoreManager()
  16. : m_core_tls(TLS::create())
  17. , m_thread_type_tls(TLS::create())
  18. , m_num_registered_sim_threads(0)
  19. , m_num_registered_core_threads(0)
  20. {
  21. LOG_PRINT("Starting CoreManager Constructor.");
  22. for (UInt32 i = 0; i < Config::getSingleton()->getTotalCores(); i++)
  23. {
  24. m_cores.push_back(new Core(i));
  25. }
  26. LOG_PRINT("Finished CoreManager Constructor.");
  27. }
  28. CoreManager::~CoreManager()
  29. {
  30. for (std::vector<Core *>::iterator i = m_cores.begin(); i != m_cores.end(); i++)
  31. delete *i;
  32. delete m_core_tls;
  33. delete m_thread_type_tls;
  34. }
  35. void CoreManager::initializeCommId(SInt32 comm_id)
  36. {
  37. LOG_PRINT("initializeCommId - current core (id) = %p (%d)", getCurrentCore(), getCurrentCoreID());
  38. core_id_t core_id = getCurrentCoreID();
  39. LOG_ASSERT_ERROR(core_id != INVALID_CORE_ID, "Unexpected invalid core id : %d", core_id);
  40. LOG_PRINT("Initializing comm_id: %d to core_id: %d", comm_id, core_id);
  41. // Broadcast this update to other processes
  42. Config::getSingleton()->updateCommToCoreMap(comm_id, core_id);
  43. LOG_PRINT("Finished.");
  44. }
  45. void CoreManager::initializeThread(core_id_t core_id)
  46. {
  47. m_core_tls->set(m_cores.at(core_id));
  48. m_thread_type_tls->setInt(APP_THREAD);
  49. LOG_PRINT("Initialize thread for core %p (%d)", m_cores.at(core_id), m_cores.at(core_id)->getId());
  50. LOG_ASSERT_ERROR(m_core_tls->get() == (void*)(m_cores.at(core_id)),
  51. "TLS appears to be broken. %p != %p", m_core_tls->get(), (void*)(m_cores.at(core_id)));
  52. }
  53. void CoreManager::terminateThread()
  54. {
  55. LOG_ASSERT_WARNING(m_core_tls->get() != NULL, "Thread not initialized while terminating.");
  56. m_core_tls->set(NULL);
  57. }
  58. Core *CoreManager::getCoreFromID(core_id_t id)
  59. {
  60. LOG_ASSERT_ERROR(id < (core_id_t)Config::getSingleton()->getTotalCores(), "Illegal index in getCoreFromID!");
  61. return m_cores.at(id);
  62. }
  63. core_id_t CoreManager::registerSimThread(ThreadType type)
  64. {
  65. if (getCurrentCore() != NULL)
  66. {
  67. LOG_PRINT_ERROR("registerSimMemThread - Initialized thread twice");
  68. return getCurrentCore()->getId();
  69. }
  70. ScopedLock sl(m_num_registered_threads_lock);
  71. UInt32 *num_registered_threads = NULL;
  72. if (type == SIM_THREAD)
  73. num_registered_threads = &m_num_registered_sim_threads;
  74. else if (type == CORE_THREAD)
  75. num_registered_threads = &m_num_registered_core_threads;
  76. else
  77. LOG_ASSERT_ERROR(false, "Unknown thread type %d", type);
  78. LOG_ASSERT_ERROR(*num_registered_threads < Config::getSingleton()->getTotalCores(),
  79. "All sim threads already registered. %d > %d",
  80. *num_registered_threads+1, Config::getSingleton()->getTotalCores());
  81. Core *core = m_cores.at(*num_registered_threads);
  82. m_core_tls->set(core);
  83. m_thread_type_tls->setInt(type);
  84. ++(*num_registered_threads);
  85. return core->getId();
  86. }
  87. bool CoreManager::amiSimThread()
  88. {
  89. return m_thread_type_tls->getInt() == SIM_THREAD;
  90. }
  91. bool CoreManager::amiCoreThread()
  92. {
  93. return m_thread_type_tls->getInt() == CORE_THREAD;
  94. }
  95. bool CoreManager::amiUserThread()
  96. {
  97. return m_thread_type_tls->getInt() == APP_THREAD;
  98. }