--- rpl/src/semaphores.c 2015/01/05 13:12:42 1.66 +++ rpl/src/semaphores.c 2020/01/10 11:15:51 1.89 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.19 - Copyright (C) 1989-2015 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.32 + Copyright (C) 1989-2020 Dr. BERTRAND Joël This file is part of RPL/2. @@ -32,7 +32,7 @@ nom_segment_semaphore(pid_t pid, int ord { unsigned char *fichier; - if ((fichier = malloc((1 + 256 + 1) * sizeof(unsigned char))) == NULL) + if ((fichier = sys_malloc((1 + 256 + 1) * sizeof(unsigned char))) == NULL) { return(NULL); } @@ -47,7 +47,7 @@ nom_segment_semaphore_thread(pid_t pid, { unsigned char *fichier; - if ((fichier = malloc((1 + 256 + 1) * sizeof(unsigned char))) == NULL) + if ((fichier = sys_malloc((1 + 256 + 1) * sizeof(unsigned char))) == NULL) { return(NULL); } @@ -76,15 +76,47 @@ sem_init2(unsigned int valeur, pid_t pid sem_t *semaphore; unsigned char *chemin; + unsigned char *langue; if ((chemin = nom_segment_semaphore(pid, ordre)) == NULL) { return(SEM_FAILED); } - semaphore = sem_open(chemin, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, - valeur); - free(chemin); + if ((semaphore = sem_open(chemin, O_RDWR | O_CREAT | O_EXCL, + S_IRUSR | S_IWUSR, valeur)) == SEM_FAILED) + { + if (errno == EEXIST) + { + if ((langue = getenv("LANG")) != NULL) + { + if (strncmp(langue, "fr", 2) == 0) + { + uprintf("+++Attention : Le sémaphore %s préexiste !\n", + chemin); + } + else + { + uprintf("+++Warning: %s semaphore preexists!\n", chemin); + } + } + else + { + uprintf("+++Warning: %s semaphore preexists!\n", chemin); + } + + if (sem_unlink(chemin) != 0) + { + sys_free(chemin); + return(SEM_FAILED); + } + + semaphore = sem_open(chemin, O_RDWR | O_CREAT | O_EXCL, + S_IRUSR | S_IWUSR, valeur); + } + } + + sys_free(chemin); return(semaphore); } @@ -96,15 +128,41 @@ sem_init3(unsigned int valeur, pid_t pid sem_t *semaphore; unsigned char *chemin; + unsigned char *langue; if ((chemin = nom_segment_semaphore_thread(pid, tid, ordre)) == NULL) { return(SEM_FAILED); } - semaphore = sem_open(chemin, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR, - valeur); - free(chemin); + if ((semaphore = sem_open(chemin, O_RDWR | O_CREAT | O_EXCL, + S_IRUSR | S_IWUSR, valeur)) == SEM_FAILED) + { + if (errno == EEXIST) + { + if ((langue = getenv("LANG")) != NULL) + { + if (strncmp(langue, "fr", 2) == 0) + { + uprintf("+++Attention : Le sémaphore %s préexiste !\n", + chemin); + } + else + { + uprintf("+++Warning: %s semaphore preexists!\n", chemin); + } + } + else + { + uprintf("+++Warning: %s semaphore preexists!\n", chemin); + } + + semaphore = sem_open(chemin, O_RDWR | O_CREAT, + S_IRUSR | S_IWUSR, valeur); + } + } + + sys_free(chemin); return(semaphore); } @@ -123,7 +181,7 @@ sem_open2(pid_t pid, int ordre) } semaphore = sem_open(chemin, O_RDWR); - free(chemin); + sys_free(chemin); return(semaphore); } @@ -144,7 +202,7 @@ sem_destroy2(sem_t *semaphore, pid_t pid } erreur = sem_unlink(chemin); - free(chemin); + sys_free(chemin); return(erreur); } @@ -165,7 +223,7 @@ sem_destroy3(sem_t *semaphore, pid_t pid } erreur = sem_unlink(chemin); - free(chemin); + sys_free(chemin); return(erreur); } @@ -226,6 +284,7 @@ sem_getvalue2(sem_t *semaphore, int *val return(0); } + nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); } @@ -277,6 +336,8 @@ sem_init_SysV(sem_t *semaphore, int shar union semun argument; + unsigned char *langue; + if (shared == 0) { // Sémaphore privé @@ -290,7 +351,7 @@ sem_init_SysV(sem_t *semaphore, int shar else { // Sémaphore partagé entre plusieurs processus - if (((*semaphore).path = malloc((strlen(racine_segment) + if (((*semaphore).path = sys_malloc((strlen(racine_segment) + 2 + 256 + 1) * sizeof(unsigned char))) == NULL) { return(-1); @@ -304,8 +365,37 @@ sem_init_SysV(sem_t *semaphore, int shar if ((desc = open((*semaphore).path, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1) { - free((*semaphore).path); - return(-1); + if (errno != EEXIST) + { + sys_free((*semaphore).path); + return(-1); + } + + if ((langue = getenv("LANG")) != NULL) + { + if (strncmp(langue, "fr", 2) == 0) + { + uprintf("+++Attention : Le sémaphore %s préexiste !\n", + (*semaphore).path); + } + else + { + uprintf("+++Warning: %s semaphore preexists!\n", + (*semaphore).path); + } + } + else + { + uprintf("+++Warning: %s semaphore preexists!\n", + (*semaphore).path); + } + + if ((desc = open((*semaphore).path, O_RDWR | O_CREAT, + S_IRUSR | S_IWUSR)) == -1) + { + sys_free((*semaphore).path); + return(-1); + } } (*semaphore).pid = getpid(); @@ -315,7 +405,7 @@ sem_init_SysV(sem_t *semaphore, int shar if (clef == -1) { - free((*semaphore).path); + sys_free((*semaphore).path); return(-1); } @@ -339,26 +429,26 @@ sem_init_SysV(sem_t *semaphore, int shar psem = semaphore; - if (((*psem).cnt = malloc(sizeof(ULONG))) == NULL) + if (((*psem).cnt = sys_malloc(sizeof(ULONG))) == NULL) { - free(psem); + sys_free(psem); errno = ENOMEM; return(-1); } - if (((*psem).nopened = malloc(sizeof(ULONG))) == NULL) + if (((*psem).nopened = sys_malloc(sizeof(ULONG))) == NULL) { - free((*psem).cnt); - free(psem); + sys_free((*psem).cnt); + sys_free(psem); errno = ENOMEM; return(-1); } if (DosCreateMutexSem(NULL, &((*psem).hmtx), 0, 0) != 0) { - free((*psem).cnt); - free((*psem).nopened); - free(psem); + sys_free((*psem).cnt); + sys_free((*psem).nopened); + sys_free(psem); return(-1); } @@ -366,9 +456,9 @@ sem_init_SysV(sem_t *semaphore, int shar != 0) { DosCloseMutexSem((*psem).hmtx); - free((*psem).cnt); - free((*psem).nopened); - free(psem); + sys_free((*psem).cnt); + sys_free((*psem).nopened); + sys_free(psem); return(-1); } @@ -427,8 +517,8 @@ sem_destroy_SysV(sem_t *semaphore) if ((*psem).shared == 0) { - free((*psem).cnt); - free((*psem).nopened); + sys_free((*psem).cnt); + sys_free((*psem).nopened); } else { @@ -440,7 +530,7 @@ sem_destroy_SysV(sem_t *semaphore) if ((*psem).allocated != 0) { - free(psem); + sys_free(psem); } return(0); @@ -701,6 +791,8 @@ sem_t key_t clef; union semun argument; + + unsigned char *langue; # endif unsigned char *nom_absolu; @@ -719,7 +811,7 @@ sem_t # endif # ifndef OS2 // IPCS_SYSV - if ((nom_absolu = malloc((strlen(racine_segment) + strlen(nom) + if ((nom_absolu = sys_malloc((strlen(racine_segment) + strlen(nom) + 2) * sizeof(unsigned char))) == NULL) { return(SEM_FAILED); @@ -727,7 +819,7 @@ sem_t sprintf(nom_absolu, "%s/%s", racine_segment, nom); - if ((semaphore = malloc(sizeof(sem_t))) == NULL) + if ((semaphore = sys_malloc(sizeof(sem_t))) == NULL) { return(SEM_FAILED); } @@ -736,8 +828,8 @@ sem_t (*semaphore).pid = getpid(); (*semaphore).tid = pthread_self(); # else - if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1) - * sizeof(unsigned char))) == NULL) + if ((nom_segment = sys_malloc((strlen(racine_memoire_OS2) + strlen(nom) + + 1) * sizeof(unsigned char))) == NULL) { return(SEM_FAILED); } @@ -755,8 +847,8 @@ sem_t ptr++; } - if ((nom_absolu = malloc((strlen(racine_semaphores_OS2) + strlen(nom) - + 2) * sizeof(unsigned char))) == NULL) + if ((nom_absolu = sys_malloc((strlen(racine_semaphores_OS2) + + strlen(nom) + 2) * sizeof(unsigned char))) == NULL) { return(SEM_FAILED); } @@ -776,7 +868,7 @@ sem_t (*(ptr + 1)) = d_code_fin_chaine; - if ((psem = malloc(sizeof(sem_t))) == NULL) + if ((psem = sys_malloc(sizeof(sem_t))) == NULL) { return(SEM_FAILED); } @@ -802,16 +894,16 @@ sem_t if ((*semaphore).sem == -1) { - free(semaphore); - free(nom_absolu); + sys_free(semaphore); + sys_free(nom_absolu); return(SEM_FAILED); } # else // OS/2 - if ((psem = malloc(sizeof(sem_t))) == NULL) + if ((psem = sys_malloc(sizeof(sem_t))) == NULL) { - free(nom_absolu); - free(nom_segment); + sys_free(nom_absolu); + sys_free(nom_segment); return(SEM_FAILED); } @@ -819,9 +911,9 @@ sem_t if (DosOpenMutexSem(nom_absolu, &((*psem).hmtx)) != 0) { - free(psem); - free(nom_absolu); - free(nom_segment); + sys_free(psem); + sys_free(nom_absolu); + sys_free(nom_segment); return(SEM_FAILED); } @@ -832,9 +924,9 @@ sem_t { DosCloseMutexSem((*psem).hmtx); - free(psem); - free(nom_absolu); - free(nom_segment); + sys_free(psem); + sys_free(nom_absolu); + sys_free(nom_segment); return(SEM_FAILED); } @@ -844,14 +936,14 @@ sem_t { DosCloseMutexSem((*psem).hmtx); - free(nom_absolu); - free(nom_segment); - free(psem); + sys_free(nom_absolu); + sys_free(nom_segment); + sys_free(psem); return(SEM_FAILED); } - free(nom_segment); + sys_free(nom_segment); (*psem).cnt = (ULONG *) base; (*psem).nopened = ((ULONG *) base) + 1; @@ -861,9 +953,9 @@ sem_t { DosCloseMutexSem((*psem).hmtx); - free(nom_absolu); - free(nom_segment); - free(psem); + sys_free(nom_absolu); + sys_free(nom_segment); + sys_free(psem); return(SEM_FAILED); } @@ -891,17 +983,46 @@ sem_t if ((desc = open(nom_absolu, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR)) == -1) { - free(semaphore); - free(nom_absolu); + if (errno != EEXIST) + { + sys_free(semaphore); + sys_free(nom_absolu); + return(SEM_FAILED); + } - return(SEM_FAILED); + if ((langue = getenv("LANG")) != NULL) + { + if (strncmp(langue, "fr", 2) == 0) + { + uprintf("+++Attention : Le sémaphore %s préexiste !\n", + nom_absolu); + } + else + { + uprintf("+++Warning: %s semaphore preexists!\n", + nom_absolu); + } + } + else + { + uprintf("+++Warning: %s semaphore preexists!\n", + nom_absolu); + } + + if ((desc = open(nom_absolu, O_CREAT | O_RDWR, + S_IRUSR | S_IWUSR)) == -1) + { + sys_free(semaphore); + sys_free(nom_absolu); + return(SEM_FAILED); + } } if ((clef = ftok(nom_absolu, 1)) == -1) { close(desc); - free(semaphore); - free(nom_absolu); + sys_free(semaphore); + sys_free(nom_absolu); return(SEM_FAILED); } @@ -917,8 +1038,8 @@ sem_t if ((*semaphore).sem == -1) { - free(semaphore); - free(nom_absolu); + sys_free(semaphore); + sys_free(nom_absolu); return(SEM_FAILED); } @@ -926,10 +1047,10 @@ sem_t argument.val = (int) valeur; semctl((*semaphore).sem, 0, SETVAL, argument); # else // OS/2 - if ((psem = malloc(sizeof(sem_t))) == NULL) + if ((psem = sys_malloc(sizeof(sem_t))) == NULL) { - free(nom_absolu); - free(nom_segment); + sys_free(nom_absolu); + sys_free(nom_segment); return(SEM_FAILED); } @@ -938,9 +1059,9 @@ sem_t if (DosCreateMutexSem(nom_absolu, &((*psem).hmtx), 0, 0) != 0) { - free(psem); - free(nom_absolu); - free(nom_segment); + sys_free(psem); + sys_free(nom_absolu); + sys_free(nom_segment); return(SEM_FAILED); } @@ -952,9 +1073,9 @@ sem_t { DosCloseMutexSem((*psem).hmtx); - free(nom_absolu); - free(nom_segment); - free(psem); + sys_free(nom_absolu); + sys_free(nom_segment); + sys_free(psem); return(SEM_FAILED); } @@ -964,14 +1085,14 @@ sem_t { DosCloseMutexSem((*psem).hmtx); - free(nom_absolu); - free(nom_segment); - free(psem); + sys_free(nom_absolu); + sys_free(nom_segment); + sys_free(psem); return(SEM_FAILED); } - free(nom_segment); + sys_free(nom_segment); (*psem).cnt = (ULONG *) base; (*psem).nopened = ((ULONG *) base) + 1; @@ -992,12 +1113,12 @@ sem_close_SysV(sem_t *semaphore) # ifndef OS2 // IPCS_SYSV if ((*semaphore).path != NULL) { - free((*semaphore).path); + sys_free((*semaphore).path); } if ((*semaphore).alloue == -1) { - free(semaphore); + sys_free(semaphore); } return(0); @@ -1020,8 +1141,8 @@ sem_close_SysV(sem_t *semaphore) if ((*psem).shared == 0) { - free((*psem).cnt); - free((*psem).nopened); + sys_free((*psem).cnt); + sys_free((*psem).nopened); } else { @@ -1033,7 +1154,7 @@ sem_close_SysV(sem_t *semaphore) if ((*psem).allocated != 0) { - free(psem); + sys_free(psem); } return(0); @@ -1052,7 +1173,7 @@ sem_unlink_SysV(char *nom) return(EACCES); } - free(nom); + sys_free(nom); return(0); # else return(0);