#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <pthread.h>
static sem_t sem;
void *do_work(void *arg) {
// if something fails
printf("Something failed!\n"); }
void exit_handler() {
sem_post(&sem); // wake up main thread
sem_wait(&sem); // wait for cleanup in main
sem_destroy(&sem);
}
int main() {
pthread_t worker_thread;
sem_init(&sem, 0, 0);
pthread_create(&worker_thread, NULL, do_work, NULL);
sem_wait(&sem); // block this thread until work is done
// simulate some cleanup
usleep(1000000);
printf("This never gets called!\n");
sem_post(&sem);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c2VtYXBob3JlLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CgpzdGF0aWMgc2VtX3Qgc2VtOwoKdm9pZCAqZG9fd29yayh2b2lkICphcmcpIHsKICAvLyBpZiBzb21ldGhpbmcgZmFpbHMKICBwcmludGYoIlNvbWV0aGluZyBmYWlsZWQhXG4iKTsKICBleGl0KDEpOwp9Cgp2b2lkIGV4aXRfaGFuZGxlcigpIHsKICBzZW1fcG9zdCgmc2VtKTsgLy8gd2FrZSB1cCBtYWluIHRocmVhZAogIHNlbV93YWl0KCZzZW0pOyAvLyB3YWl0IGZvciBjbGVhbnVwIGluIG1haW4KICBzZW1fZGVzdHJveSgmc2VtKTsKfQoKaW50IG1haW4oKSB7CiAgcHRocmVhZF90IHdvcmtlcl90aHJlYWQ7CiAgCiAgc2VtX2luaXQoJnNlbSwgMCwgMCk7CiAgYXRleGl0KGV4aXRfaGFuZGxlcik7CgogIHB0aHJlYWRfY3JlYXRlKCZ3b3JrZXJfdGhyZWFkLCBOVUxMLCBkb193b3JrLCBOVUxMKTsKCiAgc2VtX3dhaXQoJnNlbSk7IC8vIGJsb2NrIHRoaXMgdGhyZWFkIHVudGlsIHdvcmsgaXMgZG9uZQoKICAvLyBzaW11bGF0ZSBzb21lIGNsZWFudXAKICB1c2xlZXAoMTAwMDAwMCk7CiAgcHJpbnRmKCJUaGlzIG5ldmVyIGdldHMgY2FsbGVkIVxuIik7CgogIHNlbV9wb3N0KCZzZW0pOwp9Cg==