Revision: 55020
http://brlcad.svn.sourceforge.net/brlcad/?rev=55020&view=rev
Author: brlcad
Date: 2013-04-03 05:27:26 +0000 (Wed, 03 Apr 2013)
Log Message:
-----------
add initial support for getting/setting the cpu number via thread local storage
(TLS) for pthreads
Modified Paths:
--------------
brlcad/trunk/src/libbu/thread.cpp
Modified: brlcad/trunk/src/libbu/thread.cpp
===================================================================
--- brlcad/trunk/src/libbu/thread.cpp 2013-04-03 05:14:34 UTC (rev 55019)
+++ brlcad/trunk/src/libbu/thread.cpp 2013-04-03 05:27:26 UTC (rev 55020)
@@ -20,22 +20,82 @@
#include "common.h"
-//static boost::thread_specific_ptr<int> thread_cpu;
-//__thread int thread_cpu;
-//__declspec(thread) int thread_cpu;
+#include <vector>
+#ifdef HAVE_PTHREAD_H
+# include <pthread.h>
+#endif
+
+
+template<typename T>
+class ThreadLocal
+{
+private:
+#ifdef HAVE_PTHREAD_H
+ pthread_key_t key;
+#endif
+ std::vector<T*> vals;
+public:
+ ThreadLocal() {
+#ifdef HAVE_PTHREAD_H
+ pthread_key_create(&key, NULL);
+#endif
+ }
+ ~ThreadLocal() {
+#ifdef HAVE_PTHREAD_H
+ pthread_key_delete(key);
+#endif
+ while (!vals.empty()) {
+ delete vals.back();
+ vals.pop_back();
+ }
+ vals.clear();
+ }
+ ThreadLocal& operator=(T& val) {
+ T* value = new T(val);
+ vals.push_back(value);
+#ifdef HAVE_PTHREAD_H
+ pthread_setspecific(key, value);
+#endif
+ return *this;
+ }
+ bool operator!() {
+#ifdef HAVE_PTHREAD_H
+ return (pthread_getspecific(key) == NULL);
+#endif
+ }
+ operator T() {
+#ifdef HAVE_PTHREAD_H
+ return *static_cast<T*>(pthread_getspecific(key));
+#endif
+ }
+};
+
+
+#if defined(__cplusplus) && __cplusplus > 199711L
+// C++11 provides thread-local storage
+thread_local int thread_cpu = 0;
+#elif defined(HAVE___THREAD)
+__thread int thread_cpu = 0;
+#elif defined(_MSC_VER)
+__declspec(thread) int thread_cpu;
+#else
+ThreadLocal<int> thread_cpu;
+#endif
+
extern "C" {
void
-thread_set_cpu(int UNUSED(cpu))
+thread_set_cpu(int cpu)
{
+ thread_cpu = cpu;
}
int
thread_get_cpu(void)
{
- return 0;
+ return thread_cpu;
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Minimize network downtime and maximize team effectiveness.
Reduce network management and security costs.Learn how to hire
the most talented Cisco Certified professionals. Visit the
Employer Resources Portal
http://www.cisco.com/web/learning/employer_resources/index.html
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits