Annotation of rpl/src/semaphores.c, revision 1.24

1.1       bertrand    1: /*
                      2: ================================================================================
1.24    ! bertrand    3:   RPL/2 (R) version 4.1.0.prerelease.4
1.16      bertrand    4:   Copyright (C) 1989-2011 Dr. BERTRAND Joël
1.1       bertrand    5: 
                      6:   This file is part of RPL/2.
                      7: 
                      8:   RPL/2 is free software; you can redistribute it and/or modify it
                      9:   under the terms of the CeCILL V2 License as published by the french
                     10:   CEA, CNRS and INRIA.
                     11:  
                     12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
                     13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
                     14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
                     15:   for more details.
                     16:  
                     17:   You should have received a copy of the CeCILL License
                     18:   along with RPL/2. If not, write to info@cecill.info.
                     19: ================================================================================
                     20: */
                     21: 
                     22: 
1.6       bertrand   23: #include "rpl-conv.h"
                     24: 
1.1       bertrand   25: #ifdef SEMAPHORES_NOMMES
                     26: 
                     27: /*
                     28: ================================================================================
                     29:   Fonctions d'émulation de sémaphores anonymes
                     30: ================================================================================
                     31:   Entrées :
                     32: --------------------------------------------------------------------------------
                     33:   Sorties :
                     34: --------------------------------------------------------------------------------
                     35:   Effets de bord : néant
                     36: ================================================================================
                     37: */
                     38: 
                     39: sem_t *
                     40: sem_init2(unsigned int valeur, enum t_semaphore semaphore)
                     41: {
                     42:    snprintf(noms_semaphores[semaphore], LONGUEUR_NOM_SEMAPHORE,
1.10      bertrand   43:            "/RPL-SEM-%d-%llu-%d", (int) getpid(),
1.1       bertrand   44:            (unsigned long long) pthread_self(),
                     45:            (int) semaphore);
                     46:    return(sem_open(noms_semaphores[semaphore], O_CREAT,
                     47:            (S_IRUSR | S_IWUSR), valeur));
                     48: }
                     49: 
                     50: int
                     51: sem_destroy2(sem_t *semaphore_p, enum t_semaphore semaphore)
                     52: {
                     53:    sem_close(semaphore_p);
                     54:    return(sem_unlink(noms_semaphores[semaphore]));
                     55: }
                     56: 
                     57: #undef sem_post
                     58: #undef sem_wait
                     59: #undef sem_trywait
                     60: 
                     61: int
                     62: sem_getvalue2(sem_t *semaphore, int *valeur)
                     63: {
                     64:    int                     i;
                     65: 
                     66:    logical1                drapeau_fin;
                     67: 
                     68:    pthread_mutex_lock(&mutex_sem);
                     69: 
                     70:    (*valeur) = 0;
                     71:    drapeau_fin = d_faux;
                     72: 
                     73:    do
                     74:    {
                     75:        if (sem_trywait(semaphore) == -1)
                     76:        {
                     77:            if (errno == EAGAIN)
                     78:            {
                     79:                // Le sémaphore avait une valeur nulle
                     80:                drapeau_fin = d_vrai;
                     81:            }
                     82:            else
                     83:            {
                     84:                // Autre erreur
                     85:                pthread_mutex_unlock(&mutex_sem);
                     86:                return(-1);
                     87:            }
                     88:        }
                     89:        else
                     90:        {
                     91:            (*valeur)++;
                     92:        }
                     93:    } while(drapeau_fin == d_faux);
                     94: 
                     95:    for(i = 0; i < (*valeur); i++)
                     96:    {
                     97:        if (sem_post(semaphore) != 0)
                     98:        {
                     99:            pthread_mutex_unlock(&mutex_sem);
                    100:            return(-1);
                    101:        }
                    102:    }
                    103: 
                    104:    pthread_mutex_unlock(&mutex_sem);
                    105:    return(0);
                    106: }
                    107: 
                    108: #endif
                    109: 
1.14      bertrand  110: #ifdef IPCS_SYSV
1.6       bertrand  111: 
                    112: /*
                    113: ================================================================================
                    114:   Fonctions d'émulation de sémaphores POSIX en fonction des sémaphores SysV
                    115: ================================================================================
                    116:   Entrées :
                    117: --------------------------------------------------------------------------------
                    118:   Sorties :
                    119: --------------------------------------------------------------------------------
                    120:   Effets de bord : néant
                    121: ================================================================================
                    122: */
                    123: 
1.9       bertrand  124: #ifndef OS2
                    125:    extern unsigned char *chemin_semaphores_SysV;
                    126: #else
                    127:    unsigned char racine_semaphores_OS2[] = "\\SEM32\\";
1.14      bertrand  128:    unsigned char racine_memoire_OS2[] = "\\SHAREMEM\\";
1.9       bertrand  129: #endif
1.6       bertrand  130: 
                    131: int
1.8       bertrand  132: sem_init_SysV(sem_t *semaphore, int shared, unsigned int valeur)
1.6       bertrand  133: {
1.11      bertrand  134:    // Création d'un sémaphore anonyme qui devra être supprimé par
                    135:    // sem_destroy_SysV
1.9       bertrand  136: #  ifndef OS2
                    137: 
1.8       bertrand  138:    int             ios;
                    139: 
1.6       bertrand  140:    union semun     argument;
                    141: 
                    142:    if (shared != 0)
                    143:    {
1.9       bertrand  144:        errno = ENOSYS;
                    145:        return(-1);
1.6       bertrand  146:    }
                    147: 
1.11      bertrand  148:    (*semaphore).sem = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL |
                    149:            S_IRUSR | S_IWUSR);
                    150:    (*semaphore).path = NULL;
                    151:    (*semaphore).pid = getpid();
1.6       bertrand  152: 
1.11      bertrand  153:    if ((*semaphore).sem == -1)
1.6       bertrand  154:    {
1.9       bertrand  155:        errno = EINVAL;
                    156:        return(-1);
1.6       bertrand  157:    }
                    158: 
                    159:    argument.val = valeur;
1.11      bertrand  160:    ios = semctl((*semaphore).sem, 0, SETVAL, argument);
1.6       bertrand  161: 
1.8       bertrand  162:    return(ios);
1.9       bertrand  163: 
                    164: #  else
                    165: 
                    166:    sem_t           *psem;
                    167: 
                    168:    psem = semaphore;
                    169: 
                    170:    if (shared != 0)
                    171:    {
                    172:        errno = ENOSYS;
                    173:        return(-1);
                    174:    }
                    175: 
                    176:    if (((*psem).cnt = malloc(sizeof(ULONG))) == NULL)
                    177:    {
                    178:        free(psem);
                    179:        errno = ENOMEM;
                    180:        return(-1);
                    181:    }
                    182: 
                    183:    if (((*psem).nopened = malloc(sizeof(ULONG))) == NULL)
                    184:    {
                    185:        free((*psem).cnt);
                    186:        free(psem);
                    187:        errno = ENOMEM;
                    188:        return(-1);
                    189:    }
                    190: 
                    191:    if (DosCreateMutexSem(NULL, &((*psem).hmtx), 0, 0) != 0)
                    192:    {
                    193:        free((*psem).cnt);
                    194:        free((*psem).nopened);
                    195:        free(psem);
                    196:        return(-1);
                    197:    }
                    198: 
                    199:    if (DosCreateEventSem(NULL, &((*psem).hev), 0, (valeur != 0) ? 1 : 0) != 0)
                    200:    {
                    201:        DosCloseMutexSem((*psem).hmtx);
                    202:        free((*psem).cnt);
                    203:        free((*psem).nopened);
                    204:        free(psem);
                    205:        return(-1);
                    206:    }
                    207: 
                    208:    (*(*psem).cnt) = valeur;
                    209:    (*(*psem).nopened) = 1;
                    210:    (*psem).shared = shared;
                    211:    (*psem).allocated = 0;
                    212: 
                    213:    return(0);
                    214: 
                    215: #  endif
1.6       bertrand  216: }
                    217: 
                    218: int
1.8       bertrand  219: sem_destroy_SysV(sem_t *semaphore)
1.6       bertrand  220: {
1.11      bertrand  221:    // Détruit un sémaphore anonmyme
1.9       bertrand  222: #  ifndef OS2
                    223: 
1.11      bertrand  224:    if ((*semaphore).path != NULL)
                    225:    {
                    226:        return(EINVAL);
                    227:    }
                    228: 
                    229:    if ((*semaphore).pid != getpid())
                    230:    {
                    231:        return(0);
                    232:    }
                    233: 
1.12      bertrand  234:    if (semctl((*semaphore).sem, 0, IPC_RMID) == -1)
1.6       bertrand  235:    {
                    236:        return(EINVAL);
                    237:    }
                    238: 
                    239:    return(0);
1.9       bertrand  240: 
                    241: #  else
                    242: 
                    243:    sem_t       *psem;
                    244: 
                    245:    psem = semaphore;
                    246: 
                    247:    if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
                    248:    {
                    249:        return(EINVAL);
                    250:    }
                    251: 
                    252:    if (DosCloseMutexSem((*psem).hmtx) != 0)
                    253:    {
                    254:        return(EINVAL);
                    255:    }
                    256: 
                    257:    while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY)
                    258:    {
                    259:        DosPostEventSem((*psem).hev);
                    260:    }
                    261: 
                    262:    (*(*psem).nopened)--;
                    263: 
                    264:    if ((*psem).shared == 0)
                    265:    {
                    266:        free((*psem).cnt);
                    267:        free((*psem).nopened);
                    268:    }
                    269:    else
                    270:    {
                    271:        if ((*(*psem).nopened) == 0)
                    272:        {
                    273:            DosFreeMem((*psem).cnt);
                    274:        }
                    275:    }
                    276: 
                    277:    if ((*psem).allocated != 0)
                    278:    {   
                    279:        free(psem);
                    280:    }
                    281: 
                    282:    return(0);
                    283: 
                    284: #  endif
1.6       bertrand  285: }
                    286: 
                    287: int
1.8       bertrand  288: sem_wait_SysV(sem_t *semaphore)
1.6       bertrand  289: {
1.9       bertrand  290: #  ifndef OS2
                    291: 
1.6       bertrand  292:    struct sembuf       commande;
                    293: 
                    294:    commande.sem_num = 0;
                    295:    commande.sem_op = -1;
                    296:    commande.sem_flg = 0;
                    297: 
1.11      bertrand  298:    while(semop((*semaphore).sem, &commande, 1) == -1)
1.6       bertrand  299:    {
1.11      bertrand  300:        if (errno != EINTR)
                    301:        {
                    302:            errno = EINVAL;
                    303:            return(-1);
                    304:        }
1.9       bertrand  305:    }
                    306: 
                    307:    return(0);
                    308: 
                    309: #  else
                    310: 
                    311:    sem_t       *psem;
                    312: 
                    313:    ULONG       cnt;
                    314: 
                    315:    psem = semaphore;
                    316: 
                    317:    if (DosWaitEventSem((*psem).hev, SEM_INDEFINITE_WAIT) != 0)
                    318:    {
                    319:        errno = EINVAL;
                    320:        return(-1);
                    321:    }
                    322: 
                    323:    if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
                    324:    {
                    325:        errno = EINVAL;
                    326:        return(-1);
                    327:    }
                    328: 
                    329:    if ((*(*psem).cnt) > 0)
                    330:    {
                    331:        (*(*psem).cnt)--;
                    332:    }
                    333: 
                    334:    if ((*(*psem).cnt) == 0)
                    335:    {
                    336:        DosResetEventSem((*psem).hev, &cnt);
1.6       bertrand  337:    }
                    338: 
1.9       bertrand  339:    DosReleaseMutexSem((*psem).hmtx);
1.6       bertrand  340:    return(0);
1.9       bertrand  341: 
                    342: #  endif
1.6       bertrand  343: }
                    344: 
                    345: int
1.8       bertrand  346: sem_trywait_SysV(sem_t *semaphore)
1.6       bertrand  347: {
1.9       bertrand  348: #  ifndef OS2
                    349: 
1.6       bertrand  350:    struct sembuf       commande;
                    351: 
                    352:    commande.sem_num = 0;
                    353:    commande.sem_op = -1;
                    354:    commande.sem_flg = IPC_NOWAIT;
                    355: 
1.11      bertrand  356:    while(semop((*semaphore).sem, &commande, 1) == -1)
1.6       bertrand  357:    {
1.11      bertrand  358:        if (errno != EINTR)
                    359:        {
                    360:            errno = EINVAL;
                    361:            return(-1);
                    362:        }
1.9       bertrand  363:    }
                    364: 
                    365:    return(0);
                    366: 
                    367: #  else
                    368: 
                    369:    int         ios;
                    370: 
                    371:    sem_t       *psem;
                    372: 
                    373:    ULONG       cnt;
                    374: 
                    375:    psem = semaphore;
                    376: 
                    377:    if ((ios = DosWaitEventSem((*psem).hev, SEM_IMMEDIATE_RETURN)) != 0)
                    378:    {
                    379:        errno = (ios == ERROR_TIMEOUT) ? EAGAIN : EINVAL;
                    380:        return(-1);
                    381:    }
                    382: 
                    383:    if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
                    384:    {
                    385:        errno = EINVAL;
                    386:        return(-1);
                    387:    }
                    388: 
                    389:    if ((*(*psem).cnt) > 0)
                    390:    {
                    391:        (*(*psem).cnt)--;
                    392:    }
1.6       bertrand  393: 
1.9       bertrand  394:    if ((*(*psem).cnt) == 0)
                    395:    {
                    396:        DosResetEventSem((*psem).hev, &cnt);
1.6       bertrand  397:    }
                    398: 
1.9       bertrand  399:    DosReleaseMutexSem((*psem).hmtx);
1.6       bertrand  400:    return(0);
1.9       bertrand  401: 
                    402: #  endif
1.6       bertrand  403: }
                    404: 
                    405: int
1.8       bertrand  406: sem_post_SysV(sem_t *semaphore)
1.6       bertrand  407: {
1.9       bertrand  408: #  ifndef OS2
                    409: 
1.6       bertrand  410:    struct sembuf       commande;
                    411: 
                    412:    commande.sem_num = 0;
                    413:    commande.sem_op = 1;
                    414:    commande.sem_flg = 0;
                    415: 
1.11      bertrand  416:    while(semop((*semaphore).sem, &commande, 1) == -1)
1.6       bertrand  417:    {
1.11      bertrand  418:        if (errno != EINTR)
                    419:        {
                    420:            errno = EINVAL;
                    421:            return(-1);
                    422:        }
1.9       bertrand  423:    }
                    424: 
                    425:    return(0);
                    426: 
                    427: #  else
                    428: 
                    429:    sem_t               *psem;
                    430: 
                    431:    psem = semaphore;
                    432: 
                    433:    if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
                    434:    {
                    435:        errno = EINVAL;
                    436:        return(-1);
1.6       bertrand  437:    }
                    438: 
1.9       bertrand  439:    (*(*psem).cnt)++;
                    440:    DosPostEventSem((*psem).hev);
                    441:    DosReleaseMutexSem((*psem).hmtx);
                    442: 
1.6       bertrand  443:    return(0);
1.9       bertrand  444: 
                    445: #  endif
1.6       bertrand  446: }
                    447: 
                    448: int
1.8       bertrand  449: sem_getvalue_SysV(sem_t *semaphore, int *valeur)
1.6       bertrand  450: {
1.9       bertrand  451: #  ifndef OS2
                    452: 
1.11      bertrand  453:    (*valeur) = semctl((*semaphore).sem, 0, GETVAL);
1.6       bertrand  454: 
                    455:    if ((*valeur) < 0)
                    456:    {
                    457:        return(EINVAL);
                    458:    }
                    459: 
                    460:    return(0);
1.9       bertrand  461: 
                    462: #  else
                    463: 
                    464:    sem_t               *psem;
                    465: 
                    466:    psem = semaphore;
                    467: 
                    468:    if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
                    469:    {
                    470:        errno = EINVAL;
                    471:        return(-1);
                    472:    }
                    473: 
                    474:    (*valeur) = (*(*psem).cnt);
                    475:    DosReleaseMutexSem((*psem).hmtx);
                    476: 
                    477:    return(0);
                    478: 
                    479: #  endif
1.6       bertrand  480: }
                    481: 
                    482: sem_t
1.8       bertrand  483: *sem_open_SysV(const char *nom, int oflag, ...)
1.6       bertrand  484: //*sem_open(const char *nom, int oflag)
                    485: //*sem_open(const char *nom, int oflag, mode_t mode, unsigned int value)
                    486: {
                    487:    mode_t              mode;
                    488: 
                    489:    sem_t               *semaphore;
                    490: 
1.9       bertrand  491: #  ifndef OS2
1.10      bertrand  492:    file                *desc;
                    493: 
                    494:    key_t               clef;
                    495: 
1.6       bertrand  496:    union semun         argument;
1.9       bertrand  497: #  endif
1.6       bertrand  498: 
                    499:    unsigned char       *nom_absolu;
                    500: 
                    501:    unsigned int        valeur;
                    502: 
                    503:    va_list             liste;
                    504: 
1.9       bertrand  505: #  ifdef OS2
                    506:    sem_t               *psem;
                    507: 
                    508:    PVOID               base;
                    509: 
                    510:    unsigned char       *ptr;
                    511:    unsigned char       *nom_segment;
                    512: #  endif
                    513: 
                    514: #  ifndef OS2
                    515: 
1.6       bertrand  516:    if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)
                    517:            + 1) * sizeof(unsigned char))) == NULL)
                    518:    {
                    519:        return(SEM_FAILED);
                    520:    }
                    521: 
                    522:    sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);
                    523: 
                    524:    if ((semaphore = malloc(sizeof(sem_t))) == NULL)
                    525:    {
                    526:        return(SEM_FAILED);
                    527:    }
                    528: 
1.9       bertrand  529: #  else
                    530: 
                    531:    if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1)
                    532:            * sizeof(unsigned char))) == NULL)
                    533:    {
                    534:        return(SEM_FAILED);
                    535:    }   
                    536: 
                    537:    sprintf(nom_segment, "%s%s", racine_memoire_OS2, nom);
                    538:    ptr = nom_segment;
                    539: 
                    540:    while((*ptr) != d_code_fin_chaine)
                    541:    {
                    542:        if ((*ptr) == '/')
                    543:        {
                    544:            (*ptr) = '\\';
                    545:        }
                    546: 
                    547:        ptr++;
                    548:    }
                    549: 
                    550:    if ((nom_absolu = malloc((strlen(racine_semaphores_OS2) + strlen(nom)
                    551:            + 2) * sizeof(unsigned char))) == NULL)
                    552:    {
                    553:        return(SEM_FAILED);
                    554:    }
                    555: 
                    556:    sprintf(nom_absolu, "%s%s", racine_semaphores_OS2, nom);
                    557:    ptr = nom_absolu;
                    558: 
                    559:    while((*ptr) != d_code_fin_chaine)
                    560:    {
                    561:        if ((*ptr) == '/')
                    562:        {
                    563:            (*ptr) = '\\';
                    564:        }
                    565: 
                    566:        ptr++;
                    567:    }
                    568: 
                    569:    (*(ptr + 1)) = d_code_fin_chaine;
                    570: 
                    571:    if ((psem = malloc(sizeof(sem_t))) == NULL)
                    572:    {
                    573:        return(SEM_FAILED);
                    574:    }
                    575: 
1.11      bertrand  576:    (*psem).allocated = 1;
                    577: 
1.9       bertrand  578: #  endif
                    579: 
1.6       bertrand  580:    if ((oflag & O_CREAT) == 0)
                    581:    {
                    582:        // 2 arguments
1.9       bertrand  583: 
                    584: #      ifndef OS2
                    585: 
1.11      bertrand  586:        clef = ftok(nom_absolu, 1);
                    587: 
                    588:        if (clef == -1)
                    589:        {
                    590:            return(SEM_FAILED);
                    591:        }
                    592: 
                    593:        (*semaphore).sem = semget(clef, 0, 0);
                    594:        (*semaphore).path = nom_absolu;
                    595:        (*semaphore).pid = getpid();
1.6       bertrand  596: 
1.11      bertrand  597:        if ((*semaphore).sem == -1)
1.6       bertrand  598:        {   
                    599:            free(semaphore);
                    600:            free(nom_absolu);
                    601: 
                    602:            return(SEM_FAILED);
                    603:        }
1.9       bertrand  604: 
                    605: #      else
                    606: 
                    607:        if ((psem = malloc(sizeof(sem_t))) == NULL)
                    608:        {
                    609:            free(nom_absolu);
                    610:            free(nom_segment);
                    611:            return(SEM_FAILED);
                    612:        }
                    613: 
                    614:        (*ptr) = 'M';
                    615: 
                    616:        if (DosOpenMutexSem(nom_absolu, &((*psem).hmtx)) != 0)
                    617:        {
                    618:            free(psem);
                    619:            free(nom_absolu);
                    620:            free(nom_segment);
                    621: 
                    622:            return(SEM_FAILED);
                    623:        }
                    624: 
                    625:        (*ptr) = 'S';
                    626: 
                    627:        if (DosOpenEventSem(nom_absolu, &((*psem).hev)) != 0)
                    628:        {
                    629:            DosCloseMutexSem((*psem).hmtx);
                    630: 
                    631:            free(psem);
                    632:            free(nom_absolu);
                    633:            free(nom_segment);
                    634: 
                    635:            return(SEM_FAILED);
                    636:        }
                    637: 
                    638:        if (DosGetNamedSharedMem(&base, nom_segment, PAG_WRITE | PAG_READ) != 0)
                    639:        {
                    640:            DosCloseMutexSem((*psem).hmtx);
                    641: 
                    642:            free(nom_absolu);
                    643:            free(nom_segment);
                    644:            free(psem);
                    645: 
                    646:            return(SEM_FAILED);
                    647:        }
                    648: 
                    649:        free(nom_segment);
                    650: 
                    651:        (*psem).cnt = (ULONG *) base;
                    652:        (*psem).nopened = ((ULONG *) base) + 1;
                    653:        (*psem).shared = 1;
                    654: 
                    655:        if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
                    656:        {
                    657:            DosCloseMutexSem((*psem).hmtx);
                    658: 
                    659:            free(nom_absolu);
                    660:            free(nom_segment);
                    661:            free(psem);
                    662: 
                    663:            return(SEM_FAILED);
                    664:        }
                    665: 
                    666:        (*((*psem).nopened))++;
                    667: 
                    668:        DosReleaseMutexSem((*psem).hmtx);
                    669: 
                    670:        semaphore = psem;
                    671: 
                    672: #      endif
1.6       bertrand  673:    }
                    674:    else
                    675:    {
                    676:        // 4 arguments
                    677: 
                    678:        // O_CREAT O_EXCL
                    679:        // S_IRUSR S_IWUSR
                    680: 
                    681:        va_start(liste, oflag);
                    682:        mode = va_arg(liste, mode_t);
                    683:        valeur = va_arg(liste, unsigned int);
                    684:        va_end(liste);
                    685: 
1.9       bertrand  686: #      ifndef OS2
                    687: 
1.10      bertrand  688:        if ((desc = fopen(nom_absolu, "w")) == NULL)
                    689:        {
                    690:            free(semaphore);
                    691:            free(nom_absolu);
                    692: 
                    693:            return(SEM_FAILED);
                    694:        }
                    695: 
                    696:        fclose(desc);
                    697: 
                    698:        if ((clef = ftok(nom_absolu, 1)) == -1)
                    699:        {
                    700:            free(semaphore);
                    701:            free(nom_absolu);
                    702: 
                    703:            return(SEM_FAILED);
                    704:        }
                    705: 
1.11      bertrand  706:        (*semaphore).sem = semget(clef, 1,
                    707:                (((oflag & O_CREAT) == 0) ? 0 : IPC_CREAT) |
                    708:                (((oflag & O_EXCL) == 0) ? 0 : IPC_EXCL) |
                    709:                (int) mode);
                    710:        (*semaphore).path = nom_absolu;
                    711:        (*semaphore).pid = getpid();
1.6       bertrand  712: 
1.11      bertrand  713:        if ((*semaphore).sem == -1)
1.6       bertrand  714:        {   
                    715:            free(semaphore);
                    716:            free(nom_absolu);
                    717: 
                    718:            return(SEM_FAILED);
                    719:        }
                    720: 
                    721:        argument.val = valeur;
1.11      bertrand  722:        semctl((*semaphore).sem, 0, SETVAL, argument);
1.9       bertrand  723: 
                    724: #      else
                    725: 
                    726:        if ((psem = malloc(sizeof(sem_t))) == NULL)
                    727:        {
                    728:            free(nom_absolu);
                    729:            free(nom_segment);
                    730: 
                    731:            return(SEM_FAILED);
                    732:        }
                    733: 
                    734:        (*ptr) = 'M';
                    735: 
                    736:        if (DosCreateMutexSem(nom_absolu, &((*psem).hmtx), 0, 0) != 0)
                    737:        {
                    738:            free(psem);
                    739:            free(nom_absolu);
                    740:            free(nom_segment);
                    741: 
                    742:            return(SEM_FAILED);
                    743:        }
                    744: 
                    745:        (*ptr) = 'S';
                    746: 
                    747:        if (DosCreateEventSem(nom_absolu, &((*psem).hev), 0,
                    748:                (valeur != 0) ? 1 : 0) != 0)
                    749:        {
                    750:            DosCloseMutexSem((*psem).hmtx);
                    751: 
                    752:            free(nom_absolu);
                    753:            free(nom_segment);
                    754:            free(psem);
                    755: 
                    756:            return(SEM_FAILED);
                    757:        }
                    758: 
                    759:        if (DosAllocSharedMem(&base, nom_segment, 2 * sizeof(ULONG),
                    760:                PAG_WRITE | PAG_READ | PAG_COMMIT) != 0)
                    761:        {
                    762:            DosCloseMutexSem((*psem).hmtx);
                    763: 
                    764:            free(nom_absolu);
                    765:            free(nom_segment);
                    766:            free(psem);
                    767: 
                    768:            return(SEM_FAILED);
                    769:        }
                    770: 
                    771:        free(nom_segment);
                    772: 
                    773:        (*psem).cnt = (ULONG *) base;
                    774:        (*psem).nopened = ((ULONG *) base) + 1;
                    775:        (*(*psem).cnt) = valeur;
                    776:        (*(*psem).nopened) = 1;
                    777:        (*psem).shared = 1;
                    778:        semaphore = psem;
                    779: 
                    780: #      endif
1.6       bertrand  781:    }
                    782: 
1.8       bertrand  783:    return(semaphore);
1.6       bertrand  784: }
                    785: 
                    786: int
1.8       bertrand  787: sem_close_SysV(sem_t *semaphore)
1.6       bertrand  788: {
1.11      bertrand  789:    // Ferme un sémaphore nommé créé par sem_open_SysV()
1.9       bertrand  790: #  ifndef OS2
                    791: 
1.11      bertrand  792:    if ((*semaphore).path != NULL)
                    793:    {
                    794:        free((*semaphore).path);
                    795:    }
                    796: 
1.6       bertrand  797:    free(semaphore);
                    798:    return(0);
1.9       bertrand  799: 
                    800: #  else
                    801: 
                    802:    sem_t       *psem;
                    803: 
                    804:    psem = semaphore;
                    805: 
                    806:    if (DosCloseMutexSem((*psem).hmtx) != 0)
                    807:    {
                    808:        return(EINVAL);
                    809:    }
                    810: 
                    811:    while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY)
                    812:    {
                    813:        DosPostEventSem((*psem).hev);
                    814:    }
                    815: 
                    816:    (*(*psem).nopened)--;
                    817: 
                    818:    if ((*psem).shared == 0)
                    819:    {
                    820:        free((*psem).cnt);
                    821:        free((*psem).nopened);
                    822:    }
                    823:    else
                    824:    {
                    825:        if ((*(*psem).nopened) == 0)
                    826:        {
                    827:            DosFreeMem((*psem).cnt);
                    828:        }
                    829:    }
                    830: 
                    831:    if ((*psem).allocated != 0)
                    832:    {
                    833:        free(psem);
                    834:    }
                    835: 
                    836:    return(0);
                    837: 
                    838: #  endif
1.6       bertrand  839: }
                    840: 
                    841: int
1.8       bertrand  842: sem_unlink_SysV(const char *nom)
1.6       bertrand  843: {
1.11      bertrand  844:    // Détruit un sémaphore nommé créé par sem_open_SysV()
1.9       bertrand  845: #  ifndef OS2
                    846: 
1.6       bertrand  847:    unsigned char       *nom_absolu;
                    848: 
                    849:    if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)
                    850:            + 1) * sizeof(unsigned char))) == NULL)
                    851:    {
                    852:        return(ENOMEM);
                    853:    }
                    854: 
                    855:    sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);
1.12      bertrand  856:    semctl(semget(ftok(nom_absolu, 1), 0, 0), 0, IPC_RMID);
1.6       bertrand  857: 
                    858:    if (unlink(nom_absolu) == -1)
                    859:    {
                    860:        free(nom_absolu);
                    861:        return(EACCES);
                    862:    }
                    863: 
                    864:    free(nom_absolu);
                    865: 
                    866:    return(0);
1.9       bertrand  867: 
                    868: #  else
                    869: 
                    870:    return(0);
                    871: 
                    872: #  endif
1.6       bertrand  873: }
                    874: 
                    875: #endif
                    876: 
1.1       bertrand  877: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>