version 1.11, 2010/08/18 12:56:55
|
version 1.30, 2011/09/18 18:06:01
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.0.18 |
RPL/2 (R) version 4.1.3 |
Copyright (C) 1989-2010 Dr. BERTRAND Joël |
Copyright (C) 1989-2011 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
|
|
Line 24
|
Line 24
|
|
|
#ifdef SEMAPHORES_NOMMES |
#ifdef SEMAPHORES_NOMMES |
|
|
|
// Les fonctions suivantes ne sont utilisées que dans le cas d'un |
|
// système POSIX qui ne possède pas de sémaphores anonymes. MacOS X |
|
// est dans ce cas. |
|
|
|
static unsigned char * |
|
nom_segment_semaphore(pid_t pid) |
|
{ |
|
unsigned char *fichier; |
|
|
|
if ((fichier = malloc((1 + 256 + 1) * sizeof(unsigned char))) == NULL) |
|
{ |
|
return(NULL); |
|
} |
|
|
|
sprintf(fichier, "/RPL-SIGSEMAPHORE-%d", (int) pid); |
|
return(fichier); |
|
} |
|
|
|
|
/* |
/* |
================================================================================ |
================================================================================ |
Fonctions d'émulation de sémaphores anonymes |
Fonctions d'émulation de sémaphores anonymes |
Line 37
|
Line 56
|
*/ |
*/ |
|
|
sem_t * |
sem_t * |
sem_init2(unsigned int valeur, enum t_semaphore semaphore) |
sem_init2(unsigned int valeur, pid_t pid) |
{ |
{ |
snprintf(noms_semaphores[semaphore], LONGUEUR_NOM_SEMAPHORE, |
sem_t *semaphore; |
"/RPL-SEM-%d-%llu-%d", (int) getpid(), |
|
(unsigned long long) pthread_self(), |
unsigned char *chemin; |
(int) semaphore); |
unsigned int i; |
return(sem_open(noms_semaphores[semaphore], O_CREAT, |
|
(S_IRUSR | S_IWUSR), valeur)); |
if ((chemin = nom_segment_semaphore(pid)) == NULL) |
|
{ |
|
return(SEM_FAILED); |
|
} |
|
|
|
semaphore = sem_open(chemin, O_CREAT, (S_IRUSR | S_IWUSR), valeur); |
|
free(chemin); |
|
|
|
for(i = 0; i < valeur; i++) |
|
{ |
|
if (sem_post(semaphore) != 0) |
|
{ |
|
sem_close(semaphore); |
|
return(SEM_FAILED); |
|
} |
|
} |
|
|
|
return(semaphore); |
} |
} |
|
|
|
|
|
sem_t * |
|
sem_open2(pid_t pid) |
|
{ |
|
unsigned char *chemin; |
|
|
|
sem_t *semaphore; |
|
|
|
if ((chemin = nom_segment_semaphore(pid)) == NULL) |
|
{ |
|
return(1); |
|
} |
|
|
|
semaphore = sem_open(chemin, O_RDWR); |
|
free(chemin); |
|
|
|
return(semaphore); |
|
} |
|
|
|
|
int |
int |
sem_destroy2(sem_t *semaphore_p, enum t_semaphore semaphore) |
sem_destroy2(sem_t *semaphore, pid_t pid) |
{ |
{ |
sem_close(semaphore_p); |
int erreur; |
return(sem_unlink(noms_semaphores[semaphore])); |
|
|
unsigned char *chemin; |
|
|
|
sem_close(semaphore); |
|
|
|
if ((chemin = nom_segment_semaphore(pid)) == NULL) |
|
{ |
|
return(1); |
|
} |
|
|
|
erreur = sem_unlink(chemin); |
|
free(chemin); |
|
|
|
return(erreur); |
} |
} |
|
|
#undef sem_post |
#undef sem_post |
Line 65 sem_getvalue2(sem_t *semaphore, int *val
|
Line 134 sem_getvalue2(sem_t *semaphore, int *val
|
|
|
logical1 drapeau_fin; |
logical1 drapeau_fin; |
|
|
|
// Si on ne peut pas décrémenter le sémaphore, c'est qu'il était |
|
// déjà nul. |
pthread_mutex_lock(&mutex_sem); |
pthread_mutex_lock(&mutex_sem); |
|
|
(*valeur) = 0; |
(*valeur) = 0; |
Line 107 sem_getvalue2(sem_t *semaphore, int *val
|
Line 178 sem_getvalue2(sem_t *semaphore, int *val
|
|
|
#endif |
#endif |
|
|
#ifdef SEMAPHORES_SYSV |
#ifdef IPCS_SYSV |
|
|
/* |
/* |
================================================================================ |
================================================================================ |
Line 125 sem_getvalue2(sem_t *semaphore, int *val
|
Line 196 sem_getvalue2(sem_t *semaphore, int *val
|
extern unsigned char *chemin_semaphores_SysV; |
extern unsigned char *chemin_semaphores_SysV; |
#else |
#else |
unsigned char racine_semaphores_OS2[] = "\\SEM32\\"; |
unsigned char racine_semaphores_OS2[] = "\\SEM32\\"; |
unsigned char racine_memoire_OS2[] = "\\SHAREDMEM\\"; |
unsigned char racine_memoire_OS2[] = "\\SHAREMEM\\"; |
#endif |
|
|
|
#ifndef UNION_SEMUN |
|
union semun |
|
{ |
|
int val; |
|
struct semid_ds *buf; |
|
unsigned short *array; |
|
struct seminfo *__buf; |
|
}; |
|
#endif |
#endif |
|
|
int |
int |
Line 162 sem_init_SysV(sem_t *semaphore, int shar
|
Line 223 sem_init_SysV(sem_t *semaphore, int shar
|
|
|
if ((*semaphore).sem == -1) |
if ((*semaphore).sem == -1) |
{ |
{ |
perror("sem_init"); |
|
errno = EINVAL; |
errno = EINVAL; |
return(-1); |
return(-1); |
} |
} |
Line 242 sem_destroy_SysV(sem_t *semaphore)
|
Line 302 sem_destroy_SysV(sem_t *semaphore)
|
return(0); |
return(0); |
} |
} |
|
|
if (semctl((*semaphore).sem, IPC_RMID, 0) == -1) |
if (semctl((*semaphore).sem, 0, IPC_RMID) == -1) |
{ |
{ |
return(EINVAL); |
return(EINVAL); |
} |
} |
Line 310 sem_wait_SysV(sem_t *semaphore)
|
Line 370 sem_wait_SysV(sem_t *semaphore)
|
{ |
{ |
if (errno != EINTR) |
if (errno != EINTR) |
{ |
{ |
perror("sem_wait"); |
|
errno = EINVAL; |
errno = EINVAL; |
return(-1); |
return(-1); |
} |
} |
Line 865 sem_unlink_SysV(const char *nom)
|
Line 924 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), IPC_RMID, 0); |
semctl(semget(ftok(nom_absolu, 1), 0, 0), 0, IPC_RMID); |
|
|
if (unlink(nom_absolu) == -1) |
if (unlink(nom_absolu) == -1) |
{ |
{ |