Annotation of rpl/src/semaphores.c, revision 1.6
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.6 ! bertrand 110: #ifdef OS2
! 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:
! 124: extern unsigned char *chemin_semaphores_SysV;
! 125:
! 126: int
! 127: sem_init(sem_t *semaphore, int shared, unsigned int valeur)
! 128: {
! 129: union semun argument;
! 130:
! 131: if (shared != 0)
! 132: {
! 133: return(ENOSYS);
! 134: }
! 135:
! 136: (*semaphore) = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | SEM_R | SEM_A);
! 137:
! 138: if ((*semaphore) == -1)
! 139: {
! 140: return(EINVAL);
! 141: }
! 142:
! 143: argument.val = valeur;
! 144: semctl((*semaphore), 0, SETVAL, argument);
! 145:
! 146: return(0);
! 147: }
! 148:
! 149: int
! 150: sem_destroy(sem_t *semaphore)
! 151: {
! 152: if (semctl((*semaphore), IPC_RMID, 0) == -1)
! 153: {
! 154: return(EINVAL);
! 155: }
! 156:
! 157: return(0);
! 158: }
! 159:
! 160: int
! 161: sem_wait(sem_t *semaphore)
! 162: {
! 163: struct sembuf commande;
! 164:
! 165: commande.sem_num = 0;
! 166: commande.sem_op = -1;
! 167: commande.sem_flg = 0;
! 168:
! 169: if (semop((*semaphore), &commande, 1) == -1)
! 170: {
! 171: return(EINVAL);
! 172: }
! 173:
! 174: return(0);
! 175: }
! 176:
! 177: int
! 178: sem_trywait(sem_t *semaphore)
! 179: {
! 180: struct sembuf commande;
! 181:
! 182: commande.sem_num = 0;
! 183: commande.sem_op = -1;
! 184: commande.sem_flg = IPC_NOWAIT;
! 185:
! 186: if (semop((*semaphore), &commande, 1) == -1)
! 187: {
! 188: if (errno == EAGAIN)
! 189: {
! 190: return(EAGAIN);
! 191: }
! 192:
! 193: return(EINVAL);
! 194: }
! 195:
! 196: return(0);
! 197: }
! 198:
! 199: int
! 200: sem_post(sem_t *semaphore)
! 201: {
! 202: struct sembuf commande;
! 203:
! 204: commande.sem_num = 0;
! 205: commande.sem_op = 1;
! 206: commande.sem_flg = 0;
! 207:
! 208: if (semop((*semaphore), &commande, 1) == -1)
! 209: {
! 210: return(EINVAL);
! 211: }
! 212:
! 213: return(0);
! 214: }
! 215:
! 216: int
! 217: sem_getvalue(sem_t *semaphore, int *valeur)
! 218: {
! 219: (*valeur) = semctl((*semaphore), 0, GETVAL);
! 220:
! 221: if ((*valeur) < 0)
! 222: {
! 223: return(EINVAL);
! 224: }
! 225:
! 226: return(0);
! 227: }
! 228:
! 229: sem_t
! 230: *sem_open(const char *nom, int oflag, ...)
! 231: //*sem_open(const char *nom, int oflag)
! 232: //*sem_open(const char *nom, int oflag, mode_t mode, unsigned int value)
! 233: {
! 234: mode_t mode;
! 235:
! 236: sem_t *semaphore;
! 237:
! 238: union semun argument;
! 239:
! 240: unsigned char *nom_absolu;
! 241:
! 242: unsigned int valeur;
! 243:
! 244: va_list liste;
! 245:
! 246: if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)
! 247: + 1) * sizeof(unsigned char))) == NULL)
! 248: {
! 249: return(SEM_FAILED);
! 250: }
! 251:
! 252: sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);
! 253:
! 254: if ((semaphore = malloc(sizeof(sem_t))) == NULL)
! 255: {
! 256: return(SEM_FAILED);
! 257: }
! 258:
! 259: if ((oflag & O_CREAT) == 0)
! 260: {
! 261: // 2 arguments
! 262: (*semaphore) = semget(ftok(nom_absolu, 1), 0, 0);
! 263:
! 264: if ((*semaphore) == -1)
! 265: {
! 266: free(semaphore);
! 267: free(nom_absolu);
! 268:
! 269: return(SEM_FAILED);
! 270: }
! 271: }
! 272: else
! 273: {
! 274: // 4 arguments
! 275:
! 276: // O_CREAT O_EXCL
! 277: // S_IRUSR S_IWUSR
! 278:
! 279: va_start(liste, oflag);
! 280: mode = va_arg(liste, mode_t);
! 281: valeur = va_arg(liste, unsigned int);
! 282: va_end(liste);
! 283:
! 284: (*semaphore) = semget(ftok(nom_absolu, 1), 1,
! 285: ((oflag & O_CREAT) == 0) ? 0 : IPC_CREAT |
! 286: ((oflag & O_EXCL) == 0) ? 0 : IPC_EXCL |
! 287: ((oflag & S_IRUSR) == 0) ? 0 : SEM_R |
! 288: ((oflag & S_IWUSR) == 0) ? 0 : SEM_A);
! 289:
! 290: if ((*semaphore) == -1)
! 291: {
! 292: free(semaphore);
! 293: free(nom_absolu);
! 294:
! 295: return(SEM_FAILED);
! 296: }
! 297:
! 298: argument.val = valeur;
! 299: semctl((*semaphore), 0, SETVAL, argument);
! 300: }
! 301:
! 302: free(nom_absolu);
! 303:
! 304: return(SEM_FAILED);
! 305: }
! 306:
! 307: int
! 308: sem_close(sem_t *semaphore)
! 309: {
! 310: free(semaphore);
! 311: return(0);
! 312: }
! 313:
! 314: int
! 315: sem_unlink(const char *nom)
! 316: {
! 317: sem_t semaphore;
! 318:
! 319: struct sembuf commande;
! 320:
! 321: unsigned char *nom_absolu;
! 322:
! 323: if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)
! 324: + 1) * sizeof(unsigned char))) == NULL)
! 325: {
! 326: return(ENOMEM);
! 327: }
! 328:
! 329: sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);
! 330:
! 331: if ((semaphore = semget(ftok(nom_absolu, 1), 0, 0)) == -1)
! 332: {
! 333: free(nom_absolu);
! 334: return(EINVAL);
! 335: }
! 336:
! 337: commande.sem_num = 0;
! 338: commande.sem_op = 0;
! 339: commande.sem_flg = 0;
! 340:
! 341: if (semop(semaphore, &commande, 1) == -1)
! 342: {
! 343: free(nom_absolu);
! 344: return(EINVAL);
! 345: }
! 346:
! 347: if (semctl(semaphore, IPC_RMID, 0) == -1)
! 348: {
! 349: free(nom_absolu);
! 350: return(EINVAL);
! 351: }
! 352:
! 353: if (unlink(nom_absolu) == -1)
! 354: {
! 355: free(nom_absolu);
! 356: return(EACCES);
! 357: }
! 358:
! 359: free(nom_absolu);
! 360:
! 361: return(0);
! 362: }
! 363:
! 364: #endif
! 365:
1.1 bertrand 366: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>