--- rpl/src/semaphores.c 2011/09/20 07:16:40 1.33 +++ rpl/src/semaphores.c 2011/09/21 10:33:40 1.38 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.3 + RPL/2 (R) version 4.1.4 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -29,7 +29,7 @@ // est dans ce cas. static unsigned char * -nom_segment_semaphore(pid_t pid) +nom_segment_semaphore(pid_t pid, int ordre) { unsigned char *fichier; @@ -38,7 +38,23 @@ nom_segment_semaphore(pid_t pid) 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); } @@ -56,44 +72,55 @@ nom_segment_semaphore(pid_t pid) */ sem_t * -sem_init2(unsigned int valeur, pid_t pid) +sem_init2(unsigned int valeur, pid_t pid, int ordre) { sem_t *semaphore; unsigned char *chemin; - unsigned int i; - if ((chemin = nom_segment_semaphore(pid)) == NULL) + if ((chemin = nom_segment_semaphore(pid, ordre)) == NULL) { 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); - 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) - { - sem_close(semaphore); - return(SEM_FAILED); - } + return(SEM_FAILED); } + semaphore = sem_open(chemin, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR, + valeur); + free(chemin); + return(semaphore); } sem_t * -sem_open2(pid_t pid) +sem_open2(pid_t pid, int ordre) { unsigned char *chemin; 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); @@ -104,7 +131,7 @@ sem_open2(pid_t pid) int -sem_destroy2(sem_t *semaphore, pid_t pid) +sem_destroy2(sem_t *semaphore, pid_t pid, int ordre) { int erreur; @@ -112,7 +139,7 @@ sem_destroy2(sem_t *semaphore, pid_t pid sem_close(semaphore); - if ((chemin = nom_segment_semaphore(pid)) == NULL) + if ((chemin = nom_segment_semaphore(pid, ordre)) == NULL) { return(1); } @@ -123,6 +150,28 @@ sem_destroy2(sem_t *semaphore, pid_t pid 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); + } + + erreur = sem_unlink(chemin); + free(chemin); + + return(erreur); +} + + #undef sem_post #undef sem_wait #undef sem_trywait @@ -236,19 +285,20 @@ sem_init_SysV(sem_t *semaphore, int shar S_IRUSR | S_IWUSR); (*semaphore).path = NULL; (*semaphore).pid = getpid(); + (*semaphore).tid = pthread_self(); (*semaphore).alloue = 0; } else { // Sémaphore partagé entre plusieurs processus if (((*semaphore).path = malloc((strlen(racine_segment) - + 1 + 32 + 1) * sizeof(unsigned char))) == NULL) + + 2 + 256 + 1) * sizeof(unsigned char))) == NULL) { return(-1); } - sprintf((*semaphore).path, "%s/RPL-SIGSEMAPHORE-%d", racine_segment, - (int) getpid()); + sprintf((*semaphore).path, "%s/RPL-SEMAPHORE-%d-%llX-%d", + racine_segment, (int) getpid(), pthread_self(), shared); if ((desc = open((*semaphore).path, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1) @@ -258,6 +308,7 @@ sem_init_SysV(sem_t *semaphore, int shar } (*semaphore).pid = getpid(); + (*semaphore).tid = pthread_self(); clef = ftok((*semaphore).path, 1); close(desc); @@ -638,6 +689,8 @@ sem_t } (*semaphore).alloue = -1; + (*semaphore).pid = getpid(); + (*semaphore).tid = pthread_self(); # else if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1) @@ -954,24 +1007,15 @@ sem_unlink_SysV(const char *nom) { // Détruit un sémaphore nommé créé par sem_open_SysV() # ifndef OS2 // IPCS_SYSV - unsigned char *nom_absolu; - - if ((nom_absolu = malloc((strlen(racine_segment) + strlen(nom) - + 2) * sizeof(unsigned char))) == NULL) - { - return(ENOMEM); - } - - sprintf(nom_absolu, "%s/%s", racine_segment, nom); - semctl(semget(ftok(nom_absolu, 1), 0, 0), 0, IPC_RMID); + semctl(semget(ftok(nom, 1), 0, 0), 0, IPC_RMID); - if (unlink(nom_absolu) == -1) + if (unlink(nom) == -1) { free(nom_absolu); return(EACCES); } - free(nom_absolu); + free(nom); return(0); # else