version 1.29, 2011/09/18 12:42:50
|
version 1.31, 2011/09/18 18:45:31
|
Line 61 sem_init2(unsigned int valeur, pid_t pid
|
Line 61 sem_init2(unsigned int valeur, pid_t pid
|
sem_t *semaphore; |
sem_t *semaphore; |
|
|
unsigned char *chemin; |
unsigned char *chemin; |
|
unsigned int i; |
|
|
if ((chemin = nom_segment_semaphore(pid)) == NULL) |
if ((chemin = nom_segment_semaphore(pid)) == NULL) |
{ |
{ |
Line 70 sem_init2(unsigned int valeur, pid_t pid
|
Line 71 sem_init2(unsigned int valeur, pid_t pid
|
semaphore = sem_open(chemin, O_CREAT, (S_IRUSR | S_IWUSR), valeur); |
semaphore = sem_open(chemin, O_CREAT, (S_IRUSR | S_IWUSR), valeur); |
free(chemin); |
free(chemin); |
|
|
|
for(i = 0; i < valeur; i++) |
|
{ |
|
if (sem_post(semaphore) != 0) |
|
{ |
|
sem_close(semaphore); |
|
return(SEM_FAILED); |
|
} |
|
} |
|
|
return(semaphore); |
return(semaphore); |
} |
} |
|
|
Line 121 int
|
Line 131 int
|
sem_getvalue2(sem_t *semaphore, int *valeur) |
sem_getvalue2(sem_t *semaphore, int *valeur) |
{ |
{ |
int i; |
int i; |
|
int j; |
|
|
logical1 drapeau_fin; |
logical1 drapeau_fin; |
|
|
// Si on ne peut pas décrémenter le sémaphore, c'est qu'il était |
struct timespec attente; |
// déjà nul. |
|
pthread_mutex_lock(&mutex_sem); |
|
|
|
(*valeur) = 0; |
attente.tv_sec = 0; |
drapeau_fin = d_faux; |
attente.tv_nsec = GRANULARITE_us * 1000; |
|
|
do |
for(j = 0; j < 100; j++) |
{ |
{ |
if (sem_trywait(semaphore) == -1) |
if (pthread_mutex_trylock(&mutex_sem) == 0) |
{ |
{ |
if (errno == EAGAIN) |
(*valeur) = 0; |
|
drapeau_fin = d_faux; |
|
|
|
do |
{ |
{ |
// Le sémaphore avait une valeur nulle |
if (sem_trywait(semaphore) == -1) |
drapeau_fin = d_vrai; |
{ |
} |
if (errno == EAGAIN) |
else |
{ |
|
// Le sémaphore avait une valeur nulle |
|
drapeau_fin = d_vrai; |
|
} |
|
else |
|
{ |
|
// Autre erreur |
|
pthread_mutex_unlock(&mutex_sem); |
|
return(-1); |
|
} |
|
} |
|
else |
|
{ |
|
(*valeur)++; |
|
} |
|
} while(drapeau_fin == d_faux); |
|
|
|
for(i = 0; i < (*valeur); i++) |
{ |
{ |
// Autre erreur |
if (sem_post(semaphore) != 0) |
pthread_mutex_unlock(&mutex_sem); |
{ |
return(-1); |
pthread_mutex_unlock(&mutex_sem); |
|
return(-1); |
|
} |
} |
} |
} |
|
else |
|
{ |
|
(*valeur)++; |
|
} |
|
} while(drapeau_fin == d_faux); |
|
|
|
for(i = 0; i < (*valeur); i++) |
|
{ |
|
if (sem_post(semaphore) != 0) |
|
{ |
|
pthread_mutex_unlock(&mutex_sem); |
pthread_mutex_unlock(&mutex_sem); |
return(-1); |
return(0); |
} |
} |
|
|
|
INCR_GRANULARITE(attente.tv_nsec); |
} |
} |
|
|
pthread_mutex_unlock(&mutex_sem); |
// Le mutex n'a pas pu être verrouillé. On peut raisonnablement penser |
|
// que le sémaphore est bloqué dans un sem_wait() protégé par ce mutex. |
|
|
|
(*valeur) = 0; |
return(0); |
return(0); |
} |
} |
|
|