@@ -103,35 +103,33 @@ static void patchNop(void) {
103
103
}
104
104
}
105
105
106
+ static void setup_signal_handlers (void );
107
+ static void clear_pending_signals (void );
106
108
107
109
108
110
109
111
enum class JoinReason { Signal, Safepoint };
110
112
111
- static alaska::ThreadRegistry<alaska_thread_state_t *>* g_threads;
112
- static auto & threads (void ) {
113
- if (g_threads == NULL ) g_threads = new alaska::ThreadRegistry<alaska_thread_state_t *>();
114
- return *g_threads;
115
- }
113
+
114
+ #define ALASKA_THREAD_TRACK_STATE_T AlaskaThreadState
115
+ #define ALASKA_THREAD_TRACK_INIT setup_signal_handlers ();
116
+ #include < alaska/thread_tracking.in.hpp>
116
117
117
118
118
119
119
- __thread alaska_thread_state_t alaska_thread_state;
120
- static pthread_mutex_t barrier_lock = PTHREAD_MUTEX_INITIALIZER;
121
120
122
121
// This is *the* barrier used in alaska_barrier to make sure threads are stopped correctly.
123
122
static pthread_barrier_t the_barrier;
124
123
static long barrier_last_num_threads = 0 ;
124
+ static pthread_mutex_t barrier_lock = PTHREAD_MUTEX_INITIALIZER;
125
125
126
- static void setup_signal_handlers (void );
127
- static void clear_pending_signals (void );
128
126
129
127
130
128
131
129
void alaska_remove_from_local_lock_list (void * ptr) { return ; }
132
130
static void alaska_dump_thread_states_r (void ) {
133
- struct alaska_thread_info * pos;
134
- threads ().for_each_locked ([&](auto thread, alaska_thread_state_t * state) {
131
+ struct info * pos;
132
+ alaska::thread_tracking:: threads ().for_each_locked ([&](auto thread, AlaskaThreadState * state) {
135
133
if (state->escaped == 0 ) {
136
134
printf (" \e[0m. " ); // a thread will join a barrier (not out to lunch)
137
135
} else {
@@ -142,7 +140,7 @@ static void alaska_dump_thread_states_r(void) {
142
140
}
143
141
144
142
void alaska_dump_thread_states (void ) {
145
- auto lk = threads ().take_lock ();
143
+ auto lk = alaska::thread_tracking:: threads ().take_lock ();
146
144
alaska_dump_thread_states_r ();
147
145
}
148
146
@@ -266,13 +264,11 @@ void alaska::barrier::get_pinned_handles(ck::set<void*>& out) {
266
264
267
265
268
266
static void participant_join (bool leader, const ck::set<void *>& ps) {
269
- printf (" join from %lx with state %p%s\n " , pthread_self (), &alaska_thread_state,
270
- leader ? " as leader" : " " );
271
267
for (auto * p : ps) {
272
268
record_handle (p, true );
273
269
}
274
270
// Wait on the barrier so everyone's state has been commited.
275
- if (threads ().num_threads () > 1 ) {
271
+ if (alaska::thread_tracking:: threads ().num_threads () > 1 ) {
276
272
pthread_barrier_wait (&the_barrier);
277
273
}
278
274
}
@@ -282,7 +278,7 @@ static void participant_join(bool leader, const ck::set<void*>& ps) {
282
278
283
279
static void participant_leave (bool leader, const ck::set<void *>& ps) {
284
280
// wait for the the leader (and everyone else to catch up)
285
- if (threads ().num_threads () > 1 ) {
281
+ if (alaska::thread_tracking:: threads ().num_threads () > 1 ) {
286
282
pthread_barrier_wait (&the_barrier);
287
283
}
288
284
@@ -294,8 +290,8 @@ static void participant_leave(bool leader, const ck::set<void*>& ps) {
294
290
295
291
296
292
void dump_thread_states (void ) {
297
- struct alaska_thread_info * pos;
298
- threads ().for_each_locked ([&](auto thread, alaska_thread_state_t * state) {
293
+ struct info * pos;
294
+ alaska::thread_tracking:: threads ().for_each_locked ([&](auto thread, AlaskaThreadState * state) {
299
295
switch (state->join_status ) {
300
296
case ALASKA_JOIN_REASON_NOT_JOINED:
301
297
printf (" \e[41m! " ); // a thread will need to be interrupted (out to lunch)
@@ -334,27 +330,27 @@ bool alaska::barrier::begin(void) {
334
330
335
331
// Take locks so nobody else tries to signal a barrier.
336
332
pthread_mutex_lock (&barrier_lock);
337
- threads ().lock_thread_creation ();
333
+ alaska::thread_tracking:: threads ().lock_thread_creation ();
338
334
339
335
340
336
341
- auto num_threads = threads ().num_threads ();
337
+ auto num_threads = alaska::thread_tracking:: threads ().num_threads ();
342
338
alaska::printf (" Barrier begin from %lx:\n " , pthread_self ());
343
339
alaska::printf (" num threads: %lu\n " , num_threads);
344
340
345
341
printf (" threads:\n " );
346
- threads ().for_each_locked ([](auto thread, alaska_thread_state_t * state) {
342
+ alaska::thread_tracking:: threads ().for_each_locked ([](auto thread, AlaskaThreadState * state) {
347
343
alaska::printf (" - %lx %p %d\n " , thread, state, state->join_status );
348
344
});
349
345
350
346
351
347
// First, mark everyone as *not* in the barrier.
352
- threads ().for_each_locked ([](auto thread, alaska_thread_state_t * state) {
348
+ alaska::thread_tracking:: threads ().for_each_locked ([](auto thread, AlaskaThreadState * state) {
353
349
state->join_status = ALASKA_JOIN_REASON_NOT_JOINED;
354
350
});
355
351
356
352
// Mark the orch thread (us) as joined
357
- alaska_thread_state .join_status = ALASKA_JOIN_REASON_ORCHESTRATOR;
353
+ alaska::thread_tracking::my_state .join_status = ALASKA_JOIN_REASON_ORCHESTRATOR;
358
354
359
355
// If the barrier needs resizing, do so.
360
356
if (barrier_last_num_threads != num_threads) {
@@ -382,9 +378,8 @@ bool alaska::barrier::begin(void) {
382
378
bool sent_signal = false ;
383
379
bool aborted = false ;
384
380
385
- threads ().for_each_locked ([&](auto thread, auto * state) {
381
+ alaska::thread_tracking:: threads ().for_each_locked ([&](auto thread, auto * state) {
386
382
if (state->join_status == ALASKA_JOIN_REASON_NOT_JOINED) {
387
- printf (" killing %lu\n " , thread);
388
383
pthread_kill (thread, SIGUSR2);
389
384
sent_signal = true ;
390
385
signals_sent++;
@@ -422,7 +417,7 @@ void alaska::barrier::end(void) {
422
417
participant_leave (true , locked);
423
418
424
419
// Unlock all the locks we took.
425
- threads ().unlock_thread_creation ();
420
+ alaska::thread_tracking:: threads ().unlock_thread_creation ();
426
421
pthread_mutex_unlock (&barrier_lock);
427
422
}
428
423
@@ -467,26 +462,26 @@ static void alaska_barrier_signal_handler(int sig, siginfo_t* info, void* ptr) {
467
462
printf (
468
463
" ManagedUntracked: pc:0x%zx sig:%d invl:%d!\n " , return_address, sig, invalid_state_abort);
469
464
if (sig == SIGILL) {
470
- alaska_thread_state .join_status = ALASKA_JOIN_REASON_ABORT;
465
+ alaska::thread_tracking::my_state .join_status = ALASKA_JOIN_REASON_ABORT;
471
466
break ;
472
467
}
473
468
if (not invalid_state_abort) {
474
469
invalid_state_abort = true ;
475
470
return ;
476
471
}
477
- alaska_thread_state .join_status = ALASKA_JOIN_REASON_ABORT;
472
+ alaska::thread_tracking::my_state .join_status = ALASKA_JOIN_REASON_ABORT;
478
473
invalid_state_abort = false ;
479
474
break ;
480
475
481
476
case StackState::ManagedTracked:
482
477
// it's possible to be at a managed poll point *and* get interrupted
483
478
// through SIGUSR2
484
- alaska_thread_state .join_status = ALASKA_JOIN_REASON_SAFEPOINT;
479
+ alaska::thread_tracking::my_state .join_status = ALASKA_JOIN_REASON_SAFEPOINT;
485
480
break ;
486
481
487
482
case StackState::Unmanaged:
488
483
assert (sig == SIGUSR2 && " Unmanaged code got into the barrier handler w/ the wrong signal" );
489
- alaska_thread_state .join_status = ALASKA_JOIN_REASON_SIGNAL;
484
+ alaska::thread_tracking::my_state .join_status = ALASKA_JOIN_REASON_SIGNAL;
490
485
break ;
491
486
}
492
487
@@ -544,13 +539,13 @@ static void clear_pending_signals(void) {
544
539
}
545
540
546
541
547
- void alaska::barrier::add_self_thread (void ) {
548
- setup_signal_handlers ();
549
- alaska_thread_state. escaped = 0 ;
550
- threads (). join (&alaska_thread_state) ;
551
- }
542
+ // void alaska::barrier::add_self_thread(void) {
543
+ // setup_signal_handlers();
544
+ // alaska::thread_tracking::join() ;
545
+ // alaska::thread_tracking::my_state.escaped = 0 ;
546
+ // }
552
547
553
- void alaska::barrier::remove_self_thread (void ) { threads (). leave (); }
548
+ // void alaska::barrier::remove_self_thread(void) { alaska::thread_tracking:: leave(); }
554
549
555
550
/* *
556
551
* This function parses a stackmap emitted from LLVM and pushes all
0 commit comments