948 /*
949 * Every object before this point has size and alignment of 64 bytes.
950 * Don't add any other type of data before this point.
951 */
952 char primary_map; /* set when primary link map is initialized */
953 char bucket_init; /* set when bucket[NBUCKETS] is initialized */
954 char pad[2];
955 uberflags_t uberflags;
956 queue_head_t *queue_head;
957 thr_hash_table_t *thr_hash_table;
958 uint_t hash_size; /* # of entries in thr_hash_table[] */
959 uint_t hash_mask; /* hash_size - 1 */
960 ulwp_t *ulwp_one; /* main thread */
961 ulwp_t *all_lwps; /* circular ul_forw/ul_back list of live lwps */
962 ulwp_t *all_zombies; /* circular ul_forw/ul_back list of zombies */
963 int nthreads; /* total number of live threads/lwps */
964 int nzombies; /* total number of zombie threads */
965 int ndaemons; /* total number of THR_DAEMON threads/lwps */
966 pid_t pid; /* the current process's pid */
967 void (*sigacthandler)(int, siginfo_t *, void *);
968 ulwp_t *lwp_stacks;
969 ulwp_t *lwp_laststack;
970 int nfreestack;
971 int thread_stack_cache;
972 ulwp_t *ulwp_freelist;
973 ulwp_t *ulwp_lastfree;
974 ulwp_t *ulwp_replace_free;
975 ulwp_t *ulwp_replace_last;
976 atfork_t *atforklist; /* circular Q for fork handlers */
977 robust_t **robustlocks; /* table of registered robust locks */
978 robust_t *robustlist; /* list of registered robust locks */
979 char *progname; /* the basename of the program, from argv[0] */
980 struct uberdata **tdb_bootstrap;
981 tdb_t tdb; /* thread debug interfaces (for libc_db) */
982 } uberdata_t;
983
984 #define link_lock _link_lock.pad_lock
985 #define ld_lock _ld_lock.pad_lock
986 #define fork_lock _fork_lock.pad_lock
987 #define atfork_lock _atfork_lock.pad_lock
988 #define callout_lock _callout_lock.pad_lock
989 #define tdb_hash_lock _tdb_hash_lock.pad_lock
990
991 #pragma align 64(__uberdata)
992 extern uberdata_t __uberdata;
993 extern uberdata_t **__tdb_bootstrap; /* known to libc_db and mdb */
994 extern int primary_link_map;
995
996 #define ulwp_mutex(ulwp, udp) \
997 (&(udp)->thr_hash_table[(ulwp)->ul_ix].hash_lock)
998 #define ulwp_condvar(ulwp, udp) \
999 (&(udp)->thr_hash_table[(ulwp)->ul_ix].hash_cond)
1161 atexit_root32_t atexit_root;
1162 quickexit_root32_t quickexit_root;
1163 tsd_metadata32_t tsd_metadata;
1164 tls_metadata32_t tls_metadata;
1165 char primary_map;
1166 char bucket_init;
1167 char pad[2];
1168 uberflags_t uberflags;
1169 caddr32_t queue_head;
1170 caddr32_t thr_hash_table;
1171 uint_t hash_size;
1172 uint_t hash_mask;
1173 caddr32_t ulwp_one;
1174 caddr32_t all_lwps;
1175 caddr32_t all_zombies;
1176 int nthreads;
1177 int nzombies;
1178 int ndaemons;
1179 int pid;
1180 caddr32_t sigacthandler;
1181 caddr32_t lwp_stacks;
1182 caddr32_t lwp_laststack;
1183 int nfreestack;
1184 int thread_stack_cache;
1185 caddr32_t ulwp_freelist;
1186 caddr32_t ulwp_lastfree;
1187 caddr32_t ulwp_replace_free;
1188 caddr32_t ulwp_replace_last;
1189 caddr32_t atforklist;
1190 caddr32_t robustlocks;
1191 caddr32_t robustlist;
1192 caddr32_t progname;
1193 caddr32_t tdb_bootstrap;
1194 tdb32_t tdb;
1195 } uberdata32_t;
1196
1197 #endif /* _SYSCALL32 */
1198
1199 /* ul_stop values */
1200 #define TSTP_REGULAR 0x01 /* Stopped by thr_suspend() */
1201 #define TSTP_MUTATOR 0x08 /* stopped by thr_suspend_*mutator*() */
1202 #define TSTP_FORK 0x20 /* stopped by suspend_fork() */
1203
1204 /*
1205 * Implementation-specific attribute types for pthread_mutexattr_init() etc.
1206 */
1207
1208 typedef struct _cvattr {
1209 int pshared;
1210 clockid_t clockid;
1211 } cvattr_t;
1212
1262 extern void getgregs(ulwp_t *, gregset_t);
1263 extern void setgregs(ulwp_t *, gregset_t);
1264 extern void thr_panic(const char *);
1265 #pragma rarely_called(thr_panic)
1266 extern void mutex_panic(mutex_t *, const char *);
1267 #pragma rarely_called(mutex_panic)
1268 extern ulwp_t *find_lwp(thread_t);
1269 extern void finish_init(void);
1270 extern void update_sched(ulwp_t *);
1271 extern void queue_alloc(void);
1272 extern void tmem_exit(void);
1273 extern void tsd_exit(void);
1274 extern void tsd_free(ulwp_t *);
1275 extern void tls_setup(void);
1276 extern void tls_exit(void);
1277 extern void tls_free(ulwp_t *);
1278 extern void rwl_free(ulwp_t *);
1279 extern void heldlock_exit(void);
1280 extern void heldlock_free(ulwp_t *);
1281 extern void sigacthandler(int, siginfo_t *, void *);
1282 extern void signal_init(void);
1283 extern int sigequalset(const sigset_t *, const sigset_t *);
1284 extern void mutex_setup(void);
1285 extern void take_deferred_signal(int);
1286 extern void *setup_top_frame(void *, size_t, ulwp_t *);
1287 extern int setup_context(ucontext_t *, void *(*func)(ulwp_t *),
1288 ulwp_t *ulwp, caddr_t stk, size_t stksize);
1289 extern volatile sc_shared_t *setup_schedctl(void);
1290 extern void *lmalloc(size_t);
1291 extern void lfree(void *, size_t);
1292 extern void *libc_malloc(size_t);
1293 extern void *libc_realloc(void *, size_t);
1294 extern void libc_free(void *);
1295 extern char *libc_strdup(const char *);
1296 extern void ultos(uint64_t, int, char *);
1297 extern void lock_error(const mutex_t *, const char *, void *, const char *);
1298 extern void rwlock_error(const rwlock_t *, const char *, const char *);
1299 extern void thread_error(const char *);
1300 extern void grab_assert_lock(void);
1301 extern void dump_queue_statistics(void);
|
948 /*
949 * Every object before this point has size and alignment of 64 bytes.
950 * Don't add any other type of data before this point.
951 */
952 char primary_map; /* set when primary link map is initialized */
953 char bucket_init; /* set when bucket[NBUCKETS] is initialized */
954 char pad[2];
955 uberflags_t uberflags;
956 queue_head_t *queue_head;
957 thr_hash_table_t *thr_hash_table;
958 uint_t hash_size; /* # of entries in thr_hash_table[] */
959 uint_t hash_mask; /* hash_size - 1 */
960 ulwp_t *ulwp_one; /* main thread */
961 ulwp_t *all_lwps; /* circular ul_forw/ul_back list of live lwps */
962 ulwp_t *all_zombies; /* circular ul_forw/ul_back list of zombies */
963 int nthreads; /* total number of live threads/lwps */
964 int nzombies; /* total number of zombie threads */
965 int ndaemons; /* total number of THR_DAEMON threads/lwps */
966 pid_t pid; /* the current process's pid */
967 void (*sigacthandler)(int, siginfo_t *, void *);
968 int (*setctxt)(const ucontext_t *);
969 ulwp_t *lwp_stacks;
970 ulwp_t *lwp_laststack;
971 int nfreestack;
972 int thread_stack_cache;
973 ulwp_t *ulwp_freelist;
974 ulwp_t *ulwp_lastfree;
975 ulwp_t *ulwp_replace_free;
976 ulwp_t *ulwp_replace_last;
977 atfork_t *atforklist; /* circular Q for fork handlers */
978 robust_t **robustlocks; /* table of registered robust locks */
979 robust_t *robustlist; /* list of registered robust locks */
980 char *progname; /* the basename of the program, from argv[0] */
981 char *ub_broot; /* the root of the native code in the brand */
982 void *ub_comm_page; /* arch-specific comm page of kernel data */
983 struct uberdata **tdb_bootstrap;
984 tdb_t tdb; /* thread debug interfaces (for libc_db) */
985 } uberdata_t;
986
987 #define link_lock _link_lock.pad_lock
988 #define ld_lock _ld_lock.pad_lock
989 #define fork_lock _fork_lock.pad_lock
990 #define atfork_lock _atfork_lock.pad_lock
991 #define callout_lock _callout_lock.pad_lock
992 #define tdb_hash_lock _tdb_hash_lock.pad_lock
993
994 #pragma align 64(__uberdata)
995 extern uberdata_t __uberdata;
996 extern uberdata_t **__tdb_bootstrap; /* known to libc_db and mdb */
997 extern int primary_link_map;
998
999 #define ulwp_mutex(ulwp, udp) \
1000 (&(udp)->thr_hash_table[(ulwp)->ul_ix].hash_lock)
1001 #define ulwp_condvar(ulwp, udp) \
1002 (&(udp)->thr_hash_table[(ulwp)->ul_ix].hash_cond)
1164 atexit_root32_t atexit_root;
1165 quickexit_root32_t quickexit_root;
1166 tsd_metadata32_t tsd_metadata;
1167 tls_metadata32_t tls_metadata;
1168 char primary_map;
1169 char bucket_init;
1170 char pad[2];
1171 uberflags_t uberflags;
1172 caddr32_t queue_head;
1173 caddr32_t thr_hash_table;
1174 uint_t hash_size;
1175 uint_t hash_mask;
1176 caddr32_t ulwp_one;
1177 caddr32_t all_lwps;
1178 caddr32_t all_zombies;
1179 int nthreads;
1180 int nzombies;
1181 int ndaemons;
1182 int pid;
1183 caddr32_t sigacthandler;
1184 caddr32_t setctxt;
1185 caddr32_t lwp_stacks;
1186 caddr32_t lwp_laststack;
1187 int nfreestack;
1188 int thread_stack_cache;
1189 caddr32_t ulwp_freelist;
1190 caddr32_t ulwp_lastfree;
1191 caddr32_t ulwp_replace_free;
1192 caddr32_t ulwp_replace_last;
1193 caddr32_t atforklist;
1194 caddr32_t robustlocks;
1195 caddr32_t robustlist;
1196 caddr32_t progname;
1197 caddr32_t ub_broot;
1198 caddr32_t ub_comm_page;
1199 caddr32_t tdb_bootstrap;
1200 tdb32_t tdb;
1201 } uberdata32_t;
1202
1203 #endif /* _SYSCALL32 */
1204
1205 /* ul_stop values */
1206 #define TSTP_REGULAR 0x01 /* Stopped by thr_suspend() */
1207 #define TSTP_MUTATOR 0x08 /* stopped by thr_suspend_*mutator*() */
1208 #define TSTP_FORK 0x20 /* stopped by suspend_fork() */
1209
1210 /*
1211 * Implementation-specific attribute types for pthread_mutexattr_init() etc.
1212 */
1213
1214 typedef struct _cvattr {
1215 int pshared;
1216 clockid_t clockid;
1217 } cvattr_t;
1218
1268 extern void getgregs(ulwp_t *, gregset_t);
1269 extern void setgregs(ulwp_t *, gregset_t);
1270 extern void thr_panic(const char *);
1271 #pragma rarely_called(thr_panic)
1272 extern void mutex_panic(mutex_t *, const char *);
1273 #pragma rarely_called(mutex_panic)
1274 extern ulwp_t *find_lwp(thread_t);
1275 extern void finish_init(void);
1276 extern void update_sched(ulwp_t *);
1277 extern void queue_alloc(void);
1278 extern void tmem_exit(void);
1279 extern void tsd_exit(void);
1280 extern void tsd_free(ulwp_t *);
1281 extern void tls_setup(void);
1282 extern void tls_exit(void);
1283 extern void tls_free(ulwp_t *);
1284 extern void rwl_free(ulwp_t *);
1285 extern void heldlock_exit(void);
1286 extern void heldlock_free(ulwp_t *);
1287 extern void sigacthandler(int, siginfo_t *, void *);
1288 extern int setctxt(const ucontext_t *);
1289 extern void signal_init(void);
1290 extern int sigequalset(const sigset_t *, const sigset_t *);
1291 extern void mutex_setup(void);
1292 extern void take_deferred_signal(int);
1293 extern void *setup_top_frame(void *, size_t, ulwp_t *);
1294 extern int setup_context(ucontext_t *, void *(*func)(ulwp_t *),
1295 ulwp_t *ulwp, caddr_t stk, size_t stksize);
1296 extern volatile sc_shared_t *setup_schedctl(void);
1297 extern void *lmalloc(size_t);
1298 extern void lfree(void *, size_t);
1299 extern void *libc_malloc(size_t);
1300 extern void *libc_realloc(void *, size_t);
1301 extern void libc_free(void *);
1302 extern char *libc_strdup(const char *);
1303 extern void ultos(uint64_t, int, char *);
1304 extern void lock_error(const mutex_t *, const char *, void *, const char *);
1305 extern void rwlock_error(const rwlock_t *, const char *, const char *);
1306 extern void thread_error(const char *);
1307 extern void grab_assert_lock(void);
1308 extern void dump_queue_statistics(void);
|