+ //printf("SND: %p\n", (void *)pthread_user_data_internal(thread));
+ //while(pthread_kill(thread, PTHREAD_XSIG_STOP) == EAGAIN) usleep(1000);
+ while(pthread_sigqueue(thread, PTHREAD_XSIG_STOP,
+ (const union sigval){.sival_ptr=pthread_user_data_internal(thread)}
+ ) == EAGAIN) usleep(1000);
+ return 0;
+}
+*/
+
+int pthread_pause_reschedule(pthread_t thread) {
+ //Decide if the thread should run and signal it
+
+ //Wait for semaphore which means signal queue is empty
+ pthread_pause_init(); //Make sure semaphore is init'd
+ sem_wait(&pthread_pause_sem);
+
+ //Only call this if you already acquired pthread_pause_sem semaphore!!!!
+ //Otherwise call pthread_pause_reschedule()
+
+ pthread_user_data_lock();
+ //Check if thread has running flag
+ int run = (pthread_user_data_internal(thread)->running);
+ //Check if privileged (single thread) mode is active
+ if((pthread_pause_holder != PTHREAD_XNULL) && !pthread_equal(pthread_pause_holder, thread)) {
+ run = 0;
+ }
+ pthread_user_data_unlock();
+
+ //Send signal to initiate pause handler (keep trying while SigQueue is full)
+ //while(pthread_kill(thread, PTHREAD_XSIG_STOP) == EAGAIN) usleep(1000);
+ while(pthread_sigqueue(thread, PTHREAD_XSIG_STOP,
+ (const union sigval){.sival_int=run}
+ ) == EAGAIN) usleep(1000);
+
+ //Wait for signal to be delivered
+ sem_wait(&pthread_pause_sem);
+ sem_post(&pthread_pause_sem);
+