|
@@ -9,6 +9,7 @@
|
|
|
#include <stdlib.h>
|
|
|
#include <errno.h>
|
|
|
#include "ipc.h"
|
|
|
+#include "variable.h"
|
|
|
|
|
|
/* --- Extern --- */
|
|
|
ipc_mysh ipc;
|
|
@@ -25,6 +26,10 @@ boolean setup_ipc(char** envp){
|
|
|
if(!create_shm(&ipc.gestionnaire, SHMCODEGEST, sizeof(subdiv))){
|
|
|
return false;
|
|
|
}
|
|
|
+ //SHM pour variable globale
|
|
|
+ if(!create_shm(&ipc.global, SHMCODEGLOB, sizeof(int))){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
//Si creation alors on remplie les segments
|
|
|
if(errno != EEXIST){
|
|
|
subdiv* sd = (subdiv*) ipc.gestionnaire.adr;
|
|
@@ -38,10 +43,6 @@ boolean setup_ipc(char** envp){
|
|
|
}
|
|
|
*nb = 0;
|
|
|
}
|
|
|
- //SHM pour variable globale
|
|
|
- if(!create_shm(&ipc.global, SHMCODEGLOB, sizeof(int))){
|
|
|
- return false;
|
|
|
- }
|
|
|
//Semaphore
|
|
|
int ini[] = {1, 1, 1};
|
|
|
if(!create_sem(&ipc.sem, SEMCODE, 3, ini)){
|
|
@@ -75,4 +76,35 @@ boolean end_ipc(){
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
+}
|
|
|
+
|
|
|
+char* parse_shm_var(char* str){
|
|
|
+ //Recup variable globale
|
|
|
+ subdiv* sd = (subdiv*) ipc.gestionnaire.adr;
|
|
|
+ char* mem = (char*) ipc.memoire.adr;
|
|
|
+ int* buf = (int*) ipc.global.adr;
|
|
|
+ int nb = *buf;
|
|
|
+ char* res;
|
|
|
+ //Regarde si l'ecrivain veut ecrire
|
|
|
+ P(&ipc.sem, SEMECRIRE);
|
|
|
+ V(&ipc.sem, SEMECRIRE);
|
|
|
+ //Modification variable globale
|
|
|
+ P(&ipc.sem, SEMMUTEX);
|
|
|
+ nb++;
|
|
|
+ if(nb == 1){
|
|
|
+ P(&ipc.sem, SEMWAIT);
|
|
|
+ }
|
|
|
+ V(&ipc.sem, SEMMUTEX);
|
|
|
+ res = parse_var(str, sd, mem);
|
|
|
+ P(&ipc.sem, SEMMUTEX);
|
|
|
+ nb--;
|
|
|
+ if(nb == 0){
|
|
|
+ V(&ipc.sem, SEMWAIT);
|
|
|
+ }
|
|
|
+ V(&ipc.sem, SEMMUTEX);
|
|
|
+ return res;
|
|
|
+}
|
|
|
+
|
|
|
+boolean add_shm_data(char* data){
|
|
|
+ return true;
|
|
|
}
|