Annotation of rpl/src/semaphores.c, revision 1.9
1.1 bertrand 1: /*
2: ================================================================================
1.5 bertrand 3: RPL/2 (R) version 4.0.18
1.1 bertrand 4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
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,
43: "/RPLSEM-%d-%llu-%d", (int) getpid(),
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.8 bertrand 110: #ifdef SEMAPHORES_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\\";
! 128: unsigned char racine_memoire_OS2[] = "\\SHAREDMEM\\";
! 129: #endif
1.6 bertrand 130:
1.8 bertrand 131: #ifndef UNION_SEMUN
132: union semun
133: {
134: int val;
135: struct semid_ds *buf;
136: unsigned short *array;
137: struct seminfo *__buf;
138: };
139: #endif
140:
1.6 bertrand 141: int
1.8 bertrand 142: sem_init_SysV(sem_t *semaphore, int shared, unsigned int valeur)
1.6 bertrand 143: {
1.9 ! bertrand 144: # ifndef OS2
! 145:
1.8 bertrand 146: int ios;
147:
1.6 bertrand 148: union semun argument;
149:
150: if (shared != 0)
151: {
1.9 ! bertrand 152: errno = ENOSYS;
! 153: return(-1);
1.6 bertrand 154: }
155:
156: (*semaphore) = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | SEM_R | SEM_A);
157:
158: if ((*semaphore) == -1)
159: {
1.9 ! bertrand 160: errno = EINVAL;
! 161: return(-1);
1.6 bertrand 162: }
163:
164: argument.val = valeur;
1.8 bertrand 165: ios = semctl((*semaphore), 0, SETVAL, argument);
1.6 bertrand 166:
1.8 bertrand 167: return(ios);
1.9 ! bertrand 168:
! 169: # else
! 170:
! 171: sem_t *psem;
! 172:
! 173: psem = semaphore;
! 174:
! 175: if (shared != 0)
! 176: {
! 177: errno = ENOSYS;
! 178: return(-1);
! 179: }
! 180:
! 181: if (((*psem).cnt = malloc(sizeof(ULONG))) == NULL)
! 182: {
! 183: free(psem);
! 184: errno = ENOMEM;
! 185: return(-1);
! 186: }
! 187:
! 188: if (((*psem).nopened = malloc(sizeof(ULONG))) == NULL)
! 189: {
! 190: free((*psem).cnt);
! 191: free(psem);
! 192: errno = ENOMEM;
! 193: return(-1);
! 194: }
! 195:
! 196: if (DosCreateMutexSem(NULL, &((*psem).hmtx), 0, 0) != 0)
! 197: {
! 198: free((*psem).cnt);
! 199: free((*psem).nopened);
! 200: free(psem);
! 201: return(-1);
! 202: }
! 203:
! 204: if (DosCreateEventSem(NULL, &((*psem).hev), 0, (valeur != 0) ? 1 : 0) != 0)
! 205: {
! 206: DosCloseMutexSem((*psem).hmtx);
! 207: free((*psem).cnt);
! 208: free((*psem).nopened);
! 209: free(psem);
! 210: return(-1);
! 211: }
! 212:
! 213: (*(*psem).cnt) = valeur;
! 214: (*(*psem).nopened) = 1;
! 215: (*psem).shared = shared;
! 216: (*psem).allocated = 0;
! 217:
! 218: return(0);
! 219:
! 220: # endif
1.6 bertrand 221: }
222:
223: int
1.8 bertrand 224: sem_destroy_SysV(sem_t *semaphore)
1.6 bertrand 225: {
1.9 ! bertrand 226: # ifndef OS2
! 227:
1.6 bertrand 228: if (semctl((*semaphore), IPC_RMID, 0) == -1)
229: {
230: return(EINVAL);
231: }
232:
233: return(0);
1.9 ! bertrand 234:
! 235: # else
! 236:
! 237: sem_t *psem;
! 238:
! 239: psem = semaphore;
! 240:
! 241: if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
! 242: {
! 243: return(EINVAL);
! 244: }
! 245:
! 246: if (DosCloseMutexSem((*psem).hmtx) != 0)
! 247: {
! 248: return(EINVAL);
! 249: }
! 250:
! 251: while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY)
! 252: {
! 253: DosPostEventSem((*psem).hev);
! 254: }
! 255:
! 256: (*(*psem).nopened)--;
! 257:
! 258: if ((*psem).shared == 0)
! 259: {
! 260: free((*psem).cnt);
! 261: free((*psem).nopened);
! 262: }
! 263: else
! 264: {
! 265: if ((*(*psem).nopened) == 0)
! 266: {
! 267: DosFreeMem((*psem).cnt);
! 268: }
! 269: }
! 270:
! 271: if ((*psem).allocated != 0)
! 272: {
! 273: free(psem);
! 274: }
! 275:
! 276: return(0);
! 277:
! 278: # endif
1.6 bertrand 279: }
280:
281: int
1.8 bertrand 282: sem_wait_SysV(sem_t *semaphore)
1.6 bertrand 283: {
1.9 ! bertrand 284: # ifndef OS2
! 285:
1.6 bertrand 286: struct sembuf commande;
287:
288: commande.sem_num = 0;
289: commande.sem_op = -1;
290: commande.sem_flg = 0;
291:
292: if (semop((*semaphore), &commande, 1) == -1)
293: {
1.9 ! bertrand 294: errno = EINVAL;
! 295: return(-1);
! 296: }
! 297:
! 298: return(0);
! 299:
! 300: # else
! 301:
! 302: sem_t *psem;
! 303:
! 304: ULONG cnt;
! 305:
! 306: psem = semaphore;
! 307:
! 308: if (DosWaitEventSem((*psem).hev, SEM_INDEFINITE_WAIT) != 0)
! 309: {
! 310: errno = EINVAL;
! 311: return(-1);
! 312: }
! 313:
! 314: if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
! 315: {
! 316: errno = EINVAL;
! 317: return(-1);
! 318: }
! 319:
! 320: if ((*(*psem).cnt) > 0)
! 321: {
! 322: (*(*psem).cnt)--;
! 323: }
! 324:
! 325: if ((*(*psem).cnt) == 0)
! 326: {
! 327: DosResetEventSem((*psem).hev, &cnt);
1.6 bertrand 328: }
329:
1.9 ! bertrand 330: DosReleaseMutexSem((*psem).hmtx);
1.6 bertrand 331: return(0);
1.9 ! bertrand 332:
! 333: # endif
1.6 bertrand 334: }
335:
336: int
1.8 bertrand 337: sem_trywait_SysV(sem_t *semaphore)
1.6 bertrand 338: {
1.9 ! bertrand 339: # ifndef OS2
! 340:
1.6 bertrand 341: struct sembuf commande;
342:
343: commande.sem_num = 0;
344: commande.sem_op = -1;
345: commande.sem_flg = IPC_NOWAIT;
346:
347: if (semop((*semaphore), &commande, 1) == -1)
348: {
1.9 ! bertrand 349: return(-1);
! 350: }
! 351:
! 352: return(0);
! 353:
! 354: # else
! 355:
! 356: int ios;
! 357:
! 358: sem_t *psem;
! 359:
! 360: ULONG cnt;
! 361:
! 362: psem = semaphore;
! 363:
! 364: if ((ios = DosWaitEventSem((*psem).hev, SEM_IMMEDIATE_RETURN)) != 0)
! 365: {
! 366: errno = (ios == ERROR_TIMEOUT) ? EAGAIN : EINVAL;
! 367: return(-1);
! 368: }
! 369:
! 370: if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
! 371: {
! 372: errno = EINVAL;
! 373: return(-1);
! 374: }
! 375:
! 376: if ((*(*psem).cnt) > 0)
! 377: {
! 378: (*(*psem).cnt)--;
! 379: }
1.6 bertrand 380:
1.9 ! bertrand 381: if ((*(*psem).cnt) == 0)
! 382: {
! 383: DosResetEventSem((*psem).hev, &cnt);
1.6 bertrand 384: }
385:
1.9 ! bertrand 386: DosReleaseMutexSem((*psem).hmtx);
1.6 bertrand 387: return(0);
1.9 ! bertrand 388:
! 389: # endif
1.6 bertrand 390: }
391:
392: int
1.8 bertrand 393: sem_post_SysV(sem_t *semaphore)
1.6 bertrand 394: {
1.9 ! bertrand 395: # ifndef OS2
! 396:
1.6 bertrand 397: struct sembuf commande;
398:
399: commande.sem_num = 0;
400: commande.sem_op = 1;
401: commande.sem_flg = 0;
402:
403: if (semop((*semaphore), &commande, 1) == -1)
404: {
1.9 ! bertrand 405: errno = EINVAL;
! 406: return(-1);
! 407: }
! 408:
! 409: return(0);
! 410:
! 411: # else
! 412:
! 413: sem_t *psem;
! 414:
! 415: psem = semaphore;
! 416:
! 417: if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
! 418: {
! 419: errno = EINVAL;
! 420: return(-1);
1.6 bertrand 421: }
422:
1.9 ! bertrand 423: (*(*psem).cnt)++;
! 424: DosPostEventSem((*psem).hev);
! 425: DosReleaseMutexSem((*psem).hmtx);
! 426:
1.6 bertrand 427: return(0);
1.9 ! bertrand 428:
! 429: # endif
1.6 bertrand 430: }
431:
432: int
1.8 bertrand 433: sem_getvalue_SysV(sem_t *semaphore, int *valeur)
1.6 bertrand 434: {
1.9 ! bertrand 435: # ifndef OS2
! 436:
1.6 bertrand 437: (*valeur) = semctl((*semaphore), 0, GETVAL);
438:
439: if ((*valeur) < 0)
440: {
441: return(EINVAL);
442: }
443:
444: return(0);
1.9 ! bertrand 445:
! 446: # else
! 447:
! 448: sem_t *psem;
! 449:
! 450: psem = semaphore;
! 451:
! 452: if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
! 453: {
! 454: errno = EINVAL;
! 455: return(-1);
! 456: }
! 457:
! 458: (*valeur) = (*(*psem).cnt);
! 459: DosReleaseMutexSem((*psem).hmtx);
! 460:
! 461: return(0);
! 462:
! 463: # endif
1.6 bertrand 464: }
465:
466: sem_t
1.8 bertrand 467: *sem_open_SysV(const char *nom, int oflag, ...)
1.6 bertrand 468: //*sem_open(const char *nom, int oflag)
469: //*sem_open(const char *nom, int oflag, mode_t mode, unsigned int value)
470: {
471: mode_t mode;
472:
473: sem_t *semaphore;
474:
1.9 ! bertrand 475: # ifndef OS2
1.6 bertrand 476: union semun argument;
1.9 ! bertrand 477: # endif
1.6 bertrand 478:
479: unsigned char *nom_absolu;
480:
481: unsigned int valeur;
482:
483: va_list liste;
484:
1.9 ! bertrand 485: # ifdef OS2
! 486: sem_t *psem;
! 487:
! 488: PVOID base;
! 489:
! 490: unsigned char *ptr;
! 491: unsigned char *nom_segment;
! 492: # endif
! 493:
! 494: # ifndef OS2
! 495:
1.6 bertrand 496: if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)
497: + 1) * sizeof(unsigned char))) == NULL)
498: {
499: return(SEM_FAILED);
500: }
501:
502: sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);
503:
504: if ((semaphore = malloc(sizeof(sem_t))) == NULL)
505: {
506: return(SEM_FAILED);
507: }
508:
1.9 ! bertrand 509: (*psem).allocated = 1;
! 510:
! 511: # else
! 512:
! 513: if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1)
! 514: * sizeof(unsigned char))) == NULL)
! 515: {
! 516: return(SEM_FAILED);
! 517: }
! 518:
! 519: sprintf(nom_segment, "%s%s", racine_memoire_OS2, nom);
! 520: ptr = nom_segment;
! 521:
! 522: while((*ptr) != d_code_fin_chaine)
! 523: {
! 524: if ((*ptr) == '/')
! 525: {
! 526: (*ptr) = '\\';
! 527: }
! 528:
! 529: ptr++;
! 530: }
! 531:
! 532: if ((nom_absolu = malloc((strlen(racine_semaphores_OS2) + strlen(nom)
! 533: + 2) * sizeof(unsigned char))) == NULL)
! 534: {
! 535: return(SEM_FAILED);
! 536: }
! 537:
! 538: sprintf(nom_absolu, "%s%s", racine_semaphores_OS2, nom);
! 539: ptr = nom_absolu;
! 540:
! 541: while((*ptr) != d_code_fin_chaine)
! 542: {
! 543: if ((*ptr) == '/')
! 544: {
! 545: (*ptr) = '\\';
! 546: }
! 547:
! 548: ptr++;
! 549: }
! 550:
! 551: (*(ptr + 1)) = d_code_fin_chaine;
! 552:
! 553: if ((psem = malloc(sizeof(sem_t))) == NULL)
! 554: {
! 555: return(SEM_FAILED);
! 556: }
! 557:
! 558: # endif
! 559:
1.6 bertrand 560: if ((oflag & O_CREAT) == 0)
561: {
562: // 2 arguments
1.9 ! bertrand 563:
! 564: # ifndef OS2
! 565:
1.6 bertrand 566: (*semaphore) = semget(ftok(nom_absolu, 1), 0, 0);
567:
568: if ((*semaphore) == -1)
569: {
570: free(semaphore);
571: free(nom_absolu);
572:
573: return(SEM_FAILED);
574: }
1.9 ! bertrand 575:
! 576: # else
! 577:
! 578: if ((psem = malloc(sizeof(sem_t))) == NULL)
! 579: {
! 580: free(nom_absolu);
! 581: free(nom_segment);
! 582: return(SEM_FAILED);
! 583: }
! 584:
! 585: (*ptr) = 'M';
! 586:
! 587: if (DosOpenMutexSem(nom_absolu, &((*psem).hmtx)) != 0)
! 588: {
! 589: free(psem);
! 590: free(nom_absolu);
! 591: free(nom_segment);
! 592:
! 593: return(SEM_FAILED);
! 594: }
! 595:
! 596: (*ptr) = 'S';
! 597:
! 598: if (DosOpenEventSem(nom_absolu, &((*psem).hev)) != 0)
! 599: {
! 600: DosCloseMutexSem((*psem).hmtx);
! 601:
! 602: free(psem);
! 603: free(nom_absolu);
! 604: free(nom_segment);
! 605:
! 606: return(SEM_FAILED);
! 607: }
! 608:
! 609: if (DosGetNamedSharedMem(&base, nom_segment, PAG_WRITE | PAG_READ) != 0)
! 610: {
! 611: DosCloseMutexSem((*psem).hmtx);
! 612:
! 613: free(nom_absolu);
! 614: free(nom_segment);
! 615: free(psem);
! 616:
! 617: return(SEM_FAILED);
! 618: }
! 619:
! 620: free(nom_segment);
! 621:
! 622: (*psem).cnt = (ULONG *) base;
! 623: (*psem).nopened = ((ULONG *) base) + 1;
! 624: (*psem).shared = 1;
! 625:
! 626: if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
! 627: {
! 628: DosCloseMutexSem((*psem).hmtx);
! 629:
! 630: free(nom_absolu);
! 631: free(nom_segment);
! 632: free(psem);
! 633:
! 634: return(SEM_FAILED);
! 635: }
! 636:
! 637: (*((*psem).nopened))++;
! 638:
! 639: DosReleaseMutexSem((*psem).hmtx);
! 640:
! 641: semaphore = psem;
! 642:
! 643: # endif
1.6 bertrand 644: }
645: else
646: {
647: // 4 arguments
648:
649: // O_CREAT O_EXCL
650: // S_IRUSR S_IWUSR
651:
652: va_start(liste, oflag);
653: mode = va_arg(liste, mode_t);
654: valeur = va_arg(liste, unsigned int);
655: va_end(liste);
656:
1.9 ! bertrand 657: # ifndef OS2
! 658:
1.6 bertrand 659: (*semaphore) = semget(ftok(nom_absolu, 1), 1,
660: ((oflag & O_CREAT) == 0) ? 0 : IPC_CREAT |
661: ((oflag & O_EXCL) == 0) ? 0 : IPC_EXCL |
662: ((oflag & S_IRUSR) == 0) ? 0 : SEM_R |
663: ((oflag & S_IWUSR) == 0) ? 0 : SEM_A);
664:
665: if ((*semaphore) == -1)
666: {
667: free(semaphore);
668: free(nom_absolu);
669:
670: return(SEM_FAILED);
671: }
672:
673: argument.val = valeur;
674: semctl((*semaphore), 0, SETVAL, argument);
1.9 ! bertrand 675:
! 676: # else
! 677:
! 678: if ((psem = malloc(sizeof(sem_t))) == NULL)
! 679: {
! 680: free(nom_absolu);
! 681: free(nom_segment);
! 682:
! 683: return(SEM_FAILED);
! 684: }
! 685:
! 686: (*ptr) = 'M';
! 687:
! 688: if (DosCreateMutexSem(nom_absolu, &((*psem).hmtx), 0, 0) != 0)
! 689: {
! 690: free(psem);
! 691: free(nom_absolu);
! 692: free(nom_segment);
! 693:
! 694: return(SEM_FAILED);
! 695: }
! 696:
! 697: (*ptr) = 'S';
! 698:
! 699: if (DosCreateEventSem(nom_absolu, &((*psem).hev), 0,
! 700: (valeur != 0) ? 1 : 0) != 0)
! 701: {
! 702: DosCloseMutexSem((*psem).hmtx);
! 703:
! 704: free(nom_absolu);
! 705: free(nom_segment);
! 706: free(psem);
! 707:
! 708: return(SEM_FAILED);
! 709: }
! 710:
! 711: if (DosAllocSharedMem(&base, nom_segment, 2 * sizeof(ULONG),
! 712: PAG_WRITE | PAG_READ | PAG_COMMIT) != 0)
! 713: {
! 714: DosCloseMutexSem((*psem).hmtx);
! 715:
! 716: free(nom_absolu);
! 717: free(nom_segment);
! 718: free(psem);
! 719:
! 720: return(SEM_FAILED);
! 721: }
! 722:
! 723: free(nom_segment);
! 724:
! 725: (*psem).cnt = (ULONG *) base;
! 726: (*psem).nopened = ((ULONG *) base) + 1;
! 727: (*(*psem).cnt) = valeur;
! 728: (*(*psem).nopened) = 1;
! 729: (*psem).shared = 1;
! 730: semaphore = psem;
! 731:
! 732: # endif
1.6 bertrand 733: }
734:
735: free(nom_absolu);
736:
1.8 bertrand 737: return(semaphore);
1.6 bertrand 738: }
739:
740: int
1.8 bertrand 741: sem_close_SysV(sem_t *semaphore)
1.6 bertrand 742: {
1.9 ! bertrand 743: # ifndef OS2
! 744:
1.6 bertrand 745: free(semaphore);
746: return(0);
1.9 ! bertrand 747:
! 748: # else
! 749:
! 750: sem_t *psem;
! 751:
! 752: psem = semaphore;
! 753:
! 754: if (DosCloseMutexSem((*psem).hmtx) != 0)
! 755: {
! 756: return(EINVAL);
! 757: }
! 758:
! 759: while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY)
! 760: {
! 761: DosPostEventSem((*psem).hev);
! 762: }
! 763:
! 764: (*(*psem).nopened)--;
! 765:
! 766: if ((*psem).shared == 0)
! 767: {
! 768: free((*psem).cnt);
! 769: free((*psem).nopened);
! 770: }
! 771: else
! 772: {
! 773: if ((*(*psem).nopened) == 0)
! 774: {
! 775: DosFreeMem((*psem).cnt);
! 776: }
! 777: }
! 778:
! 779: if ((*psem).allocated != 0)
! 780: {
! 781: free(psem);
! 782: }
! 783:
! 784: return(0);
! 785:
! 786: # endif
1.6 bertrand 787: }
788:
789: int
1.8 bertrand 790: sem_unlink_SysV(const char *nom)
1.6 bertrand 791: {
1.9 ! bertrand 792: # ifndef OS2
! 793:
1.6 bertrand 794: sem_t semaphore;
795:
796: struct sembuf commande;
797:
798: unsigned char *nom_absolu;
799:
800: if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)
801: + 1) * sizeof(unsigned char))) == NULL)
802: {
803: return(ENOMEM);
804: }
805:
806: sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);
807:
808: if ((semaphore = semget(ftok(nom_absolu, 1), 0, 0)) == -1)
809: {
810: free(nom_absolu);
811: return(EINVAL);
812: }
813:
814: commande.sem_num = 0;
815: commande.sem_op = 0;
816: commande.sem_flg = 0;
817:
818: if (semop(semaphore, &commande, 1) == -1)
819: {
820: free(nom_absolu);
821: return(EINVAL);
822: }
823:
824: if (semctl(semaphore, IPC_RMID, 0) == -1)
825: {
826: free(nom_absolu);
827: return(EINVAL);
828: }
829:
830: if (unlink(nom_absolu) == -1)
831: {
832: free(nom_absolu);
833: return(EACCES);
834: }
835:
836: free(nom_absolu);
837:
838: return(0);
1.9 ! bertrand 839:
! 840: # else
! 841:
! 842: return(0);
! 843:
! 844: # endif
1.6 bertrand 845: }
846:
847: #endif
848:
1.1 bertrand 849: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>