Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.22 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/msg.h>
  4. #include <string.h>
  5.  
  6. double *results;
  7. size_t messageSize;
  8.  
  9. struct message {
  10.     int matrixWidth;
  11.     int mpStart;
  12.     int rCount;
  13.     double *vector;
  14.     double *matrixPart;
  15. };
  16.  
  17. /* message structure */
  18. struct msgbuf {
  19.     long mtype;
  20.     char mtext[10];
  21. };
  22.  
  23. void sendMessage(int messageQueueId, double message) {
  24.     struct msgbuf msgbuf;
  25.     char str[10];
  26.     sprintf(str, "%lf", message);
  27.     strcpy(msgbuf.mtext, str);
  28.     msgbuf.mtype = 2;
  29.     /* send message to queue */
  30.     if (msgsnd(messageQueueId, &msgbuf, messageSize, 0) == -1) {
  31.         perror("calc msgsnd");
  32.         printf("calc msgsnd %d\n", messageQueueId);
  33.         exit(1);
  34.     }
  35. }
  36.  
  37. double receiveMessage(int messageQueueId) {
  38.     struct msgbuf msgbuf;
  39.     messageSize = sizeof(msgbuf.mtext) + 1;
  40.     char *ptr;
  41.     /* receive message from queue */
  42.     if (msgrcv(messageQueueId, &msgbuf, messageSize, 1, 0) == -1) {
  43.         perror("calc msgrcv");
  44.         printf("calc msgrcv %d\n", messageQueueId);
  45.         exit(1);
  46.     }
  47.     return strtod(msgbuf.mtext, &ptr);
  48. }
  49.  
  50. struct message receiveData(int messageQueueId) {
  51.     struct message message;
  52.     message.matrixWidth = (int) receiveMessage(messageQueueId);
  53.     message.mpStart = (int) receiveMessage(messageQueueId);
  54.     message.rCount = (int) receiveMessage(messageQueueId);
  55.     message.vector = (double *) calloc(message.matrixWidth, sizeof(double));
  56.     /* receive vector from queue */
  57.     for (int i = 0; i < message.matrixWidth; i += 1) {
  58.         message.vector[i] = receiveMessage(messageQueueId);
  59.     }
  60.  
  61.     int mpSize = message.matrixWidth * message.rCount;
  62.     message.matrixPart = (double *) calloc(mpSize, sizeof(double));
  63.     /* receive matrix from queue */
  64.     for (int i = 0; i < mpSize; i += 1) {
  65.         message.matrixPart[i] = receiveMessage(messageQueueId);
  66.     }
  67.     printf("%d received everything\n", messageQueueId);
  68.     return message;
  69. }
  70.  
  71. void doCalculations(struct message message) {
  72.     int shift;
  73.     results = (double *) calloc(message.matrixWidth, sizeof(double));
  74.     for (int i = 0; i < message.rCount; i += 1) {
  75.         shift = i * message.matrixWidth;
  76.         for (int j = 0; j < message.matrixWidth; j += 1)
  77.             results[i] += message.matrixPart[shift + j] * message.vector[j];
  78.     }
  79. }
  80.  
  81. void sendResults(int messageQueueId, struct message message) {
  82.     sendMessage(messageQueueId, message.mpStart);
  83.     sendMessage(messageQueueId, message.rCount);
  84.     /* send results to queue */
  85.     for (int i = 0; i < message.rCount; i += 1) {
  86.         sendMessage(messageQueueId, results[i]);
  87.     }
  88. }
  89.  
  90. void doCleanup(struct message message) {
  91.     free(message.matrixPart);
  92.     free(message.vector);
  93.     free(results);
  94. }
  95.  
  96. int main(int argc, char *argv[]) {
  97.     if (argc != 2) {
  98.         printf("USAGE: satellite.exe message_queue_id\n");
  99.         exit(1);
  100.     }
  101.     char *ptr;
  102.     int messageQueueId = (int) strtol(argv[1], &ptr, 10);
  103.     printf("messageQueueId %d\n", messageQueueId);
  104.     struct message message = receiveData(messageQueueId);
  105.     doCalculations(message);
  106.     sendResults(messageQueueId, message);
  107.     doCleanup(message);
  108.     printf("WOW %d\n", messageQueueId);
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement