1#include <stdio.h> 2#include <assert.h> 3#include <barrelfish/barrelfish.h> 4#include <barrelfish/spawn_client.h> 5#include <semaphore.h> 6 7int main(int argc, char *argv[]) 8{ 9 sem_t sem; 10 debug_printf("semtest start"); 11 if(argc == 2) { 12 // Initializer 13 sem_init(&sem, 1, 0); 14 assert(sem.id == 1); 15 16 for(int i = 0; i < 10; i++) { 17 errval_t err; 18 char *args[5]; 19 args[0] = "program"; 20 args[1] = NULL; 21 err = spawn_program(disp_get_core_id(), "/x86_64/sbin/semtest", 22 args, NULL, SPAWN_FLAGS_NEW_DOMAIN, NULL); 23 assert(err_is_ok(err)); 24 } 25 } else { 26 sem.id = 1; 27 sem.pshared = 1; 28 } 29 30 // Worker 31 for(;;) { 32 if(disp_get_domain_id() % 1 == 0) { 33 printf("%"PRIuDOMAINID": post\n", disp_get_domain_id()); 34 sem_post(&sem); 35 } 36 printf("%"PRIuDOMAINID": trywait\n", disp_get_domain_id()); 37 if(sem_trywait(&sem) == -1) { 38 printf("%"PRIuDOMAINID": would block\n", disp_get_domain_id()); 39 printf("%"PRIuDOMAINID": wait\n", disp_get_domain_id()); 40 sem_wait(&sem); 41 } else { 42 printf("%"PRIuDOMAINID": works\n", disp_get_domain_id()); 43 } 44 45 if(disp_get_domain_id() % 1 == 1) { 46 printf("%"PRIuDOMAINID": post\n", disp_get_domain_id()); 47 sem_post(&sem); 48 } 49 } 50 51 return 0; 52} 53