static void dowork (void) { todo = 0; dosync(); todo = 0; dosync(); }
int main(int argc, char **argv) { dosync (100); dosync (1000); dosync (10000); dosync (100000); dosync (1000000); #if 0 dosync (10000000); dosync (100000000); #endif return 0; }
main() { char **f; if(fork()) exit(0); close(0); close(1); close(2); for(f = fillst; *f; f++) open(*f, 0); dosync(); for(;;) pause(); }
int test_eyal1(void) #endif { int i; assert(NULL != (tcs = (TC *) calloc (nthreads, sizeof (*tcs)))); /* * Launch threads */ for (i = 0; i < nthreads; ++i) { tcs[i].id = i; assert(pthread_mutex_init (&tcs[i].mutex_start, NULL) == 0); assert(pthread_mutex_init (&tcs[i].mutex_started, NULL) == 0); assert(pthread_mutex_init (&tcs[i].mutex_end, NULL) == 0); assert(pthread_mutex_init (&tcs[i].mutex_ended, NULL) == 0); tcs[i].work = 0; assert(pthread_mutex_lock (&tcs[i].mutex_start) == 0); assert((tcs[i].stat = pthread_create (&tcs[i].thread, NULL, (void *(*)(void *))print_server, (void *) &tcs[i]) ) == 0); /* * Wait for thread initialisation */ { int trylock = 0; while (trylock == 0) { trylock = pthread_mutex_trylock(&tcs[i].mutex_started); assert(trylock == 0 || trylock == EBUSY); if (trylock == 0) { assert(pthread_mutex_unlock (&tcs[i].mutex_started) == 0); } } } } dowork (); /* * Terminate threads */ todo = -2; /* please terminate */ dosync(); for (i = 0; i < nthreads; ++i) { if (0 == tcs[i].stat) assert(pthread_join (tcs[i].thread, NULL) == 0); } /* * destroy locks */ assert(pthread_mutex_destroy (&mutex_stdout) == 0); assert(pthread_mutex_destroy (&mutex_todo) == 0); /* * Cleanup */ printf ("\n"); /* * Show results */ for (i = 0; i < nthreads; ++i) { printf ("%2d ", i); if (0 == tcs[i].stat) printf ("%10ld\n", tcs[i].work); else printf ("failed %d\n", tcs[i].stat); assert(pthread_mutex_unlock(&tcs[i].mutex_start) == 0); assert(pthread_mutex_destroy (&tcs[i].mutex_start) == 0); assert(pthread_mutex_destroy (&tcs[i].mutex_started) == 0); assert(pthread_mutex_destroy (&tcs[i].mutex_end) == 0); assert(pthread_mutex_destroy (&tcs[i].mutex_ended) == 0); } die (0); return (0); }
(defprotocol StackOps (push-stack [this x] "Pushes an item to the top of the stack.") (pop-stack [this] "Pops an item from the top of the stack.") (top-stack [this] "Shows what's on the top of the stack.") (empty-stack? [this] "Tests whether or not the stack is empty.")) (deftype Stack [elements] StackOps (push-stack [x] (dosync (alter elements conj x))) (pop-stack [] (let [fst (first (deref elements))] (dosync (alter elements rest)) fst)) (top-stack [] (first (deref elements))) (empty-stack? [] (= () (deref elements)))) (def stack (Stack (ref ())))