--- nono/lib/mythread.cpp 2026/04/29 17:04:54 1.1.1.2 +++ nono/lib/mythread.cpp 2026/04/29 17:05:08 1.1.1.3 @@ -4,7 +4,9 @@ // Licensed under nono-license.txt // +// // pthread の OS ごとに違う部分を吸収する +// #include "mythread.h" #include @@ -22,7 +24,10 @@ // OpenBSD は void pthread_set_name_np(threadID, name) // FreeBSD は void pthread_set_name_np(threadID, name) // (2020/06 以降は pthread_setname_np(threadID, name) も追加) -void +// +// 戻り値を返す Linux と NetBSD は、いずれも正常なら 0、失敗ならエラーコード +// を返す、としているので、ここでもそれを返す。 +int PTHREAD_SETNAME(const char *name) { #if defined(__linux__) @@ -32,7 +37,8 @@ PTHREAD_SETNAME(const char *name) // 一方 NetBSD の top ではプロセス名とスレッド名は欄が別なので(そして狭い) // ここにプロセス名は入れたくない。ので、Linux の時だけに分離する。 // 他の OS はしらん。 - char buf[32]; + // Linux の setname は '\0' 込みで 16バイト。 + char buf[16]; snprintf(buf, sizeof(buf), "nono:%s", name); name = buf; @@ -42,10 +48,20 @@ PTHREAD_SETNAME(const char *name) pthread_setname_np(name); #elif defined(HAVE_PTHREAD_SETNAME_NP_th_name) +# if defined(__linux__) + // Linux には戻り値がある + return pthread_setname_np(pthread_self(), name); +# else pthread_setname_np(pthread_self(), name); +# endif #elif defined(HAVE_PTHREAD_SETNAME_NP_th_name_arg) +# if defined(__NetBSD__) + // NetBSD には戻り値がある + return pthread_setname_np(pthread_self(), name, NULL); +# else pthread_setname_np(pthread_self(), name, NULL); +# endif #elif defined(HAVE_PTHREAD_SET_NAME_NP_th_name) pthread_set_name_np(pthread_self(), name); @@ -54,4 +70,29 @@ PTHREAD_SETNAME(const char *name) // デバッガとかでスレッドに名前がついてると嬉しいという程度なので、 // なければ気にしない。 #endif + + return 0; +} + +// pthread_get{,_}name_np() の OS ごとの違いを吸収して、 +// 指定のスレッドの名前を std::string で返す。 +std::string +PTHREAD_GETNAME(pthread_t thread) +{ + char name[32]; + + name[0] = '\0'; + +#if defined(HAVE_PTHREAD_GETNAME_NP) + pthread_getname_np(thread, name, sizeof(name)); + +#elif defined(HAVE_PTHREAD_GET_NAME_NP) + pthread_get_name_np(thread, name, sizeof(name)); + +#else +#error pthread_getname + // なければ気にしない +#endif + + return std::string(name); }