#define GC_PTHREAD_STOP_WORLD_H
struct thread_stop_info {
-# ifndef GC_OPENBSD_UTHREADS
- word last_stop_count; /* GC_last_stop_count value when thread */
- /* last successfully handled a suspend */
- /* signal. */
+# if !defined(GC_OPENBSD_UTHREADS) && !defined(NACL)
+ volatile AO_t last_stop_count;
+ /* The value of GC_stop_count when the thread */
+ /* last successfully handled a suspend signal. */
# endif
ptr_t stack_ptr; /* Valid only when stopped. */
# define GC_lookup_thread_async GC_lookup_thread
#endif
-GC_ATTR_NO_SANITIZE_THREAD
-static void update_last_stop_count(GC_thread me, AO_t my_stop_count)
-{
- me -> stop_info.last_stop_count = my_stop_count;
-}
-
STATIC void GC_suspend_handler_inner(ptr_t dummy GC_ATTR_UNUSED,
void * context GC_ATTR_UNUSED)
{
/* thread has been stopped. Note that sem_post() is */
/* the only async-signal-safe primitive in LinuxThreads. */
sem_post(&GC_suspend_ack_sem);
- update_last_stop_count(me, my_stop_count);
+ AO_store_release(&me->stop_info.last_stop_count, my_stop_count);
/* Wait until that thread tells us to restart by sending */
/* this thread a GC_sig_thr_restart signal (should be masked */
# ifdef GC_ENABLE_SUSPEND_THREAD
if (p -> suspended_ext) continue;
# endif
- if (p -> stop_info.last_stop_count == GC_stop_count) continue;
+ if (AO_load(&p->stop_info.last_stop_count) == GC_stop_count)
+ continue;
n_live_threads++;
# endif
# ifdef DEBUG_THREADS