summaryrefslogtreecommitdiff
path: root/src/thread/thread_pthread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/thread/thread_pthread.cpp')
-rw-r--r--src/thread/thread_pthread.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/thread/thread_pthread.cpp b/src/thread/thread_pthread.cpp
index ce407fd94..747b8943d 100644
--- a/src/thread/thread_pthread.cpp
+++ b/src/thread/thread_pthread.cpp
@@ -25,16 +25,18 @@ private:
OTTDThreadFunc proc; ///< External thread procedure.
void *param; ///< Parameter for the external thread procedure.
bool self_destruct; ///< Free ourselves when done?
+ const char *name; ///< Name for the thread
public:
/**
* Create a pthread and start it, calling proc(param).
*/
- ThreadObject_pthread(OTTDThreadFunc proc, void *param, bool self_destruct) :
+ ThreadObject_pthread(OTTDThreadFunc proc, void *param, bool self_destruct, const char *name) :
thread(0),
proc(proc),
param(param),
- self_destruct(self_destruct)
+ self_destruct(self_destruct),
+ name(name)
{
pthread_create(&this->thread, NULL, &stThreadProc, this);
}
@@ -60,7 +62,15 @@ private:
*/
static void *stThreadProc(void *thr)
{
- ((ThreadObject_pthread *)thr)->ThreadProc();
+ ThreadObject_pthread *self = (ThreadObject_pthread *) thr;
+#if defined(__GLIBC__)
+#if __GLIBC_PREREQ(2, 12)
+ if (self->name) {
+ pthread_setname_np(pthread_self(), self->name);
+ }
+#endif
+#endif
+ self->ThreadProc();
pthread_exit(NULL);
}
@@ -85,9 +95,9 @@ private:
}
};
-/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread)
+/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread, const char *name)
{
- ThreadObject *to = new ThreadObject_pthread(proc, param, thread == NULL);
+ ThreadObject *to = new ThreadObject_pthread(proc, param, thread == NULL, name);
if (thread != NULL) *thread = to;
return true;
}