Advertisement
v3rganz

Untitled

May 20th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.19 KB | None | 0 0
  1. #include "header.h"
  2.  
  3. int generateMessage(char *buf) {
  4.   int length = rand() % (MSGSIZE - 2) + 1; //length from 1 to SIZE_MSG-1
  5.   int i;
  6.   for(i = 0; i < length; ++i) {
  7.     buf[i] = (char)(rand() % (END_CHAR - START_CHAR) + START_CHAR);
  8.   }
  9.   buf[length] = '\0';
  10.   ++length;
  11.  
  12.   return length;
  13. }
  14.  
  15. int increaseReaders(int             sem,
  16.                     struct sembuf*  incrReaders,
  17.                     struct sembuf*  waitForRead,
  18.                     int*            readcount)
  19. {
  20.   if(semop(sem, incrReaders, 1) == ERRCODE) {
  21.     perror("semop");
  22.     return EXIT_FAILURE;
  23.   }
  24.   if(readcount == 0){
  25.     if(semop(sem, waitForRead, 1) == ERRCODE) {
  26.     perror("semop");
  27.     return EXIT_FAILURE;
  28.     }
  29.   }
  30.   ++*readcount;
  31. return EXIT_SUCCESS;
  32. }
  33.  
  34. int decreaseReaders(int             sem,
  35.                     struct sembuf*  decrReaders,
  36.                     struct sembuf*  makeWritePossible,
  37.                     int*            readcount)
  38. {
  39.   if(semop(sem, decrReaders, 1) == ERRCODE) {
  40.     perror("semop");
  41.     return EXIT_FAILURE;
  42.   }
  43.   --*readcount;
  44.   if(readcount == 0){
  45.     if(semop(sem, makeWritePossible, 1) == ERRCODE) {
  46.     perror("semop");
  47.     return EXIT_FAILURE;
  48.     }
  49.   }
  50.   return EXIT_SUCCESS;
  51. }
  52.  
  53.  
  54. int performRead(char* messageBegin){
  55.   if(*messageBegin == END_PRODUCE) {
  56.     printf("End work\n");
  57.     return EXIT_FAILURE;
  58.   }
  59.   printf("recv: %s\n", messageBegin);
  60.  
  61.   return EXIT_SUCCESS;
  62. }
  63.  
  64. int initWrite(int             sem,
  65.               struct sembuf*  blockForWrite,
  66.               struct sembuf*  waitForWrite)
  67. {
  68.   if(semop(sem, blockForWrite, 1) == ERRCODE) {
  69.     perror("semop");
  70.     return EXIT_FAILURE;
  71.   }
  72.   if(semop(sem, waitForWrite, 1) == ERRCODE) {
  73.     perror("semop");
  74.     return EXIT_FAILURE;
  75.   }
  76.   return EXIT_SUCCESS;
  77. }
  78.  
  79. void performWrite(char* messageBegin){
  80.   generateMessage(messageBegin);
  81. }
  82.  
  83. int endWrite(int            sem,
  84.              struct sembuf* freeForRead,
  85.              struct sembuf* freeForWrite)
  86. {
  87.   if(semop(sem, freeForRead, 1) == ERRCODE) {
  88.     perror("semop");
  89.     return EXIT_FAILURE;
  90.   }
  91.   if(semop(sem, freeForWrite, 1) == ERRCODE) {
  92.     perror("semop");
  93.     return EXIT_FAILURE;
  94.   }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement