Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.82 KB | None | 0 0
  1. #include <taskLib.h>
  2. #include <stdio.h>
  3. #include <kernelLib.h>
  4. #include <semLib.h>
  5. #include <main.h>
  6.  
  7. #define WORK_TIME 100
  8. #define BREAK_TIME 200
  9.  
  10.  
  11.  
  12.  
  13. struct company_registry *ptr;
  14.  
  15. SEM_ID semShovels;
  16. SEM_ID semSoilHeap;
  17. SEM_ID semCompanyLock;
  18.  
  19. int lowerIDs[100];
  20. int upperIDs[100];
  21.  
  22. char c = '\0';
  23. char workerName[20] = "tWorker\n";
  24. int diggers = -1;
  25. int lowerDiggers = -1;
  26. int upperDiggers = -1;
  27. int i;
  28.  
  29. void digger_in_hole(int n, SEM_ID semShovels, SEM_ID semSoilHeap) {
  30. while (1) {
  31. //taskSafe();
  32. printf("lower digger %d: waiting for shovel\n", n);
  33. taskSafe();
  34. semTake(semShovels, WAIT_FOREVER);
  35. printf("lower digger %d: taking shovel\n", n);
  36. //printf("lower digger %d: working\n", n);
  37.  
  38. taskDelay(WORK_TIME);
  39. //taskUnsafe();
  40. semGive(semSoilHeap);
  41. printf("lower digger %d: putting to heap\n", n);
  42. printf("lower digger %d: returning shovel\n", n);
  43. semGive(semShovels);
  44. taskUnsafe();
  45. printf("lower digger %d: taking break\n", n);
  46.  
  47. taskDelay(BREAK_TIME);
  48. }
  49. }
  50.  
  51. void digger_on_top(int n, SEM_ID semShovels, SEM_ID semSoilHeap) {
  52. while (1) {
  53. //
  54. semTake(semSoilHeap, WAIT_FOREVER);
  55. printf("upper digger %d: waiting for shovel\n", n);
  56. taskSafe();
  57. semTake(semShovels, WAIT_FOREVER);
  58. printf("upper digger %d: taking shovel\n", n);
  59. //printf("upper digger %d: working\n", n);
  60. //taskSafe();
  61. taskDelay(WORK_TIME);
  62. //taskUnsafe();
  63.  
  64. printf("upper digger %d: taking from heap\n", n);
  65. printf("upper digger %d: returning shovel\n", n);
  66. /*tady incrementovat práci*/
  67.  
  68. semTake(semCompanyLock, WAIT_FOREVER);
  69. ptr->companies[ID].work_done++;
  70. semGive(semCompanyLock);
  71.  
  72. semGive(semShovels);
  73. taskUnsafe();
  74. printf("upper digger %d: taking break\n", n);
  75.  
  76. taskDelay(BREAK_TIME);
  77. }
  78. }
  79.  
  80. void init_shm(void) {
  81. int fd, shm_creation = 1;
  82.  
  83. /* Lock to protect manipulations with shared memory - accessible from multiple processes */
  84. // semOpen - vytvori semafor - Wind API, named semaphore (named object)
  85. semCompanyLock = semOpen("/complock", SEM_TYPE_MUTEX, SEM_FULL, SEM_Q_FIFO, OM_CREATE, NULL);
  86. /* use semTake() and semGive() to protect the relevant code below */
  87. semTake(semCompanyLock, WAIT_FOREVER); // aby ine tasky nic nikam nezapisovali
  88.  
  89. //fd = shm_open("/company", O_RDWR | O_CREAT, S_IRUSR|S_IWUSR);
  90. /* or consider using O_EXCL flag to find whether the memory
  91. * needs to be initialized (see memset below) or not */
  92. fd = shm_open("/company", O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
  93.  
  94. if (fd == -1) {
  95. //printf("Shm alrready created.\n");
  96. shm_creation = 0;
  97. fd = shm_open("/company", O_RDWR, S_IRUSR | S_IWUSR);
  98. if (fd == -1) {
  99. printf("FD ERROR.\n");
  100. semGive(semCompanyLock);
  101. exit(1);
  102. }
  103. //semGive(lock);
  104. //return;
  105. }
  106.  
  107. if (shm_creation == 1)
  108. /* set the size of shared memory block */
  109. if (ftruncate(fd, sizeof (struct company_registry)) == -1) {
  110. perror("ftruncate");
  111. exit(1);
  112. }
  113.  
  114. /* Map shared memory object in the process address space */
  115. ptr = (struct company_registry *) mmap(0, sizeof (struct company_registry),
  116. PROT_READ | PROT_WRITE,
  117. MAP_SHARED, fd, 0);
  118.  
  119. if (ptr == (struct company_registry *) MAP_FAILED)
  120. exit(1);
  121.  
  122. /* close the file descriptor; the mapping is not impacted by this */
  123. close(fd);
  124.  
  125. /* ... */
  126.  
  127. if (shm_creation == 1)
  128. /* the fist company should zero the memory this way: */
  129. memset(ptr, 0, sizeof (struct company_registry));
  130.  
  131. /* ... register this company to the memory ... */
  132.  
  133. semGive(semCompanyLock);
  134. if (shm_creation == 1)
  135. printf("Init shm done.\n");
  136. else
  137. printf("Mapped to existing shm.\n");
  138. }
  139.  
  140. void log_out(void) {
  141. taskSafe();
  142. semTake(semCompanyLock, WAIT_FOREVER);
  143. ptr->companies[ID].work_done = 0;
  144. ptr->companies[ID].name[0] = '\0';
  145. semGive(semCompanyLock);
  146. taskUnsafe();
  147. }
  148.  
  149. int main(int argc, const char* argv[]) {
  150.  
  151.  
  152. init_shm();
  153.  
  154. semShovels = semCCreate(SEM_Q_FIFO, 3);
  155. semSoilHeap = semCCreate(SEM_Q_FIFO, 0);
  156.  
  157.  
  158. diggers += 1;
  159. lowerDiggers += 1;
  160. upperDiggers += 1;
  161. lowerIDs[0] = taskSpawn("lWorker0", 210, 0, 4096, (FUNCPTR) digger_in_hole, lowerDiggers, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  162. diggers += 1;
  163. upperIDs[0] = taskSpawn("uWorker0", 210, 0, 4096, (FUNCPTR) digger_on_top, upperDiggers, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  164.  
  165.  
  166.  
  167. while (1) {
  168. c = getchar();
  169. switch (c) {
  170. case('i'):
  171. {
  172. printf("LowWorker in\n");
  173. diggers += 1;
  174. lowerDiggers += 1;
  175. sprintf(workerName, "lWorker%d", lowerDiggers);
  176. lowerIDs[lowerDiggers] = taskSpawn(workerName, 210, 0, 4096, (FUNCPTR) digger_in_hole, lowerDiggers, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  177. printf("Working workers %d low:%d up:%d\n", diggers + 1, lowerDiggers + 1, upperDiggers + 1);
  178. break;
  179. }
  180. case('I'):
  181. {
  182. printf("UpWorker in\n");
  183. diggers += 1;
  184. upperDiggers += 1;
  185. sprintf(workerName, "uWorker%d", upperDiggers);
  186. upperIDs[upperDiggers] = taskSpawn(workerName, 210, 0, 4096, (FUNCPTR) digger_on_top, upperDiggers, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  187. printf("Working workers %d low:%d up:%d\n", diggers + 1, lowerDiggers + 1, upperDiggers + 1);
  188. break;
  189. }
  190. case('o'):
  191. {
  192. if (lowerDiggers >= 0) {
  193. printf("LowWorker out\n");
  194. taskDelete(lowerIDs[lowerDiggers]);
  195. diggers--;
  196. lowerDiggers--;
  197. printf("Working workers %d low:%d up:%d\n", diggers + 1, lowerDiggers + 1, upperDiggers + 1);
  198. } else {
  199. printf("No worker left\n");
  200. }
  201. break;
  202. }
  203. case('O'):
  204. {
  205. if (upperDiggers >= 0) {
  206. printf("UpWorker out\n");
  207. taskDelete(upperIDs[upperDiggers]);
  208. diggers--;
  209. upperDiggers--;
  210. printf("Working workers %d low:%d up:%d\n", diggers + 1, lowerDiggers + 1, upperDiggers + 1);
  211. } else {
  212. printf("No worker left\n");
  213. }
  214. break;
  215. }
  216. case('E'):
  217. {
  218. if (upperDiggers >= 0) {
  219. for (i = upperDiggers; i >= 0; --i) {
  220. taskDelete(upperIDs[i]);
  221. diggers--;
  222. }
  223. upperDiggers = -1;
  224. }
  225. if (lowerDiggers >= 0) {
  226. for (i = lowerDiggers; i >= 0; --i) {
  227. taskDelete(lowerIDs[i]);
  228. diggers--;
  229. }
  230. lowerDiggers = -1;
  231. }
  232. printf("Working workers:%d low:%d up:%d\n", diggers + 1, lowerDiggers + 1, upperDiggers + 1);
  233. printf("Terminating...\n");
  234. taskDelay(250);
  235. printf("Done\n");
  236. return (0);
  237. }
  238. case('\n'):
  239. {
  240. break;
  241. }
  242. default:
  243. {
  244. printf("Wrong input!\n");
  245. break;
  246. }
  247. }
  248.  
  249. }
  250.  
  251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement