Annotation of nono/lib/mythread.cpp, revision 1.1.1.3

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.