version 1.10, 2010/08/17 11:59:28
|
version 1.13, 2010/08/26 19:07:42
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.0.18 |
RPL/2 (R) version 4.0.19 |
Copyright (C) 1989-2010 Dr. BERTRAND Joël |
Copyright (C) 1989-2010 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
Line 128 sem_getvalue2(sem_t *semaphore, int *val
|
Line 128 sem_getvalue2(sem_t *semaphore, int *val
|
unsigned char racine_memoire_OS2[] = "\\SHAREDMEM\\"; |
unsigned char racine_memoire_OS2[] = "\\SHAREDMEM\\"; |
#endif |
#endif |
|
|
#ifndef UNION_SEMUN |
|
union semun |
|
{ |
|
int val; |
|
struct semid_ds *buf; |
|
unsigned short *array; |
|
struct seminfo *__buf; |
|
}; |
|
#endif |
|
|
|
int |
int |
sem_init_SysV(sem_t *semaphore, int shared, unsigned int valeur) |
sem_init_SysV(sem_t *semaphore, int shared, unsigned int valeur) |
{ |
{ |
|
// Création d'un sémaphore anonyme qui devra être supprimé par |
|
// sem_destroy_SysV |
# ifndef OS2 |
# ifndef OS2 |
|
|
int ios; |
int ios; |
Line 153 sem_init_SysV(sem_t *semaphore, int shar
|
Line 145 sem_init_SysV(sem_t *semaphore, int shar
|
return(-1); |
return(-1); |
} |
} |
|
|
(*semaphore) = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | SEM_R | SEM_A); |
(*semaphore).sem = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | |
|
S_IRUSR | S_IWUSR); |
|
(*semaphore).path = NULL; |
|
(*semaphore).pid = getpid(); |
|
|
if ((*semaphore) == -1) |
if ((*semaphore).sem == -1) |
{ |
{ |
errno = EINVAL; |
errno = EINVAL; |
return(-1); |
return(-1); |
} |
} |
|
|
argument.val = valeur; |
argument.val = valeur; |
ios = semctl((*semaphore), 0, SETVAL, argument); |
ios = semctl((*semaphore).sem, 0, SETVAL, argument); |
|
|
return(ios); |
return(ios); |
|
|
Line 223 sem_init_SysV(sem_t *semaphore, int shar
|
Line 218 sem_init_SysV(sem_t *semaphore, int shar
|
int |
int |
sem_destroy_SysV(sem_t *semaphore) |
sem_destroy_SysV(sem_t *semaphore) |
{ |
{ |
|
// Détruit un sémaphore anonmyme |
# ifndef OS2 |
# ifndef OS2 |
|
|
if (semctl((*semaphore), IPC_RMID, 0) == -1) |
if ((*semaphore).path != NULL) |
|
{ |
|
return(EINVAL); |
|
} |
|
|
|
if ((*semaphore).pid != getpid()) |
|
{ |
|
return(0); |
|
} |
|
|
|
if (semctl((*semaphore).sem, 0, IPC_RMID) == -1) |
{ |
{ |
return(EINVAL); |
return(EINVAL); |
} |
} |
Line 289 sem_wait_SysV(sem_t *semaphore)
|
Line 295 sem_wait_SysV(sem_t *semaphore)
|
commande.sem_op = -1; |
commande.sem_op = -1; |
commande.sem_flg = 0; |
commande.sem_flg = 0; |
|
|
if (semop((*semaphore), &commande, 1) == -1) |
while(semop((*semaphore).sem, &commande, 1) == -1) |
{ |
{ |
errno = EINVAL; |
if (errno != EINTR) |
return(-1); |
{ |
|
errno = EINVAL; |
|
return(-1); |
|
} |
} |
} |
|
|
return(0); |
return(0); |
Line 344 sem_trywait_SysV(sem_t *semaphore)
|
Line 353 sem_trywait_SysV(sem_t *semaphore)
|
commande.sem_op = -1; |
commande.sem_op = -1; |
commande.sem_flg = IPC_NOWAIT; |
commande.sem_flg = IPC_NOWAIT; |
|
|
if (semop((*semaphore), &commande, 1) == -1) |
while(semop((*semaphore).sem, &commande, 1) == -1) |
{ |
{ |
return(-1); |
if (errno != EINTR) |
|
{ |
|
errno = EINVAL; |
|
return(-1); |
|
} |
} |
} |
|
|
return(0); |
return(0); |
Line 400 sem_post_SysV(sem_t *semaphore)
|
Line 413 sem_post_SysV(sem_t *semaphore)
|
commande.sem_op = 1; |
commande.sem_op = 1; |
commande.sem_flg = 0; |
commande.sem_flg = 0; |
|
|
if (semop((*semaphore), &commande, 1) == -1) |
while(semop((*semaphore).sem, &commande, 1) == -1) |
{ |
{ |
errno = EINVAL; |
if (errno != EINTR) |
return(-1); |
{ |
|
errno = EINVAL; |
|
return(-1); |
|
} |
} |
} |
|
|
return(0); |
return(0); |
Line 434 sem_getvalue_SysV(sem_t *semaphore, int
|
Line 450 sem_getvalue_SysV(sem_t *semaphore, int
|
{ |
{ |
# ifndef OS2 |
# ifndef OS2 |
|
|
(*valeur) = semctl((*semaphore), 0, GETVAL); |
(*valeur) = semctl((*semaphore).sem, 0, GETVAL); |
|
|
if ((*valeur) < 0) |
if ((*valeur) < 0) |
{ |
{ |
Line 510 sem_t
|
Line 526 sem_t
|
return(SEM_FAILED); |
return(SEM_FAILED); |
} |
} |
|
|
(*psem).allocated = 1; |
|
|
|
# else |
# else |
|
|
if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1) |
if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1) |
Line 559 sem_t
|
Line 573 sem_t
|
return(SEM_FAILED); |
return(SEM_FAILED); |
} |
} |
|
|
|
(*psem).allocated = 1; |
|
|
# endif |
# endif |
|
|
if ((oflag & O_CREAT) == 0) |
if ((oflag & O_CREAT) == 0) |
Line 567 sem_t
|
Line 583 sem_t
|
|
|
# ifndef OS2 |
# ifndef OS2 |
|
|
(*semaphore) = semget(ftok(nom_absolu, 1), 0, 0); |
clef = ftok(nom_absolu, 1); |
|
|
if ((*semaphore) == -1) |
if (clef == -1) |
|
{ |
|
return(SEM_FAILED); |
|
} |
|
|
|
(*semaphore).sem = semget(clef, 0, 0); |
|
(*semaphore).path = nom_absolu; |
|
(*semaphore).pid = getpid(); |
|
|
|
if ((*semaphore).sem == -1) |
{ |
{ |
free(semaphore); |
free(semaphore); |
free(nom_absolu); |
free(nom_absolu); |
Line 678 sem_t
|
Line 703 sem_t
|
return(SEM_FAILED); |
return(SEM_FAILED); |
} |
} |
|
|
(*semaphore) = semget(clef, 1, |
(*semaphore).sem = semget(clef, 1, |
((oflag & O_CREAT) == 0) ? 0 : IPC_CREAT | |
(((oflag & O_CREAT) == 0) ? 0 : IPC_CREAT) | |
((oflag & O_EXCL) == 0) ? 0 : IPC_EXCL | |
(((oflag & O_EXCL) == 0) ? 0 : IPC_EXCL) | |
((oflag & S_IRUSR) == 0) ? 0 : SEM_R | |
(int) mode); |
((oflag & S_IWUSR) == 0) ? 0 : SEM_A); |
(*semaphore).path = nom_absolu; |
|
(*semaphore).pid = getpid(); |
|
|
if ((*semaphore) == -1) |
if ((*semaphore).sem == -1) |
{ |
{ |
free(semaphore); |
free(semaphore); |
free(nom_absolu); |
free(nom_absolu); |
Line 693 sem_t
|
Line 719 sem_t
|
} |
} |
|
|
argument.val = valeur; |
argument.val = valeur; |
semctl((*semaphore), 0, SETVAL, argument); |
semctl((*semaphore).sem, 0, SETVAL, argument); |
|
|
# else |
# else |
|
|
Line 754 sem_t
|
Line 780 sem_t
|
# endif |
# endif |
} |
} |
|
|
free(nom_absolu); |
|
|
|
return(semaphore); |
return(semaphore); |
} |
} |
|
|
int |
int |
sem_close_SysV(sem_t *semaphore) |
sem_close_SysV(sem_t *semaphore) |
{ |
{ |
|
// Ferme un sémaphore nommé créé par sem_open_SysV() |
# ifndef OS2 |
# ifndef OS2 |
|
|
|
if ((*semaphore).path != NULL) |
|
{ |
|
free((*semaphore).path); |
|
} |
|
|
free(semaphore); |
free(semaphore); |
return(0); |
return(0); |
|
|
Line 811 sem_close_SysV(sem_t *semaphore)
|
Line 841 sem_close_SysV(sem_t *semaphore)
|
int |
int |
sem_unlink_SysV(const char *nom) |
sem_unlink_SysV(const char *nom) |
{ |
{ |
|
// Détruit un sémaphore nommé créé par sem_open_SysV() |
# ifndef OS2 |
# ifndef OS2 |
|
|
sem_t semaphore; |
|
|
|
struct sembuf commande; |
|
|
|
unsigned char *nom_absolu; |
unsigned char *nom_absolu; |
|
|
if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom) |
if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom) |
Line 826 sem_unlink_SysV(const char *nom)
|
Line 853 sem_unlink_SysV(const char *nom)
|
} |
} |
|
|
sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom); |
sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom); |
|
semctl(semget(ftok(nom_absolu, 1), 0, 0), 0, IPC_RMID); |
if ((semaphore = semget(ftok(nom_absolu, 1), 0, 0)) == -1) |
|
{ |
|
free(nom_absolu); |
|
return(EINVAL); |
|
} |
|
|
|
commande.sem_num = 0; |
|
commande.sem_op = 0; |
|
commande.sem_flg = 0; |
|
|
|
if (semop(semaphore, &commande, 1) == -1) |
|
{ |
|
free(nom_absolu); |
|
return(EINVAL); |
|
} |
|
|
|
if (semctl(semaphore, IPC_RMID, 0) == -1) |
|
{ |
|
free(nom_absolu); |
|
return(EINVAL); |
|
} |
|
|
|
if (unlink(nom_absolu) == -1) |
if (unlink(nom_absolu) == -1) |
{ |
{ |