/* Código construído durante a aula de 31/03/09 */ /* Estrutura de dados para o semáforo */ typedef struct { mutex_t mutex; cond_t cond; int c; } sem_t; int sem_init(sem_t* sem, int pshared, unsigned int value) { /* mutex_init e cond_init */ sem->c = value; mutex_init(&sem->mutex); return 0; } int sem_trywait(sem_t* sem) { mutex_lock(&sem->mutex); if (sem->c > 0){ sem->c--; mutex_unlock(&sem->mutex); return 0; } mutex_unlock(&sem->mutex); return -1; } int sem_wait(sem_t* sem) { mutex_lock(&sem->mutex); while(sem->c == 0) cond_wait(&sem->cond, &sem->mutex); sem->c--; mutex_unlock(&sem->mutex); return 0; } int sem_post(sem_t* sem) { mutex_lock(&sem->mutex); cond_signal(&sem->cond); sem->c++; mutex_unlock(&sem->mutex); return 0; } int sem_getvalue(sem_t* sem, int *sval){ *sval = sem->c; return 0; } int sem_destroy(sem_t* sem) { /* mutex_destroy e cond_destroy */ /* como verificar se o semáforo está em uso? */ sem_wait(sem); return 0; }