l3.libnazgul/src/nzg_msgList.c
2020-03-03 23:46:32 +01:00

190 lines
3.7 KiB
C

#include "libnazgul.h"
// fonction pour la creation d'une liste de msgSpace
// cree un shm qui connait l'element de debut de liste
// et l'element de fin de liste.
// il ne se crée que s'il n'en existe pas deja un.
//
// crée également un sémaphore de gestion de liste
// a verouiller avant toute modification
int msgSpaceListInit();
// verouille le semaphore de la liste
int msgSpaceListLock();
// deverouille le semaphore de la liste
int msgSpaceListUnlock();
// cree un nouvel elemen
int msgSpaceListElemCreate(msgSpaceListElemId resultName,msgSpaceId spaceId);
// modifie l'element suivant de l'element choisi
// et le fait pointer sur un nouvel ID
int msgSpaceListElemLinkNext(msgSpaceListElemId current,msgSpaceListElemId next);
// ajoute un element en début de liste.
// fait pointer l'ancien dernier vers lui
// il s'enregistre en tant que dernier chez la liste
int msgSpaceListAdd(msgSpaceListElemId );
int msgSpaceListRem(msgSpaceListElemId spaceId);
char *spaceList;
sem_t * sem;
int msgSpaceListInit(){
int descMemory;
msgSpaceListElemId idList;
/*Fait un segment de memoir partager sur espace de listelement*/
if( (descMemory=shm_open(idList,O_RDWR|O_CREAT|O_EXCL|O_TRUNC,0600))==-1){
printf("Erreur de shmopen");
}
/*Creation de semaphore*/
sem=sem_open(spaceList,O_CREAT|O_EXCL,0666,1024);
if(sem==SEM_FAILED){
printf("erreur de semaphore");
return -1;
}
/*Verouille le semaphore*/
if(sem_wait(sem)==-1){
printf("erreur pour l'ajout d'un semaphore");
return -1;
}
return 0;
};
int msgSpaceListLock(){
/*Ouverture d'un verrou d'un semafore*/
sem=sem_open(spaceList,O_CREAT|O_EXCL,0666,1024);
if(sem==SEM_FAILED){
printf("erreur de semaphore");
return -1;
}
/*Pose d'un semafore et bloque*/
if(sem_wait(sem)==-1){
printf("erreur pour l'ajout d'un semaphore");
return -1;
}
return 0;
}
int msgSpaceListUnlock(){
/* Ferme le semaphore*/
if(sem_close(sem)==-1){
printf("erreur sem_close");
return -1;
}
/*semaphore non bloquant*/
if (sem_trywait(sem)==-1){
printf("erreur sem_trywait");
return -1;
}
return 0;
};
// cree un nouvel elemen
int msgSpaceListElemCreate(msgSpaceListElemId resultName,msgSpaceId spaceId){
return 0;
};
/*void *add(char * idAncien, char *idNouveau);
int descMemory;
void * add(char * idAncien, char *idNouveau){
descMemory=shm_open("/titi",
O_RDWR|O_CREAT|O_EXCL|O_TRUNC,
0600);
if (descMemory== -1){
printf("erreur de sh_open\n");
return NULL;
};
if (ftruncate(descMemory,1024)== -1 ){
printf("erreur ftruncate");
}
memory= mmap(0, 1024,
PROT_READ | PROT_WRITE,
MAP_SHARED, mSFd, 0)*/
/*typedef struct MsgSpaceListElem {
void * id;
int ownerPid;
msgSpaceListElemId next;
} * msgSpaceList, msgSpaceListElem;
msgSpaceListElemId *mslist;
if( Strcpy(idAncien, idNouveau) ==-1){
printf("erreur de strcpy");
};
strcpy(idAncien, idNouveau);
return NULL;
}
*/
/* ajout dans la liste */
/*AVEC POINTEUR */
/*
msgSpaceListElem *addBegining( msgSpaceListElem*list,int ownerpid){
msgSpaceListElem *unSpacemsgListElem;
if( (unSpacemsgListElem=(msgSpaceListElem *)malloc(sizeof(msgSpaceListElem) ) )==NULL){
perror("ereur dallocation de memoire");
exit(1);}
unSpacemsgListElem->ownerPid = ownerpid;
return(unSpacemsgListElem);
}
int test(int argc,char **argv){
msgSpaceListElem *ma_liste;
msgSpaceListElem *listMove;
ma_liste=NULL;
ma_liste=addBegining(ma_liste, 3);
ma_liste=addBegining(ma_liste, 6);
ma_liste=addBegining(ma_liste, 5);
for (listMove=ma_liste ;listMove!=NULL ; listMove=listMove->next)
{
printf("valaeur :%d\n",listMove->ownerPid);
}
return(0);
}
*/