version 1.17.2.3, 2011/05/09 13:52:24
|
version 1.30, 2011/09/18 18:06:01
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.0.24 |
RPL/2 (R) version 4.1.3 |
Copyright (C) 1989-2011 Dr. BERTRAND Joël |
Copyright (C) 1989-2011 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
Line 24
|
Line 24
|
|
|
#ifdef SEMAPHORES_NOMMES |
#ifdef SEMAPHORES_NOMMES |
|
|
|
// Les fonctions suivantes ne sont utilisées que dans le cas d'un |
|
// système POSIX qui ne possède pas de sémaphores anonymes. MacOS X |
|
// est dans ce cas. |
|
|
|
static unsigned char * |
|
nom_segment_semaphore(pid_t pid) |
|
{ |
|
unsigned char *fichier; |
|
|
|
if ((fichier = malloc((1 + 256 + 1) * sizeof(unsigned char))) == NULL) |
|
{ |
|
return(NULL); |
|
} |
|
|
|
sprintf(fichier, "/RPL-SIGSEMAPHORE-%d", (int) pid); |
|
return(fichier); |
|
} |
|
|
|
|
/* |
/* |
================================================================================ |
================================================================================ |
Fonctions d'émulation de sémaphores anonymes |
Fonctions d'émulation de sémaphores anonymes |
Line 37
|
Line 56
|
*/ |
*/ |
|
|
sem_t * |
sem_t * |
sem_init2(unsigned int valeur, enum t_semaphore semaphore) |
sem_init2(unsigned int valeur, pid_t pid) |
{ |
{ |
snprintf(noms_semaphores[semaphore], LONGUEUR_NOM_SEMAPHORE, |
sem_t *semaphore; |
"/RPL-SEM-%d-%llu-%d", (int) getpid(), |
|
(unsigned long long) pthread_self(), |
unsigned char *chemin; |
(int) semaphore); |
unsigned int i; |
return(sem_open(noms_semaphores[semaphore], O_CREAT, |
|
(S_IRUSR | S_IWUSR), valeur)); |
if ((chemin = nom_segment_semaphore(pid)) == NULL) |
|
{ |
|
return(SEM_FAILED); |
|
} |
|
|
|
semaphore = sem_open(chemin, O_CREAT, (S_IRUSR | S_IWUSR), valeur); |
|
free(chemin); |
|
|
|
for(i = 0; i < valeur; i++) |
|
{ |
|
if (sem_post(semaphore) != 0) |
|
{ |
|
sem_close(semaphore); |
|
return(SEM_FAILED); |
|
} |
|
} |
|
|
|
return(semaphore); |
} |
} |
|
|
|
|
|
sem_t * |
|
sem_open2(pid_t pid) |
|
{ |
|
unsigned char *chemin; |
|
|
|
sem_t *semaphore; |
|
|
|
if ((chemin = nom_segment_semaphore(pid)) == NULL) |
|
{ |
|
return(1); |
|
} |
|
|
|
semaphore = sem_open(chemin, O_RDWR); |
|
free(chemin); |
|
|
|
return(semaphore); |
|
} |
|
|
|
|
int |
int |
sem_destroy2(sem_t *semaphore_p, enum t_semaphore semaphore) |
sem_destroy2(sem_t *semaphore, pid_t pid) |
{ |
{ |
sem_close(semaphore_p); |
int erreur; |
return(sem_unlink(noms_semaphores[semaphore])); |
|
|
unsigned char *chemin; |
|
|
|
sem_close(semaphore); |
|
|
|
if ((chemin = nom_segment_semaphore(pid)) == NULL) |
|
{ |
|
return(1); |
|
} |
|
|
|
erreur = sem_unlink(chemin); |
|
free(chemin); |
|
|
|
return(erreur); |
} |
} |
|
|
#undef sem_post |
#undef sem_post |
Line 65 sem_getvalue2(sem_t *semaphore, int *val
|
Line 134 sem_getvalue2(sem_t *semaphore, int *val
|
|
|
logical1 drapeau_fin; |
logical1 drapeau_fin; |
|
|
|
// Si on ne peut pas décrémenter le sémaphore, c'est qu'il était |
|
// déjà nul. |
pthread_mutex_lock(&mutex_sem); |
pthread_mutex_lock(&mutex_sem); |
|
|
(*valeur) = 0; |
(*valeur) = 0; |