1 1.1.1.2 mrg Project description 2 1.1.1.2 mrg ------------------- 3 1.1.1.2 mrg 4 1.1.1.2 mrg Currently the project provides only a pkg-config [.pc] file, pthread-stubs.pc. 5 1.1.1.2 mrg The latter contains the Cflags/Libs flags applicable to programs/libraries 6 1.1.1.2 mrg that use only lightweight pthread API. See the next sections for the reasoning 7 1.1.1.2 mrg and implementation details. 8 1.1.1.2 mrg 9 1.1.1.2 mrg Historically this project used to provide either: 10 1.1.1.2 mrg - a .pc file, when the C runtime was providing the pthread symbols 11 1.1.1.2 mrg or 12 1.1.1.2 mrg - a .pc file and a library which implements weak stubs for the pthread symbols, 13 1.1.1.2 mrg which are not available in the C runtime. 14 1.1.1.2 mrg 15 1.1.1.2 mrg Since then, the latter case was found to have a fundamental design issue. 16 1.1.1.2 mrg 17 1.1.1.2 mrg 18 1.1.1.2 mrg Design 19 1.1.1.2 mrg ------ 20 1.1.1.2 mrg 21 1.1.1.2 mrg On platforms where the lightweight pthread symbols are provided by the runtime, 22 1.1.1.2 mrg the .pc files provides empty Cflags/Libs flags. 23 1.1.1.2 mrg 24 1.1.1.2 mrg Currently the following platforms fit the above category: 25 1.1.1.2 mrg - GNU/Linux - GCC/Clang/GLibC/Musl 26 1.1.1.2 mrg - Solaris 10 and later 27 1.1.1.2 mrg - Cygwin 28 1.1.1.2 mrg - GNU/Hurd 29 1.1.1.2 mrg - GNU/kFreeBSD 30 1.1.1.2 mrg 31 1.1.1.2 mrg For others, each of Cflags/Libs expands to full blown pthread. 32 1.1.1.2 mrg 33 1.1.1.2 mrg For example: 34 1.1.1.2 mrg - FreeBSD and derivatives 35 1.1.1.2 mrg - OpenBSD - uses a heavily patched copy of pthread-stubs to workaround this 36 1.1.1.2 mrg - other BSD platforms ? 37 1.1.1.2 mrg 38 1.1.1.2 mrg Unchecked: 39 1.1.1.2 mrg - MSYS/MINGW 40 1.1.1.2 mrg - Darwin - GCC/Clang - should be the same as their Linux counter part 41 1.1.1.2 mrg 42 1.1.1.2 mrg 43 1.1.1.2 mrg Many platforms have their own eccentric way of managing pthread compilation and 44 1.1.1.2 mrg linkage. The ones realistically supported by pthread-stubs [and projects that 45 1.1.1.2 mrg depend on it] work with '-pthread'. 46 1.1.1.2 mrg 47 1.1.1.2 mrg GCC supports -pthread for: 48 1.1.1.2 mrg Aarch64, ARM, Darwin, IA-64, MIPS, PowerPC, SPARC, x86 49 1.1.1.2 mrg Cygwin and x86 Windows may need a trivial patch for older GCC versions. 50 1.1.1.2 mrg See SVN rev 214161 and 171833/171834 respectively. 51 1.1.1.2 mrg 52 1.1.1.2 mrg 53 1.1.1.2 mrg Clang: 54 1.1.1.2 mrg Aarch64, ARM, x86 and likely others. 55 1.1.1.2 mrg 56 1.1.1.2 mrg SunCC/Oracle compiler: 57 1.1.1.2 mrg Requires -mt -lpthread. As of Solaris 10 (oldest currently supported version) 58 1.1.1.2 mrg all the pthread API lives in libc. Thus we'll _never_ get here. 59 1.1.1.2 mrg 60 1.1.1.2 mrg 61 1.1.1.2 mrg With previous design, one could get mismatched calls to the pthreads API. 62 1.1.1.2 mrg Consider the following scenario: 63 1.1.1.2 mrg - Program and/or its dependencies links only against libpthread-stubs, 64 1.1.1.2 mrg since it uses lightweight API. Say pthread_mutex_lock. 65 1.1.1.2 mrg - At a later stage the program and/or its dependencies dlopens a library 66 1.1.1.2 mrg which effectively [either directly or via any of its own dependencies] pulls a 67 1.1.1.2 mrg full blown pthread. Let's call that libB. 68 1.1.1.2 mrg - The libpthread-stubs weak symbols get overridden by the libB ones. 69 1.1.1.2 mrg - pthread_mutex_unlock is executed (which now originates from libB) and BOOM. 70 1.1.1.2 mrg 71 1.1.1.2 mrg Amount and severity of issues depend on a number of factors. In either case 72 1.1.1.2 mrg things go horribly wrong sooner on later. 73 1.1.1.2 mrg 74 1.1.1.2 mrg 75 1.1.1.2 mrg The symbols 76 1.1.1.2 mrg ----------- 77 1.1.1.2 mrg 78 1.1.1.2 mrg The following list of symbols is taken from the libc provided by GLibC. 79 1.1.1.2 mrg 80 1.1.1.2 mrg It is deemed sufficient and reasonably accurate of what the 'lightweight' 81 1.1.1.2 mrg pthread symbols are, since GLibC is one of the few (the only) implementations 82 1.1.1.2 mrg which has the distinct split. 83 1.1.1.2 mrg 84 1.1.1.2 mrg Most/all other C runtime implementations provide all the pthread API in a 85 1.1.1.2 mrg single library. 86 1.1.1.2 mrg 87 1.1.1.2 mrg Note that the following list is incomplete wrt libc-2.24.so and that further 88 1.1.1.2 mrg symbols may be added in the future to bring the two closer. Adding symbols 89 1.1.1.2 mrg which are not available in GLibC libc is NOT allowed. 90 1.1.1.2 mrg 91 1.1.1.2 mrg pthread_condattr_destroy 92 1.1.1.2 mrg pthread_condattr_init 93 1.1.1.2 mrg pthread_cond_broadcast 94 1.1.1.2 mrg pthread_cond_destroy 95 1.1.1.2 mrg pthread_cond_init 96 1.1.1.2 mrg pthread_cond_signal 97 1.1.1.2 mrg pthread_cond_timedwait 98 1.1.1.2 mrg pthread_cond_wait 99 1.1.1.2 mrg pthread_equal 100 1.1.1.2 mrg pthread_exit 101 1.1.1.2 mrg pthread_mutex_destroy 102 1.1.1.2 mrg pthread_mutex_init 103 1.1.1.2 mrg pthread_mutex_lock 104 1.1.1.2 mrg pthread_mutex_unlock 105 1.1.1.2 mrg pthread_self 106