+
+ //Unblock signal
+ sigset_t sigset;
+ sigemptyset(&sigset);
+ sigaddset(&sigset, PTHREAD_XSIG_STOP);
+ pthread_sigmask(SIG_UNBLOCK, &sigset, NULL);
+}
+
+void pthread_pause_disable() {
+ //Block signal
+ sigset_t sigset;
+ sigemptyset(&sigset);
+ sigaddset(&sigset, PTHREAD_XSIG_STOP);
+ pthread_sigmask(SIG_BLOCK, &sigset, NULL);
+}
+
+int pthread_pause(pthread_t thread) {
+ //Set thread as paused and notify it via signal (wait when queue full)
+ pthread_user_data_internal(thread)->running = 0;
+ while(pthread_kill(thread, PTHREAD_XSIG_STOP) == EAGAIN) usleep(1000);
+ return 0;
+}
+
+int pthread_unpause(pthread_t thread) {
+ //Set thread as running and notify it via signal (wait when queue full)
+ pthread_user_data_internal(thread)->running = 1;
+ while(pthread_kill(thread, PTHREAD_XSIG_STOP) == EAGAIN) usleep(1000);
+ return 0;