|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
1.1.1.3 ! root 7: //
1.1 root 8: // pthread の OS ごとに違う部分を吸収する
1.1.1.3 ! root 9: //
1.1 root 10:
11: #include "mythread.h"
12: #include <pthread.h>
13: #if defined(HAVE_PTHREAD_NP_H)
14: #include <pthread_np.h>
15: #endif
16:
17: // pthread_set{,_}name_np() のプロトタイプは OS によってみんなフリーダムなので
18: // (というか _np は Non Portable か Non Posix のことらしい?)、
19: // ここで吸収する。
20: //
21: // MacOSX は void pthread_setname_np(name)
22: // Linux は int pthread_setname_np(threadID, name)
23: // NetBSD は int pthread_setname_np(threadID, name, arg)
24: // OpenBSD は void pthread_set_name_np(threadID, name)
25: // FreeBSD は void pthread_set_name_np(threadID, name)
26: // (2020/06 以降は pthread_setname_np(threadID, name) も追加)
1.1.1.3 ! root 27: //
! 28: // 戻り値を返す Linux と NetBSD は、いずれも正常なら 0、失敗ならエラーコード
! 29: // を返す、としているので、ここでもそれを返す。
! 30: int
1.1 root 31: PTHREAD_SETNAME(const char *name)
32: {
1.1.1.2 root 33: #if defined(__linux__)
34: // Linux (Ubuntu 20.04) の top はスレッド名があればそれだけ表示するらしい。
35: // スレッド名 "Main" がプロセス名なしに表示されても何のことか分からないので
36: // プロセス名を入れておきたい。
37: // 一方 NetBSD の top ではプロセス名とスレッド名は欄が別なので(そして狭い)
38: // ここにプロセス名は入れたくない。ので、Linux の時だけに分離する。
39: // 他の OS はしらん。
1.1.1.3 ! root 40: // Linux の setname は '\0' 込みで 16バイト。
! 41: char buf[16];
1.1.1.2 root 42:
43: snprintf(buf, sizeof(buf), "nono:%s", name);
44: name = buf;
45: #endif
46:
1.1 root 47: #if defined(HAVE_PTHREAD_SETNAME_NP_name)
48: pthread_setname_np(name);
49:
50: #elif defined(HAVE_PTHREAD_SETNAME_NP_th_name)
1.1.1.3 ! root 51: # if defined(__linux__)
! 52: // Linux には戻り値がある
! 53: return pthread_setname_np(pthread_self(), name);
! 54: # else
1.1 root 55: pthread_setname_np(pthread_self(), name);
1.1.1.3 ! root 56: # endif
1.1 root 57:
58: #elif defined(HAVE_PTHREAD_SETNAME_NP_th_name_arg)
1.1.1.3 ! root 59: # if defined(__NetBSD__)
! 60: // NetBSD には戻り値がある
! 61: return pthread_setname_np(pthread_self(), name, NULL);
! 62: # else
1.1 root 63: pthread_setname_np(pthread_self(), name, NULL);
1.1.1.3 ! root 64: # endif
1.1 root 65:
66: #elif defined(HAVE_PTHREAD_SET_NAME_NP_th_name)
67: pthread_set_name_np(pthread_self(), name);
68:
69: #else
70: // デバッガとかでスレッドに名前がついてると嬉しいという程度なので、
71: // なければ気にしない。
72: #endif
1.1.1.3 ! root 73:
! 74: return 0;
! 75: }
! 76:
! 77: // pthread_get{,_}name_np() の OS ごとの違いを吸収して、
! 78: // 指定のスレッドの名前を std::string で返す。
! 79: std::string
! 80: PTHREAD_GETNAME(pthread_t thread)
! 81: {
! 82: char name[32];
! 83:
! 84: name[0] = '\0';
! 85:
! 86: #if defined(HAVE_PTHREAD_GETNAME_NP)
! 87: pthread_getname_np(thread, name, sizeof(name));
! 88:
! 89: #elif defined(HAVE_PTHREAD_GET_NAME_NP)
! 90: pthread_get_name_np(thread, name, sizeof(name));
! 91:
! 92: #else
! 93: #error pthread_getname
! 94: // なければ気にしない
! 95: #endif
! 96:
! 97: return std::string(name);
1.1 root 98: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.