/*************************************** * interface to binary semaphore * * * ***************************************/ #include #include #include #include char message[72]; sem_exist(sem_name) char *sem_name; { int ev_id; if ((ev_id = _ev_link(sem_name)) == -1) return 0; /* event does not exist */ else _ev_unlink(ev_id); /* existing event is unlinked */ return 1; } sem_reset(sem_name) char *sem_name; { int ev_id; if ((ev_id = _ev_link(sem_name)) == -1) return 0; /* event does not exist */ else _ev_set(ev_id, 1, 0); return 1; } sem_link(sem_name, calling) char *sem_name, *calling; { int ev_id; char *err_type = ": error linking to event %s , errno %d \n"; /* create or link to the event to share module */ if ((ev_id = _ev_link(sem_name)) == -1){ strcpy(message, calling); strcat(message, err_type); exit(_errmsg(errno, message, sem_name, errno)); } return ev_id; } sem_link_cr(sem_name, calling) char *sem_name, *calling; { int ev_id; char *err_type = ": error getting creating event %s, errno %d\n"; /* create or link to the event to share module */ if ((ev_id = _ev_link(sem_name)) == -1) if ((ev_id = _ev_creat(1, -1, 1, sem_name)) == -1){ strcpy(message, calling); strcat(message, err_type); exit(_errmsg(errno, message, sem_name, errno)); } return ev_id; } sem_unl(ev_id, calling) int ev_id; char *calling; { char *err_unl = ": error unlinking from event , errno %d\n"; /* unlink from event */ if (_ev_unlink(ev_id) == -1){ strcpy(message, calling); strcat(message, err_unl); exit(_errmsg(errno, message, errno )); } return 0; } sem_unl_del(ev_id, sem_name, calling) int ev_id; char *sem_name, *calling; { char *err_unl = ": error unlinking from event %s, errno %d\n"; char *err_del = ": error deleting event %s, errno %d \n"; /* unlink from event */ if (_ev_unlink(ev_id) == -1){ strcpy(message, calling); strcat(message, err_unl); exit(_errmsg(errno, message, sem_name, errno)); } /* delete event from system if this was the last process to unlink */ if (_ev_delete(sem_name) == -1 && errno != E_EVBUSY){ strcpy(message, calling); strcat(message, err_del); exit(_errmsg(errno, message, sem_name, errno)); } return 0; } sem_wait(ev_id, calling) int ev_id; char *calling; { char *err_type = ": error waiting for event , errno %d\n"; if (_ev_wait(ev_id, 1, 1) == -1){ strcpy(message, calling); strcat(message, err_type); exit(_errmsg(errno, message, errno)); } return 0; } sem_free(ev_id, calling) int ev_id; char *calling; { char *err_type = ": error signalling event, errno %d \n"; if (_ev_signal(ev_id, 0) == -1) { strcpy(message, calling); strcat(message, err_type); exit(_errmsg(errno, message, errno)); } return 0; }