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