1#
2# SRT - Secure, Reliable, Transport
3# Copyright (c) 2021 Haivision Systems Inc.
4#
5# This Source Code Form is subject to the terms of the Mozilla Public
6# License, v. 2.0. If a copy of the MPL was not distributed with this
7# file, You can obtain one at http://mozilla.org/MPL/2.0/.
8#
9
10# Check for pthread_getname_np(3) and pthread_setname_np(3)
11#    used in srtcore/threadname.h.
12#
13# Some BSD distros need to include <pthread_np.h> for pthread_getname_np().
14#
15# TODO: Some BSD distros have pthread_get_name_np() and pthread_set_name_np()
16#     instead of pthread_getname_np() and pthread_setname_np().
17#
18# Sets:
19#     HAVE_PTHREAD_GETNAME_NP_IN_PTHREAD_NP_H
20#     HAVE_PTHREAD_SETNAME_NP_IN_PTHREAD_NP_H
21#     HAVE_PTHREAD_GETNAME_NP
22#     HAVE_PTHREAD_SETNAME_NP
23# Sets as appropriate:
24#     add_definitions(-DHAVE_PTHREAD_GETNAME_NP_IN_PTHREAD_NP_H=1)
25#     add_definitions(-DHAVE_PTHREAD_SETNAME_NP_IN_PTHREAD_NP_H=1)
26#     add_definitions(-DHAVE_PTHREAD_GETNAME_NP=1)
27#     add_definitions(-DHAVE_PTHREAD_SETNAME_NP=1)
28
29include(CheckSymbolExists)
30
31function(FindPThreadGetSetName)
32
33   unset(HAVE_PTHREAD_GETNAME_NP_IN_PTHREAD_NP_H CACHE)
34   unset(HAVE_PTHREAD_SETNAME_NP_IN_PTHREAD_NP_H CACHE)
35   unset(HAVE_PTHREAD_GETNAME_NP CACHE)
36   unset(HAVE_PTHREAD_SETNAME_NP CACHE)
37
38   set(CMAKE_REQUIRED_DEFINITIONS
39      -D_GNU_SOURCE -D_DARWIN_C_SOURCE -D_POSIX_SOURCE=1)
40   set(CMAKE_REQUIRED_FLAGS "-pthread")
41
42   message(STATUS "Checking for pthread_(g/s)etname_np in 'pthread_np.h':")
43   check_symbol_exists(
44      pthread_getname_np "pthread_np.h" HAVE_PTHREAD_GETNAME_NP_IN_PTHREAD_NP_H)
45   if (HAVE_PTHREAD_GETNAME_NP_IN_PTHREAD_NP_H)
46      add_definitions(-DHAVE_PTHREAD_GETNAME_NP_IN_PTHREAD_NP_H=1)
47   endif()
48   check_symbol_exists(
49      pthread_setname_np "pthread_np.h" HAVE_PTHREAD_SETNAME_NP_IN_PTHREAD_NP_H)
50   if (HAVE_PTHREAD_SETNAME_NP_IN_PTHREAD_NP_H)
51      add_definitions(-DHAVE_PTHREAD_SETNAME_NP_IN_PTHREAD_NP_H=1)
52   endif()
53
54   message(STATUS "Checking for pthread_(g/s)etname_np in 'pthread.h':")
55   check_symbol_exists(pthread_getname_np "pthread.h" HAVE_PTHREAD_GETNAME_NP)
56   if (HAVE_PTHREAD_GETNAME_NP_IN_PTHREAD_NP_H)
57      set(HAVE_PTHREAD_GETNAME_NP 1 CACHE INTERNAL "" FORCE)
58   endif()
59   check_symbol_exists(pthread_setname_np "pthread.h" HAVE_PTHREAD_SETNAME_NP)
60   if (HAVE_PTHREAD_SETNAME_NP_IN_PTHREAD_NP_H)
61      set(HAVE_PTHREAD_SETNAME_NP 1 CACHE INTERNAL "" FORCE)
62   endif()
63   if (HAVE_PTHREAD_GETNAME_NP)
64      add_definitions(-DHAVE_PTHREAD_GETNAME_NP=1)
65   endif()
66   if (HAVE_PTHREAD_SETNAME_NP)
67      add_definitions(-DHAVE_PTHREAD_SETNAME_NP=1)
68   endif()
69
70   unset(CMAKE_REQUIRED_DEFINITIONS)
71   unset(CMAKE_REQUIRED_FLAGS)
72
73endfunction(FindPThreadGetSetName)
74