Restructure O1 module to run as a thread in O-DU High binary [Issue-Id: ODUHIGH-297]
[o-du/l2.git] / src / o1 / Thread.cpp
diff --git a/src/o1/Thread.cpp b/src/o1/Thread.cpp
new file mode 100644 (file)
index 0000000..266c21b
--- /dev/null
@@ -0,0 +1,222 @@
+/*******************************************************************************
+################################################################################
+#   Copyright (c) [2020-2021] [HCL Technologies Ltd.]                          #
+#                                                                              #
+#   Licensed under the Apache License, Version 2.0 (the "License");            #
+#   you may not use this file except in compliance with the License.           #
+#   You may obtain a copy of the License at                                    #
+#                                                                              #
+#       http://www.apache.org/licenses/LICENSE-2.0                             #
+#                                                                              #
+#   Unless required by applicable law or agreed to in writing, software        #
+#   distributed under the License is distributed on an "AS IS" BASIS,          #
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
+#   See the License for the specific language governing permissions and        #
+#   limitations under the License.                                             #
+################################################################################
+*******************************************************************************/
+
+/* This file contains class for launching and managing POSIX threads */
+
+#include "Thread.hpp"
+#include "GlobalDefs.hpp"
+#include <stdio.h>
+#include <unistd.h>
+
+/*******************************************************************
+ *
+ * @brief Constructor
+ *
+ * @details
+ *
+ *    Function : Thread
+ *
+ *    Functionality:
+ *      - Constructor intialization
+ *
+ * @params[in] None
+ * @return None
+ ******************************************************************/
+
+Thread::Thread(): mThreadId(0)
+{
+
+}
+
+/*******************************************************************
+ *
+ * @brief Destructor
+ *
+ * @details
+ *
+ *    Function : ~Thread
+ *
+ *    Functionality:
+ *      - Destructor
+ *
+ * @params[in] None
+ * @return None
+ ******************************************************************/
+
+Thread::~Thread() 
+{
+   
+}
+
+/*******************************************************************
+ *
+ * @brief Static function registered to run as pthread
+
+ *
+ * @details
+ *
+ *    Function : task
+ *
+ *    Functionality:
+ *      - Static function registered to run as pthread. It calls
+ *        the run function that is implemented by the derived
+ *        class instance.
+ *
+ * @params[in] void pointer to the base class instance that 
+               implements this Thread class
+ * @return void
+ ******************************************************************/
+
+void* Thread::task(void* args)
+{
+   Thread* thisPtr = static_cast<Thread*>(args);
+   thisPtr->run();
+}
+
+
+/*******************************************************************
+ *
+ * @brief Creates a thread
+ *
+ * @details
+ *
+ *    Function : start
+ *
+ *    Functionality:
+ *      - Starts a pthread registering the "task" function for
+ *        performing the thread task.
+ *
+ * @params[in] void
+ * @return true  : success
+ *         false : failure
+ ******************************************************************/
+
+bool Thread::start()
+{
+   return (pthread_create(&mThreadId, NULL, task, this) == 0);
+}
+
+
+/*******************************************************************
+ *
+ * @brief Stops the thread
+ *
+ * @details
+ *
+ *    Function : stop
+ *
+ *    Functionality:
+ *      - Stops the thread. Performs an clean ups prior to
+ *        stopping the thread
+ *
+ *
+ * @params[in] void
+ * @return true  : success
+ *         false : failure
+ ******************************************************************/
+bool Thread::stop()
+{
+   cleanUp();
+   return (pthread_cancel(mThreadId) == 0);
+}
+
+/*******************************************************************
+ *
+ * @brief  Wait for the thread to complete 
+ *
+ * @details
+ *
+ *    Function : join
+ *
+ *    Functionality:
+ *      - Waits for the thread to complete in the calling process/
+ *        thread
+ *
+ * @params[in] void
+ * @return true  : success
+ *         false : failure
+ ******************************************************************/
+bool Thread::join()
+{
+   return (pthread_join(mThreadId,NULL) == 0);
+}
+
+
+/*******************************************************************
+ *
+ * @brief  Set the affinity of the thread
+ *
+ * @details
+ *
+ *    Function : setAffinity
+ *
+ *    Functionality:
+ *      - Pins the thread to cpu core(s)
+ *
+ * @params[in] CPU cores
+ * @return true  : success
+ *         false : failure
+ ******************************************************************/
+bool Thread::setAffinity(int coreNum)
+{
+   int ret;
+   cpu_set_t cpuset;
+   long nCores = sysconf(_SC_NPROCESSORS_ONLN);
+
+   CPU_ZERO(&cpuset);
+   CPU_SET(coreNum%nCores, &cpuset);
+   ret = pthread_setaffinity_np(mThreadId, sizeof(cpu_set_t), &cpuset);
+   if (ret != 0)
+   {
+       return false;
+   }
+   return true;  
+}
+
+/*******************************************************************
+ *
+ * @brief  Print the affinity of the thread
+ *
+ * @details
+ *
+ *    Function : printAffinity
+ *
+ *    Functionality:
+ *      - Prints the cpu core(s) the thread is pinned to
+ *
+ * @params[in] void
+ * @return true  : success
+ *         false : failure
+ ******************************************************************/
+bool Thread::printAffinity()
+{
+   int ret;
+   long nCores = sysconf(_SC_NPROCESSORS_ONLN);
+
+   cpu_set_t cpuset;
+   CPU_ZERO(&cpuset);
+
+   ret = pthread_getaffinity_np(mThreadId, sizeof(cpu_set_t), &cpuset);
+   if (ret != 0)
+       return false;
+
+   for (int i = 0; i < nCores; i++)
+       if (CPU_ISSET(i, &cpuset))
+           O1_LOG("CPU %d ", i);
+   return true;
+}