@@ -974,6 +974,138 @@ class libnoexit(Library):
974974 src_files = ['atexit_dummy.c' ]
975975
976976
977+ class libpthread (MuslInternalLibrary ,
978+ DebugLibrary ,
979+ AsanInstrumentedLibrary ):
980+ name = 'libpthread'
981+ # See libc
982+ cflags = ['-Os' , '-fno-inline-functions' , '-fno-builtin' ]
983+ cflags += ['-Wno-unused-but-set-variable' ,
984+ '-Wno-unused-variable' ,
985+ '-Wno-shift-op-parentheses' ,
986+ '-Wno-unused-label' ,
987+ '-Wno-logical-op-parentheses' ,
988+ '-Wno-bitwise-op-parentheses' ]
989+
990+ def __init__ (self , ** kwargs ):
991+ self .is_stub = kwargs .pop ('stub' )
992+ super ().__init__ (** kwargs )
993+
994+ def get_cflags (self ):
995+ cflags = super ().get_cflags ()
996+ if not self .is_stub :
997+ cflags += ['-pthread' ]
998+ return cflags
999+
1000+ def get_base_name (self ):
1001+ name = super ().get_base_name ()
1002+ if self .is_stub :
1003+ name += '-stub'
1004+ return name
1005+
1006+ @classmethod
1007+ def vary_on (cls ):
1008+ return super ().vary_on () + ['stub' ]
1009+
1010+ @classmethod
1011+ def get_default_variation (cls , ** kwargs ):
1012+ return super ().get_default_variation (stub = not settings .PTHREADS , ** kwargs )
1013+
1014+ def get_files (self ):
1015+ files = files_in_path (
1016+ path = 'system/lib/pthread' ,
1017+ filenames = ['thread_profiler.c' ])
1018+
1019+ if self .is_stub :
1020+ # Include just a subset of the thread directory
1021+ files += files_in_path (
1022+ path = 'system/lib/libc/musl/src/thread' ,
1023+ filenames = [
1024+ 'pthread_self.c' ,
1025+ 'pthread_cleanup_push.c' ,
1026+ 'pthread_attr_init.c' ,
1027+ 'pthread_attr_destroy.c' ,
1028+ 'pthread_attr_get.c' ,
1029+ 'pthread_attr_setdetachstate.c' ,
1030+ 'pthread_attr_setguardsize.c' ,
1031+ 'pthread_attr_setinheritsched.c' ,
1032+ 'pthread_attr_setschedparam.c' ,
1033+ 'pthread_attr_setschedpolicy.c' ,
1034+ 'pthread_attr_setscope.c' ,
1035+ 'pthread_attr_setstack.c' ,
1036+ 'pthread_attr_setstacksize.c' ,
1037+ 'pthread_getconcurrency.c' ,
1038+ 'pthread_getcpuclockid.c' ,
1039+ 'pthread_getschedparam.c' ,
1040+ 'pthread_setschedprio.c' ,
1041+ 'pthread_setconcurrency.c' ,
1042+ 'default_attr.c' ,
1043+ # C11 thread library functions
1044+ 'call_once.c' ,
1045+ 'tss_create.c' ,
1046+ 'tss_delete.c' ,
1047+ 'tss_set.c' ,
1048+ 'cnd_broadcast.c' ,
1049+ 'cnd_destroy.c' ,
1050+ 'cnd_init.c' ,
1051+ 'cnd_signal.c' ,
1052+ 'cnd_timedwait.c' ,
1053+ 'cnd_wait.c' ,
1054+ 'mtx_destroy.c' ,
1055+ 'mtx_init.c' ,
1056+ 'mtx_lock.c' ,
1057+ 'mtx_timedlock.c' ,
1058+ 'mtx_trylock.c' ,
1059+ 'mtx_unlock.c' ,
1060+ 'thrd_create.c' ,
1061+ 'thrd_exit.c' ,
1062+ 'thrd_join.c' ,
1063+ 'thrd_sleep.c' ,
1064+ 'thrd_yield.c' ,
1065+ ])
1066+ files += files_in_path (
1067+ path = 'system/lib/pthread' ,
1068+ filenames = [
1069+ 'library_pthread_stub.c' ,
1070+ 'pthread_self_stub.c' ,
1071+ 'proxying_stub.c' ,
1072+ ])
1073+ else :
1074+ files += glob_in_path (
1075+ path = 'system/lib/libc/musl/src/thread' ,
1076+ glob_pattern = '*.c' ,
1077+ excludes = [
1078+ 'clone.c' ,
1079+ 'pthread_create.c' ,
1080+ 'pthread_kill.c' , 'pthread_sigmask.c' ,
1081+ '__set_thread_area.c' , 'synccall.c' ,
1082+ '__syscall_cp.c' , '__tls_get_addr.c' ,
1083+ '__unmapself.c' ,
1084+ # Empty files, simply ignore them.
1085+ 'syscall_cp.c' , 'tls.c' ,
1086+ # TODO: Support these. See #12216.
1087+ 'pthread_setname_np.c' ,
1088+ 'pthread_getname_np.c' ,
1089+ ])
1090+ files += files_in_path (
1091+ path = 'system/lib/pthread' ,
1092+ filenames = [
1093+ 'library_pthread.c' ,
1094+ 'em_task_queue.c' ,
1095+ 'proxying.c' ,
1096+ 'proxying_legacy.c' ,
1097+ 'thread_mailbox.c' ,
1098+ 'pthread_create.c' ,
1099+ 'pthread_kill.c' ,
1100+ 'emscripten_thread_init.c' ,
1101+ 'emscripten_thread_state.S' ,
1102+ 'emscripten_futex_wait.c' ,
1103+ 'emscripten_futex_wake.c' ,
1104+ 'emscripten_yield.c' ,
1105+ ])
1106+ return files
1107+
1108+
9771109class libc (MuslInternalLibrary ,
9781110 DebugLibrary ,
9791111 AsanInstrumentedLibrary ,
@@ -1087,7 +1219,7 @@ def get_files(self):
10871219 ignore = [
10881220 'ipc' , 'passwd' , 'signal' , 'sched' , 'time' , 'linux' ,
10891221 'aio' , 'exit' , 'legacy' , 'mq' , 'setjmp' ,
1090- 'ldso' , 'malloc'
1222+ 'ldso' , 'malloc' , 'thread'
10911223 ]
10921224
10931225 # individual files
@@ -1110,91 +1242,6 @@ def get_files(self):
11101242
11111243 ignore += LIBC_SOCKETS
11121244
1113- if self .is_mt :
1114- ignore += [
1115- 'clone.c' ,
1116- 'pthread_create.c' ,
1117- 'pthread_kill.c' , 'pthread_sigmask.c' ,
1118- '__set_thread_area.c' , 'synccall.c' ,
1119- '__syscall_cp.c' , '__tls_get_addr.c' ,
1120- '__unmapself.c' ,
1121- # Empty files, simply ignore them.
1122- 'syscall_cp.c' , 'tls.c' ,
1123- # TODO: Support these. See #12216.
1124- 'pthread_setname_np.c' ,
1125- 'pthread_getname_np.c' ,
1126- ]
1127- libc_files += files_in_path (
1128- path = 'system/lib/pthread' ,
1129- filenames = [
1130- 'library_pthread.c' ,
1131- 'em_task_queue.c' ,
1132- 'proxying.c' ,
1133- 'proxying_legacy.c' ,
1134- 'thread_mailbox.c' ,
1135- 'pthread_create.c' ,
1136- 'pthread_kill.c' ,
1137- 'emscripten_thread_init.c' ,
1138- 'emscripten_thread_state.S' ,
1139- 'emscripten_futex_wait.c' ,
1140- 'emscripten_futex_wake.c' ,
1141- 'emscripten_yield.c' ,
1142- ])
1143- else :
1144- ignore += ['thread' ]
1145- libc_files += files_in_path (
1146- path = 'system/lib/libc/musl/src/thread' ,
1147- filenames = [
1148- 'pthread_self.c' ,
1149- 'pthread_cleanup_push.c' ,
1150- 'pthread_attr_init.c' ,
1151- 'pthread_attr_destroy.c' ,
1152- 'pthread_attr_get.c' ,
1153- 'pthread_attr_setdetachstate.c' ,
1154- 'pthread_attr_setguardsize.c' ,
1155- 'pthread_attr_setinheritsched.c' ,
1156- 'pthread_attr_setschedparam.c' ,
1157- 'pthread_attr_setschedpolicy.c' ,
1158- 'pthread_attr_setscope.c' ,
1159- 'pthread_attr_setstack.c' ,
1160- 'pthread_attr_setstacksize.c' ,
1161- 'pthread_getconcurrency.c' ,
1162- 'pthread_getcpuclockid.c' ,
1163- 'pthread_getschedparam.c' ,
1164- 'pthread_setschedprio.c' ,
1165- 'pthread_setconcurrency.c' ,
1166- 'default_attr.c' ,
1167- # C11 thread library functions
1168- 'call_once.c' ,
1169- 'tss_create.c' ,
1170- 'tss_delete.c' ,
1171- 'tss_set.c' ,
1172- 'cnd_broadcast.c' ,
1173- 'cnd_destroy.c' ,
1174- 'cnd_init.c' ,
1175- 'cnd_signal.c' ,
1176- 'cnd_timedwait.c' ,
1177- 'cnd_wait.c' ,
1178- 'mtx_destroy.c' ,
1179- 'mtx_init.c' ,
1180- 'mtx_lock.c' ,
1181- 'mtx_timedlock.c' ,
1182- 'mtx_trylock.c' ,
1183- 'mtx_unlock.c' ,
1184- 'thrd_create.c' ,
1185- 'thrd_exit.c' ,
1186- 'thrd_join.c' ,
1187- 'thrd_sleep.c' ,
1188- 'thrd_yield.c' ,
1189- ])
1190- libc_files += files_in_path (
1191- path = 'system/lib/pthread' ,
1192- filenames = [
1193- 'library_pthread_stub.c' ,
1194- 'pthread_self_stub.c' ,
1195- 'proxying_stub.c' ,
1196- ])
1197-
11981245 # These files are in libc directories, but only built in libc_optz.
11991246 ignore += [
12001247 'pow_small.c' , 'log_small.c' , 'log2_small.c'
@@ -1305,10 +1352,6 @@ def get_files(self):
13051352 if settings .RELOCATABLE :
13061353 libc_files += files_in_path (path = 'system/lib/libc' , filenames = ['dynlink.c' ])
13071354
1308- libc_files += files_in_path (
1309- path = 'system/lib/pthread' ,
1310- filenames = ['thread_profiler.c' ])
1311-
13121355 libc_files += glob_in_path ('system/lib/libc/compat' , '*.c' )
13131356
13141357 # Check for missing file in non_lto_files list. Do this here
@@ -2369,6 +2412,7 @@ def add_sanitizer_libs():
23692412 if settings .ALLOW_UNIMPLEMENTED_SYSCALLS :
23702413 add_library ('libstubs' )
23712414 if '-nolibc' not in args :
2415+ add_library ('libpthread' )
23722416 if not settings .EXIT_RUNTIME :
23732417 add_library ('libnoexit' )
23742418 add_library ('libc' )
0 commit comments