--- rpl/src/semaphores.c 2011/09/21 10:33:40 1.38 +++ rpl/src/semaphores.c 2011/10/10 10:58:12 1.39 @@ -22,6 +22,7 @@ #include "rpl-conv.h" + #ifdef SEMAPHORES_NOMMES // Les fonctions suivantes ne sont utilisées que dans le cas d'un @@ -334,56 +335,49 @@ sem_init_SysV(sem_t *semaphore, int shar return(ios); # else // OS/2 + sem_t *psem; - sem_t *psem; - - psem = semaphore; - - if (shared != 0) - { - errno = ENOSYS; - return(-1); - } - - if (((*psem).cnt = malloc(sizeof(ULONG))) == NULL) - { - free(psem); - errno = ENOMEM; - return(-1); - } + psem = semaphore; - if (((*psem).nopened = malloc(sizeof(ULONG))) == NULL) - { - free((*psem).cnt); - free(psem); - errno = ENOMEM; - return(-1); - } + if (((*psem).cnt = malloc(sizeof(ULONG))) == NULL) + { + free(psem); + errno = ENOMEM; + return(-1); + } - if (DosCreateMutexSem(NULL, &((*psem).hmtx), 0, 0) != 0) - { - free((*psem).cnt); - free((*psem).nopened); - free(psem); - return(-1); - } + if (((*psem).nopened = malloc(sizeof(ULONG))) == NULL) + { + free((*psem).cnt); + free(psem); + errno = ENOMEM; + return(-1); + } - if (DosCreateEventSem(NULL, &((*psem).hev), 0, (valeur != 0) ? 1 : 0) != 0) - { - DosCloseMutexSem((*psem).hmtx); - free((*psem).cnt); - free((*psem).nopened); - free(psem); - return(-1); - } + if (DosCreateMutexSem(NULL, &((*psem).hmtx), 0, 0) != 0) + { + free((*psem).cnt); + free((*psem).nopened); + free(psem); + return(-1); + } - (*(*psem).cnt) = valeur; - (*(*psem).nopened) = 1; - (*psem).shared = shared; - (*psem).allocated = 0; + if (DosCreateEventSem(NULL, &((*psem).hev), 0, (valeur != 0) ? 1 : 0) + != 0) + { + DosCloseMutexSem((*psem).hmtx); + free((*psem).cnt); + free((*psem).nopened); + free(psem); + return(-1); + } - return(0); + (*(*psem).cnt) = valeur; + (*(*psem).nopened) = 1; + (*psem).shared = shared; + (*psem).allocated = 0; + return(0); # endif } @@ -410,48 +404,46 @@ sem_destroy_SysV(sem_t *semaphore) return(0); # else // OS/2 + sem_t *psem; - sem_t *psem; - - psem = semaphore; + psem = semaphore; - if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) - { - return(EINVAL); - } + if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) + { + return(EINVAL); + } - if (DosCloseMutexSem((*psem).hmtx) != 0) - { - return(EINVAL); - } + if (DosCloseMutexSem((*psem).hmtx) != 0) + { + return(EINVAL); + } - while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY) - { - DosPostEventSem((*psem).hev); - } + while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY) + { + DosPostEventSem((*psem).hev); + } - (*(*psem).nopened)--; + (*(*psem).nopened)--; - if ((*psem).shared == 0) - { - free((*psem).cnt); - free((*psem).nopened); - } - else - { - if ((*(*psem).nopened) == 0) + if ((*psem).shared == 0) { - DosFreeMem((*psem).cnt); + free((*psem).cnt); + free((*psem).nopened); + } + else + { + if ((*(*psem).nopened) == 0) + { + DosFreeMem((*psem).cnt); + } } - } - - if ((*psem).allocated != 0) - { - free(psem); - } - return(0); + if ((*psem).allocated != 0) + { + free(psem); + } + return(0); # endif } @@ -476,38 +468,36 @@ sem_wait_SysV(sem_t *semaphore) return(0); # else // OS/2 + sem_t *psem; - sem_t *psem; - - ULONG cnt; + ULONG cnt; - psem = semaphore; + psem = semaphore; - if (DosWaitEventSem((*psem).hev, SEM_INDEFINITE_WAIT) != 0) - { - errno = EINVAL; - return(-1); - } - - if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) - { - errno = EINVAL; - return(-1); - } + if (DosWaitEventSem((*psem).hev, SEM_INDEFINITE_WAIT) != 0) + { + errno = EINVAL; + return(-1); + } - if ((*(*psem).cnt) > 0) - { - (*(*psem).cnt)--; - } + if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) + { + errno = EINVAL; + return(-1); + } - if ((*(*psem).cnt) == 0) - { - DosResetEventSem((*psem).hev, &cnt); - } + if ((*(*psem).cnt) > 0) + { + (*(*psem).cnt)--; + } - DosReleaseMutexSem((*psem).hmtx); - return(0); + if ((*(*psem).cnt) == 0) + { + DosResetEventSem((*psem).hev, &cnt); + } + DosReleaseMutexSem((*psem).hmtx); + return(0); # endif } @@ -532,40 +522,38 @@ sem_trywait_SysV(sem_t *semaphore) return(0); # else // OS/2 + int ios; - int ios; - - sem_t *psem; - - ULONG cnt; + sem_t *psem; - psem = semaphore; + ULONG cnt; - if ((ios = DosWaitEventSem((*psem).hev, SEM_IMMEDIATE_RETURN)) != 0) - { - errno = (ios == ERROR_TIMEOUT) ? EAGAIN : EINVAL; - return(-1); - } + psem = semaphore; - if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) - { - errno = EINVAL; - return(-1); - } + if ((ios = DosWaitEventSem((*psem).hev, SEM_IMMEDIATE_RETURN)) != 0) + { + errno = (ios == ERROR_TIMEOUT) ? EAGAIN : EINVAL; + return(-1); + } - if ((*(*psem).cnt) > 0) - { - (*(*psem).cnt)--; - } + if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) + { + errno = EINVAL; + return(-1); + } - if ((*(*psem).cnt) == 0) - { - DosResetEventSem((*psem).hev, &cnt); - } + if ((*(*psem).cnt) > 0) + { + (*(*psem).cnt)--; + } - DosReleaseMutexSem((*psem).hmtx); - return(0); + if ((*(*psem).cnt) == 0) + { + DosResetEventSem((*psem).hev, &cnt); + } + DosReleaseMutexSem((*psem).hmtx); + return(0); # endif } @@ -590,23 +578,21 @@ sem_post_SysV(sem_t *semaphore) return(0); # else // OS/2 + sem_t *psem; - sem_t *psem; - - psem = semaphore; - - if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) - { - errno = EINVAL; - return(-1); - } + psem = semaphore; - (*(*psem).cnt)++; - DosPostEventSem((*psem).hev); - DosReleaseMutexSem((*psem).hmtx); + if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) + { + errno = EINVAL; + return(-1); + } - return(0); + (*(*psem).cnt)++; + DosPostEventSem((*psem).hev); + DosReleaseMutexSem((*psem).hmtx); + return(0); # endif } @@ -623,22 +609,20 @@ sem_getvalue_SysV(sem_t *semaphore, int return(0); # else + sem_t *psem; - sem_t *psem; + psem = semaphore; - psem = semaphore; - - if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) - { - errno = EINVAL; - return(-1); - } - - (*valeur) = (*(*psem).cnt); - DosReleaseMutexSem((*psem).hmtx); + if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) + { + errno = EINVAL; + return(-1); + } - return(0); + (*valeur) = (*(*psem).cnt); + DosReleaseMutexSem((*psem).hmtx); + return(0); # endif } @@ -692,54 +676,52 @@ 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) - { - return(SEM_FAILED); - } - - sprintf(nom_segment, "%s%s", racine_memoire_OS2, nom); - ptr = nom_segment; - - while((*ptr) != d_code_fin_chaine) - { - if ((*ptr) == '/') + if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1) + * sizeof(unsigned char))) == NULL) { - (*ptr) = '\\'; - } + return(SEM_FAILED); + } - ptr++; - } + sprintf(nom_segment, "%s%s", racine_memoire_OS2, nom); + ptr = nom_segment; - if ((nom_absolu = malloc((strlen(racine_semaphores_OS2) + strlen(nom) - + 2) * sizeof(unsigned char))) == NULL) - { - return(SEM_FAILED); - } + while((*ptr) != d_code_fin_chaine) + { + if ((*ptr) == '/') + { + (*ptr) = '\\'; + } - sprintf(nom_absolu, "%s%s", racine_semaphores_OS2, nom); - ptr = nom_absolu; + ptr++; + } - while((*ptr) != d_code_fin_chaine) - { - if ((*ptr) == '/') + if ((nom_absolu = malloc((strlen(racine_semaphores_OS2) + strlen(nom) + + 2) * sizeof(unsigned char))) == NULL) { - (*ptr) = '\\'; + return(SEM_FAILED); } - ptr++; - } + sprintf(nom_absolu, "%s%s", racine_semaphores_OS2, nom); + ptr = nom_absolu; + + while((*ptr) != d_code_fin_chaine) + { + if ((*ptr) == '/') + { + (*ptr) = '\\'; + } - (*(ptr + 1)) = d_code_fin_chaine; + ptr++; + } - if ((psem = malloc(sizeof(sem_t))) == NULL) - { - return(SEM_FAILED); - } + (*(ptr + 1)) = d_code_fin_chaine; - (*psem).allocated = 1; + if ((psem = malloc(sizeof(sem_t))) == NULL) + { + return(SEM_FAILED); + } + (*psem).allocated = 1; # endif if ((oflag & O_CREAT) == 0) @@ -766,71 +748,71 @@ sem_t return(SEM_FAILED); } # else // OS/2 - if ((psem = malloc(sizeof(sem_t))) == NULL) - { - free(nom_absolu); - free(nom_segment); - return(SEM_FAILED); - } - - (*ptr) = 'M'; + if ((psem = malloc(sizeof(sem_t))) == NULL) + { + free(nom_absolu); + free(nom_segment); + return(SEM_FAILED); + } - if (DosOpenMutexSem(nom_absolu, &((*psem).hmtx)) != 0) - { - free(psem); - free(nom_absolu); - free(nom_segment); + (*ptr) = 'M'; - return(SEM_FAILED); - } + if (DosOpenMutexSem(nom_absolu, &((*psem).hmtx)) != 0) + { + free(psem); + free(nom_absolu); + free(nom_segment); - (*ptr) = 'S'; + return(SEM_FAILED); + } - if (DosOpenEventSem(nom_absolu, &((*psem).hev)) != 0) - { - DosCloseMutexSem((*psem).hmtx); + (*ptr) = 'S'; - free(psem); - free(nom_absolu); - free(nom_segment); + if (DosOpenEventSem(nom_absolu, &((*psem).hev)) != 0) + { + DosCloseMutexSem((*psem).hmtx); - return(SEM_FAILED); - } + free(psem); + free(nom_absolu); + free(nom_segment); - if (DosGetNamedSharedMem(&base, nom_segment, PAG_WRITE | PAG_READ) != 0) - { - DosCloseMutexSem((*psem).hmtx); + return(SEM_FAILED); + } - free(nom_absolu); - free(nom_segment); - free(psem); + if (DosGetNamedSharedMem(&base, nom_segment, PAG_WRITE | PAG_READ) + != 0) + { + DosCloseMutexSem((*psem).hmtx); - return(SEM_FAILED); - } + free(nom_absolu); + free(nom_segment); + free(psem); - free(nom_segment); + return(SEM_FAILED); + } - (*psem).cnt = (ULONG *) base; - (*psem).nopened = ((ULONG *) base) + 1; - (*psem).shared = 1; + free(nom_segment); - if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) - { - DosCloseMutexSem((*psem).hmtx); + (*psem).cnt = (ULONG *) base; + (*psem).nopened = ((ULONG *) base) + 1; + (*psem).shared = 1; - free(nom_absolu); - free(nom_segment); - free(psem); + if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0) + { + DosCloseMutexSem((*psem).hmtx); - return(SEM_FAILED); - } + free(nom_absolu); + free(nom_segment); + free(psem); - (*((*psem).nopened))++; + return(SEM_FAILED); + } - DosReleaseMutexSem((*psem).hmtx); + (*((*psem).nopened))++; - semaphore = psem; + DosReleaseMutexSem((*psem).hmtx); + semaphore = psem; # endif } else @@ -884,61 +866,59 @@ sem_t argument.val = valeur; semctl((*semaphore).sem, 0, SETVAL, argument); # else // OS/2 + if ((psem = malloc(sizeof(sem_t))) == NULL) + { + free(nom_absolu); + free(nom_segment); - if ((psem = malloc(sizeof(sem_t))) == NULL) - { - free(nom_absolu); - free(nom_segment); - - return(SEM_FAILED); - } + return(SEM_FAILED); + } - (*ptr) = 'M'; + (*ptr) = 'M'; - if (DosCreateMutexSem(nom_absolu, &((*psem).hmtx), 0, 0) != 0) - { - free(psem); - free(nom_absolu); - free(nom_segment); + if (DosCreateMutexSem(nom_absolu, &((*psem).hmtx), 0, 0) != 0) + { + free(psem); + free(nom_absolu); + free(nom_segment); - return(SEM_FAILED); - } + return(SEM_FAILED); + } - (*ptr) = 'S'; + (*ptr) = 'S'; - if (DosCreateEventSem(nom_absolu, &((*psem).hev), 0, - (valeur != 0) ? 1 : 0) != 0) - { - DosCloseMutexSem((*psem).hmtx); - - free(nom_absolu); - free(nom_segment); - free(psem); + if (DosCreateEventSem(nom_absolu, &((*psem).hev), 0, + (valeur != 0) ? 1 : 0) != 0) + { + DosCloseMutexSem((*psem).hmtx); - return(SEM_FAILED); - } + free(nom_absolu); + free(nom_segment); + free(psem); - if (DosAllocSharedMem(&base, nom_segment, 2 * sizeof(ULONG), - PAG_WRITE | PAG_READ | PAG_COMMIT) != 0) - { - DosCloseMutexSem((*psem).hmtx); + return(SEM_FAILED); + } - free(nom_absolu); - free(nom_segment); - free(psem); + if (DosAllocSharedMem(&base, nom_segment, 2 * sizeof(ULONG), + PAG_WRITE | PAG_READ | PAG_COMMIT) != 0) + { + DosCloseMutexSem((*psem).hmtx); - return(SEM_FAILED); - } + free(nom_absolu); + free(nom_segment); + free(psem); - free(nom_segment); + return(SEM_FAILED); + } - (*psem).cnt = (ULONG *) base; - (*psem).nopened = ((ULONG *) base) + 1; - (*(*psem).cnt) = valeur; - (*(*psem).nopened) = 1; - (*psem).shared = 1; - semaphore = psem; + free(nom_segment); + (*psem).cnt = (ULONG *) base; + (*psem).nopened = ((ULONG *) base) + 1; + (*(*psem).cnt) = valeur; + (*(*psem).nopened) = 1; + (*psem).shared = 1; + semaphore = psem; # endif } @@ -962,43 +942,41 @@ sem_close_SysV(sem_t *semaphore) return(0); # else + sem_t *psem; - sem_t *psem; - - psem = semaphore; + psem = semaphore; - if (DosCloseMutexSem((*psem).hmtx) != 0) - { - return(EINVAL); - } + if (DosCloseMutexSem((*psem).hmtx) != 0) + { + return(EINVAL); + } - while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY) - { - DosPostEventSem((*psem).hev); - } + while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY) + { + DosPostEventSem((*psem).hev); + } - (*(*psem).nopened)--; + (*(*psem).nopened)--; - if ((*psem).shared == 0) - { - free((*psem).cnt); - free((*psem).nopened); - } - else - { - if ((*(*psem).nopened) == 0) + if ((*psem).shared == 0) { - DosFreeMem((*psem).cnt); + free((*psem).cnt); + free((*psem).nopened); + } + else + { + if ((*(*psem).nopened) == 0) + { + DosFreeMem((*psem).cnt); + } } - } - - if ((*psem).allocated != 0) - { - free(psem); - } - return(0); + if ((*psem).allocated != 0) + { + free(psem); + } + return(0); # endif } @@ -1018,9 +996,7 @@ sem_unlink_SysV(const char *nom) free(nom); return(0); # else - - return(0); - + return(0); # endif }