[libcamera-devel] [PATCH 1/2] libcamera: thread: Add a method to return the ID of the current thread

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sat Jan 18 22:33:47 CET 2020


The current thread ID is useful when logging message to debug
concurrency issues. Add a method to retrieve it.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/libcamera/include/thread.h |  2 ++
 src/libcamera/thread.cpp       | 20 ++++++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/src/libcamera/include/thread.h b/src/libcamera/include/thread.h
index 37edd4f5138b..819a9879ac56 100644
--- a/src/libcamera/include/thread.h
+++ b/src/libcamera/include/thread.h
@@ -9,6 +9,7 @@
 
 #include <memory>
 #include <mutex>
+#include <sys/types.h>
 #include <thread>
 
 #include <libcamera/signal.h>
@@ -39,6 +40,7 @@ public:
 	Signal<Thread *> finished;
 
 	static Thread *current();
+	static pid_t currentId();
 
 	EventDispatcher *eventDispatcher();
 	void setEventDispatcher(std::unique_ptr<EventDispatcher> dispatcher);
diff --git a/src/libcamera/thread.cpp b/src/libcamera/thread.cpp
index 18ebd16a7e2f..fe32cd677596 100644
--- a/src/libcamera/thread.cpp
+++ b/src/libcamera/thread.cpp
@@ -9,6 +9,9 @@
 
 #include <atomic>
 #include <list>
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
 
 #include <libcamera/event_dispatcher.h>
 
@@ -62,6 +65,7 @@ private:
 
 	Thread *thread_;
 	bool running_;
+	pid_t tid_;
 
 	Mutex mutex_;
 
@@ -108,6 +112,7 @@ ThreadData *ThreadData::current()
 	 * started, set it here.
 	 */
 	ThreadData *data = mainThread.data_;
+	data->tid_ = syscall(SYS_gettid);
 	currentThreadData = data;
 	return data;
 }
@@ -189,6 +194,7 @@ void Thread::startThread()
 	 */
 	thread_local ThreadCleaner cleaner(this, &Thread::finishThread);
 
+	data_->tid_ = syscall(SYS_gettid);
 	currentThreadData = data_;
 
 	run();
@@ -308,6 +314,20 @@ Thread *Thread::current()
 	return data->thread_;
 }
 
+/**
+ * \brief Retrieve the ID of the current thread
+ *
+ * The thread ID corresponds to the Linux thread ID (TID) as returned by the
+ * gettid system call.
+ *
+ * \return The ID of the current thread
+ */
+pid_t Thread::currentId()
+{
+	ThreadData *data = ThreadData::current();
+	return data->tid_;
+}
+
 /**
  * \brief Set the event dispatcher
  * \param[in] dispatcher Pointer to the event dispatcher
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list