ulvis.paste.net

Paste Search Dynamic
Recent pastes
lock_n_threads_with_timeout
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "domaci1.h"
  4.  
  5. typedef struct Node Node;
  6.  
  7. struct Node {
  8.     int locked;
  9.     Node *next;
  10. };
  11.  
  12. Node* tail;
  13.  
  14. int lock_n_threads_with_timeout(int id, int* local, double timeout) {
  15.     Node *node = (Node*)malloc(sizeof(Node));
  16.     node->next = null;
  17.     node->locked = 0;
  18.     local[0] = (int)node;
  19.     int flag = 0;
  20.  
  21.     double start_time = lrk_get_time();
  22.  
  23.     Node *pred = (Node*)lrk_get_and_set((int*)&tail, (int) node);
  24.  
  25.     if (pred != null) {
  26.  
  27.         node->locked = 1;
  28.         pred->next = node;
  29.  
  30.         while (node->locked) {
  31.                 lrk_sleep(0);
  32.  
  33.             if (lrk_get_time() - start_time >= timeout) {
  34.                 node->locked = 2;
  35.                 // slucaj: desio se unlock - da mi ne zaglavi lock
  36.                 // Ako locked nije 1, onda je 0 i puci ce compare and set. Inace mora biti 2 i
  37.                 // vracamo 0;
  38.                 return lrk_compare_and_set(&node->locked, 1, 2);
  39.             }
  40.         }
  41.     }
  42.  
  43.     return 1;
  44. }
  45.  
  46. void unlock_n_threads_with_timeout(int id, int* local) {
  47.     Node *node = (Node*)local[0];
  48.     if (node->next == null) {
  49.         if (lrk_compare_and_set((int*)&tail, (int) node, (int) null)) {
  50.             return;
  51.         }
  52.         while (node->next == null) { lrk_sleep(0); }
  53.     }
  54.  
  55.     Node* pom = node->next;
  56.     // dok god je timeoutovan daj sledeceg
  57.     while (lrk_compare_and_set((int *)&pom->locked, 2, 2)) {
  58.       // Putuj dokle god moze
  59.       lrk_get_and_set((int *)&pom, (int)pom->next);
  60.     }
  61.  
  62.     // Putuj dok ne naidjes na node koji u sebi ima locked setovan na 1
  63.     // jer u medjuvremenu jer mozda timeoutovao
  64.     while (!lrk_compare_and_set((int*)&pom->locked, 1, 0)) {
  65.       pom = pom->next;
  66.     };
  67. }
  68.  
  69. int main()
  70. {
  71.     tail = null;
  72.     start_timeout_mutex_n_threads_test(0.002);
  73.     return 0;
  74. }
Parsed in 0.012 seconds