version 1.32, 2011/09/19 17:33:17
|
version 1.37, 2011/09/20 19:28:39
|
Line 29
|
Line 29
|
// est dans ce cas. |
// est dans ce cas. |
|
|
static unsigned char * |
static unsigned char * |
nom_segment_semaphore(pid_t pid) |
nom_segment_semaphore(pid_t pid, int ordre) |
{ |
{ |
unsigned char *fichier; |
unsigned char *fichier; |
|
|
Line 38 nom_segment_semaphore(pid_t pid)
|
Line 38 nom_segment_semaphore(pid_t pid)
|
return(NULL); |
return(NULL); |
} |
} |
|
|
sprintf(fichier, "/RPL-SIGSEMAPHORE-%d", (int) pid); |
sprintf(fichier, "/RPL-%d-%d", (int) pid, ordre); |
|
return(fichier); |
|
} |
|
|
|
|
|
static unsigned char * |
|
nom_segment_semaphore_thread(pid_t pid, pthread_t tid, int ordre) |
|
{ |
|
unsigned char *fichier; |
|
|
|
if ((fichier = malloc((1 + 256 + 1) * sizeof(unsigned char))) == NULL) |
|
{ |
|
return(NULL); |
|
} |
|
|
|
sprintf(fichier, "/RPL-%d-%llX-%d", (int) pid, |
|
(unsigned long long) tid, ordre); |
return(fichier); |
return(fichier); |
} |
} |
|
|
Line 56 nom_segment_semaphore(pid_t pid)
|
Line 72 nom_segment_semaphore(pid_t pid)
|
*/ |
*/ |
|
|
sem_t * |
sem_t * |
sem_init2(unsigned int valeur, pid_t pid) |
sem_init2(unsigned int valeur, pid_t pid, int ordre) |
{ |
{ |
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, ordre)) == NULL) |
{ |
{ |
return(SEM_FAILED); |
return(SEM_FAILED); |
} |
} |
|
|
semaphore = sem_open(chemin, O_CREAT, (S_IRUSR | S_IWUSR), valeur); |
semaphore = sem_open(chemin, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, |
|
valeur); |
free(chemin); |
free(chemin); |
|
|
for(i = 0; i < valeur; i++) |
return(semaphore); |
|
} |
|
|
|
|
|
sem_t * |
|
sem_init3(unsigned int valeur, pid_t pid, pthread_t tid, int ordre) |
|
{ |
|
sem_t *semaphore; |
|
|
|
unsigned char *chemin; |
|
|
|
if ((chemin = nom_segment_semaphore_thread(pid, tid, ordre)) == NULL) |
{ |
{ |
if (sem_post(semaphore) != 0) |
return(SEM_FAILED); |
{ |
|
sem_close(semaphore); |
|
return(SEM_FAILED); |
|
} |
|
} |
} |
|
|
|
semaphore = sem_open(chemin, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR, |
|
valeur); |
|
free(chemin); |
|
|
return(semaphore); |
return(semaphore); |
} |
} |
|
|
|
|
sem_t * |
sem_t * |
sem_open2(pid_t pid) |
sem_open2(pid_t pid, int ordre) |
{ |
{ |
unsigned char *chemin; |
unsigned char *chemin; |
|
|
sem_t *semaphore; |
sem_t *semaphore; |
|
|
if ((chemin = nom_segment_semaphore(pid)) == NULL) |
if ((chemin = nom_segment_semaphore(pid, ordre)) == NULL) |
{ |
{ |
return(1); |
return(SEM_FAILED); |
} |
} |
|
|
semaphore = sem_open(chemin, O_RDWR); |
semaphore = sem_open(chemin, O_RDWR); |
Line 104 sem_open2(pid_t pid)
|
Line 131 sem_open2(pid_t pid)
|
|
|
|
|
int |
int |
sem_destroy2(sem_t *semaphore, pid_t pid) |
sem_destroy2(sem_t *semaphore, pid_t pid, int ordre) |
{ |
{ |
int erreur; |
int erreur; |
|
|
Line 112 sem_destroy2(sem_t *semaphore, pid_t pid
|
Line 139 sem_destroy2(sem_t *semaphore, pid_t pid
|
|
|
sem_close(semaphore); |
sem_close(semaphore); |
|
|
if ((chemin = nom_segment_semaphore(pid)) == NULL) |
if ((chemin = nom_segment_semaphore(pid, ordre)) == NULL) |
|
{ |
|
return(1); |
|
} |
|
|
|
erreur = em_unlink(chemin); |
|
free(chemin); |
|
|
|
return(erreur); |
|
} |
|
|
|
|
|
int |
|
sem_destroy3(sem_t *semaphore, pid_t pid, pthread_t tid, int ordre) |
|
{ |
|
int erreur; |
|
|
|
unsigned char *chemin; |
|
|
|
sem_close(semaphore); |
|
|
|
if ((chemin = nom_segment_semaphore_thread(pid, tid, ordre)) == NULL) |
{ |
{ |
return(1); |
return(1); |
} |
} |
Line 123 sem_destroy2(sem_t *semaphore, pid_t pid
|
Line 171 sem_destroy2(sem_t *semaphore, pid_t pid
|
return(erreur); |
return(erreur); |
} |
} |
|
|
|
|
#undef sem_post |
#undef sem_post |
#undef sem_wait |
#undef sem_wait |
#undef sem_trywait |
#undef sem_trywait |
Line 236 sem_init_SysV(sem_t *semaphore, int shar
|
Line 285 sem_init_SysV(sem_t *semaphore, int shar
|
S_IRUSR | S_IWUSR); |
S_IRUSR | S_IWUSR); |
(*semaphore).path = NULL; |
(*semaphore).path = NULL; |
(*semaphore).pid = getpid(); |
(*semaphore).pid = getpid(); |
|
(*semaphore).tid = pthread_self(); |
(*semaphore).alloue = 0; |
(*semaphore).alloue = 0; |
} |
} |
else |
else |
{ |
{ |
// Sémaphore partagé entre plusieurs processus |
// Sémaphore partagé entre plusieurs processus |
if (((*semaphore).path = malloc((strlen(racine_segment) |
if (((*semaphore).path = malloc((strlen(racine_segment) |
+ 1 + 32 + 1) * sizeof(unsigned char))) == NULL) |
+ 2 + 256 + 1) * sizeof(unsigned char))) == NULL) |
{ |
{ |
return(-1); |
return(-1); |
} |
} |
|
|
sprintf((*semaphore).path, "%s/RPL-SIGSEMAPHORE-%d", racine_segment, |
sprintf((*semaphore).path, "%s/RPL-SEMAPHORE-%d-%llX-%d", |
(int) getpid()); |
racine_segment, (int) getpid(), pthread_self(), shared); |
|
|
if ((desc = open((*semaphore).path, O_CREAT | O_EXCL | |
if ((desc = open((*semaphore).path, O_RDWR | O_CREAT | O_EXCL, |
S_IRUSR | S_IWUSR)) == -1) |
S_IRUSR | S_IWUSR)) == -1) |
{ |
{ |
free((*semaphore).path); |
free((*semaphore).path); |
Line 258 sem_init_SysV(sem_t *semaphore, int shar
|
Line 308 sem_init_SysV(sem_t *semaphore, int shar
|
} |
} |
|
|
(*semaphore).pid = getpid(); |
(*semaphore).pid = getpid(); |
|
(*semaphore).tid = pthread_self(); |
clef = ftok((*semaphore).path, 1); |
clef = ftok((*semaphore).path, 1); |
close(desc); |
close(desc); |
|
|
Line 638 sem_t
|
Line 689 sem_t
|
} |
} |
|
|
(*semaphore).alloue = -1; |
(*semaphore).alloue = -1; |
|
(*semaphore).pid = getpid(); |
|
(*semaphore).tid = pthread_self(); |
# else |
# else |
|
|
if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1) |
if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1) |
Line 793 sem_t
|
Line 846 sem_t
|
va_end(liste); |
va_end(liste); |
|
|
# ifndef OS2 // IPCS_SYSV |
# ifndef OS2 // IPCS_SYSV |
if ((desc = open(nom_absolu, O_CREAT | O_EXCL | S_IRUSR | S_IWUSR)) |
if ((desc = open(nom_absolu, O_CREAT | O_EXCL | O_RDWR, |
== -1) |
S_IRUSR | S_IWUSR)) == -1) |
{ |
{ |
free(semaphore); |
free(semaphore); |
free(nom_absolu); |
free(nom_absolu); |
Line 954 sem_unlink_SysV(const char *nom)
|
Line 1007 sem_unlink_SysV(const char *nom)
|
{ |
{ |
// Détruit un sémaphore nommé créé par sem_open_SysV() |
// Détruit un sémaphore nommé créé par sem_open_SysV() |
# ifndef OS2 // IPCS_SYSV |
# ifndef OS2 // IPCS_SYSV |
unsigned char *nom_absolu; |
semctl(semget(ftok(nom, 1), 0, 0), 0, IPC_RMID); |
|
|
if ((nom_absolu = malloc((strlen(racine_segment) + strlen(nom) |
|
+ 2) * sizeof(unsigned char))) == NULL) |
|
{ |
|
return(ENOMEM); |
|
} |
|
|
|
sprintf(nom_absolu, "%s/%s", racine_segment, nom); |
if (unlink(nom) == -1) |
semctl(semget(ftok(nom_absolu, 1), 0, 0), 0, IPC_RMID); |
|
|
|
if (unlink(nom_absolu) == -1) |
|
{ |
{ |
free(nom_absolu); |
|
return(EACCES); |
return(EACCES); |
} |
} |
|
|
free(nom_absolu); |
|
return(0); |
return(0); |
# else |
# else |
|
|