Commit c72d79dd1f4a93c0c7cd07821d8e6416eb48952f

Authored by henyxia
1 parent c21a2c16

Semaphores controlled

Showing 2 changed files with 98 additions and 8 deletions   Show diff stats
@@ -6,16 +6,95 @@ @@ -6,16 +6,95 @@
6 #include <fcntl.h> 6 #include <fcntl.h>
7 #include <errno.h> 7 #include <errno.h>
8 #include <string.h> 8 #include <string.h>
  9 +#include <sys/ipc.h>
  10 +#include <sys/sem.h>
9 #include "printx.h" 11 #include "printx.h"
10 #include "ui.h" 12 #include "ui.h"
11 #include "nfc.h" 13 #include "nfc.h"
12 #include "hvc.h" 14 #include "hvc.h"
13 15
14 -#define CMD_MAX 70 16 +#define CMD_MAX 70
  17 +#define KEY 1100
  18 +#define SEM_NUMBER 2
  19 +#define SEM_INPUT 0
  20 +#define SEM_OUTPUT 1
15 21
16 int bus; 22 int bus;
17 bool busFree = true; 23 bool busFree = true;
18 bool busStop = false; 24 bool busStop = false;
  25 +int mySem;
  26 +
  27 +int get_sem(int i)
  28 +{
  29 + ushort semarr[30];
  30 + union semun
  31 + {
  32 + int val;
  33 + struct semid_ds *buf;
  34 + ushort *array;
  35 + }arg;
  36 +
  37 + arg.array = semarr;
  38 + semctl(mySem, i, GETALL, arg);
  39 + return semarr[i];
  40 +}
  41 +
  42 +void show_sem(int i)
  43 +{
  44 + int val;
  45 + val = get_sem(i);
  46 + printf("semaphore[%d]=%d\n", i, val);
  47 +}
  48 +
  49 +void create_sem(int N)
  50 +{
  51 + printx(DEBUG, BUS, "create %d semaphores\n", N);
  52 + mySem = semget(KEY, N, 0666 | IPC_CREAT);
  53 + if(mySem < 0)
  54 + printx(ERROR, BUS, "Unable to create the semaphore\n");
  55 +}
  56 +
  57 +void init_sem(int N)
  58 +{
  59 + int j;
  60 + int retval;
  61 + union semun
  62 + {
  63 + int val;
  64 + struct semid_ds *buf;
  65 + ushort *array;
  66 + }arg;
  67 + arg.val = 1;
  68 + for (j=0; j<N; j++)
  69 + {
  70 + retval = semctl(mySem, j, SETVAL, arg);
  71 + if(retval < 0)
  72 + printx(ERROR, BUS, "Unable to initialize the semaphore\n");
  73 + }
  74 +}
  75 +
  76 +void PV(int i, int act)
  77 +{
  78 + struct sembuf op;
  79 + int retval;
  80 +
  81 + op.sem_num = i;
  82 + op.sem_op = act; //1=V, -1=P
  83 + op.sem_flg = 0; //will wait
  84 + retval = semop(mySem, &op, 1);
  85 + if(retval != 0)
  86 + printx(ERROR, BUS, "Error semop will do %d\n", act);
  87 +}
  88 +
  89 +void P(int i)
  90 +{
  91 + PV(i, -1);
  92 +}
  93 +
  94 +void V(int i)
  95 +{
  96 + PV(i, 1);
  97 +}
19 98
20 void stopBus() 99 void stopBus()
21 { 100 {
@@ -59,7 +138,7 @@ void processCmd(char* buffer) @@ -59,7 +138,7 @@ void processCmd(char* buffer)
59 setHeatTimer(5); 138 setHeatTimer(5);
60 setHeatWantedState(true); 139 setHeatWantedState(true);
61 } 140 }
62 - else if(strcmp(buffer, "setheaton35s") == 0) 141 + else if(strcmp(buffer, "setheaton10s") == 0)
63 { 142 {
64 printx(INFO, BUS, "Setting HEAT ON for 10 secs"); 143 printx(INFO, BUS, "Setting HEAT ON for 10 secs");
65 setHeatTimer(10); 144 setHeatTimer(10);
@@ -82,8 +161,9 @@ void* processBus(void* we) @@ -82,8 +161,9 @@ void* processBus(void* we)
82 printx(DEBUG, BUS, "Waiting for events\n"); 161 printx(DEBUG, BUS, "Waiting for events\n");
83 while(!busStop) 162 while(!busStop)
84 { 163 {
85 - while(busFree);  
86 - while(!busFree); 164 + P(SEM_OUTPUT);
  165 + //while(busFree);
  166 + //while(!busFree);
87 printx(DEBUG, BUS, "Event receved !\n"); 167 printx(DEBUG, BUS, "Event receved !\n");
88 busFree = false; 168 busFree = false;
89 lseek(bus, 0, SEEK_SET); 169 lseek(bus, 0, SEEK_SET);
@@ -93,12 +173,17 @@ void* processBus(void* we) @@ -93,12 +173,17 @@ void* processBus(void* we)
93 processCmd(buffer); 173 processCmd(buffer);
94 busFree = true; 174 busFree = true;
95 printx(DEBUG, BUS, buffer); 175 printx(DEBUG, BUS, buffer);
  176 + V(SEM_INPUT);
96 } 177 }
97 return NULL; 178 return NULL;
98 } 179 }
99 180
100 bool initBus() 181 bool initBus()
101 { 182 {
  183 + create_sem(SEM_NUMBER);
  184 + printx(ERROR, BUS, "Oh dear, something went wrong with %s !\n", strerror(errno));
  185 + init_sem(SEM_INPUT);
  186 + init_sem(SEM_OUTPUT);
102 bus = creat("bus.log", 0666); 187 bus = creat("bus.log", 0666);
103 if(bus == -1) 188 if(bus == -1)
104 { 189 {
@@ -106,16 +191,18 @@ bool initBus() @@ -106,16 +191,18 @@ bool initBus()
106 return false; 191 return false;
107 } 192 }
108 193
  194 + //P(SEM_INPUT);
  195 +
109 return true; 196 return true;
110 } 197 }
111 198
112 void sendToBus(char* cmd) 199 void sendToBus(char* cmd)
113 { 200 {
114 - while(!busFree);  
115 - busFree = false; 201 + printx(DEBUG, BUS, "Control semaphore %d in %d out %d\n", mySem, get_sem(SEM_INPUT), get_sem(SEM_OUTPUT));
  202 + P(SEM_INPUT);
116 ftruncate(bus, 0); 203 ftruncate(bus, 0);
117 ftruncate(bus, CMD_MAX); 204 ftruncate(bus, CMD_MAX);
118 lseek(bus, 0, SEEK_SET); 205 lseek(bus, 0, SEEK_SET);
119 dprintf(bus, "%s\n", cmd); 206 dprintf(bus, "%s\n", cmd);
120 - busFree = true; 207 + V(SEM_OUTPUT);
121 } 208 }
@@ -11,7 +11,10 @@ @@ -11,7 +11,10 @@
11 int main(void) 11 int main(void)
12 { 12 {
13 int ret; 13 int ret;
14 - pthread_t tUI, tNFC, tBUS, tHVC; 14 + pthread_t tUI;
  15 + pthread_t tNFC;
  16 + pthread_t tBUS;
  17 + pthread_t tHVC;
15 initUILog(); 18 initUILog();
16 if(!initLog()) 19 if(!initLog())
17 { 20 {