Advertisement
Guest User

Untitled

a guest
Mar 24th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "deps/domaci1.h"
  4. #define UNLOCKED 0
  5. #define WAITING 1
  6. #define TIMED_OUT 2
  7.  
  8. typedef struct Node{
  9. int flag;
  10. struct Node * next;
  11. } Node;
  12. Node* tail = NULL;
  13.  
  14. double startTime[80];
  15. double maxDelta = 0.0;
  16. double minDelta = 10;
  17. int lock_n_threads_with_timeout(int id, int* local, int timeout)
  18. {
  19. double start = get_time();
  20.  
  21. // startTime[id] = start;
  22.  
  23. double dTimeout = (double)timeout/1000.0;
  24. Node* node = (Node*) malloc(sizeof(Node));
  25. //if(node->flag != 0)
  26. node->flag = WAITING;
  27. node->next = NULL;
  28. *local = node;
  29.  
  30. Node* old = (Node*) get_and_set(&tail, node);
  31.  
  32.  
  33. if(old != NULL){
  34.  
  35. old->next = node;
  36. while(node->flag == WAITING)
  37. {
  38.  
  39.  
  40. sleep(2);
  41. if(node->flag == UNLOCKED) break;
  42. double delta = get_time() - start;
  43. if(delta > dTimeout)
  44. {
  45. if(get_and_set(&node->flag,TIMED_OUT) == UNLOCKED)
  46. {
  47.  
  48. printf("omg!!!");
  49. fflush(stdout);
  50. return 1;
  51. }
  52. //node->flag = TIMED_OUT;
  53. if(minDelta > delta) minDelta = delta;
  54. if(maxDelta < delta) maxDelta = delta;
  55.  
  56. //free(node);
  57. return 0;
  58.  
  59. }
  60.  
  61. }
  62.  
  63. }
  64. node->flag = UNLOCKED;
  65. // printf("NORMALAN!");
  66. // fflush(stdout);
  67. return 1;
  68. }
  69. void unlock_n_threads_with_timeout(int id, int* local)
  70. {
  71. // printf("UNLOCK!");
  72. // fflush(stdout);
  73. Node* node = (Node*) *local;
  74. if(node->next == NULL){
  75. if(compare_and_set((int*)&tail, (int)node, (int)NULL)){
  76.  
  77. }
  78. else{
  79. while(node->next == NULL){
  80. printf("sleep2");
  81. fflush(stdout);
  82. sleep(1);
  83. }
  84. node->next->flag = UNLOCKED;
  85.  
  86. }
  87. } else{
  88. Node* myNext = node->next;
  89. //da li je next timeoutovao, odnosno next->next pa next-next-next
  90. while(1)
  91. {
  92.  
  93. if(compare_and_set(&myNext->flag, WAITING, UNLOCKED))
  94. {
  95. //return;
  96. break;
  97. }
  98. else
  99. {
  100.  
  101. if(myNext->next == NULL)
  102. {
  103. if(compare_and_set((int*)&tail, (int)myNext, (int)NULL))
  104. {
  105. break;
  106. }
  107. else
  108. {
  109. while(myNext->next == NULL)
  110. {
  111. printf("sleepTO");
  112. fflush(stdout);
  113. sleep(1);
  114. }
  115. myNext = myNext->next;
  116. }
  117. }
  118. else
  119. {
  120.  
  121. myNext = myNext->next;
  122. }
  123. }
  124. sleep(1);
  125. }
  126. // myNext = myNext->next; //i to mora u taj cas
  127. //dal ispala iz liste
  128.  
  129. //moze doci do context switcha, pa mora cas ovde negde
  130. // myNext->flag = 0;//ovo mora u cas
  131. //proveriti da li je sledeci timeoutovao
  132. // free(node);
  133. }
  134.  
  135. // double finalDelta = get_time() - startTime[id];
  136. // if(finalDelta > maxDelta) maxDelta = finalDelta;
  137. // if(finalDelta < minDelta) minDelta = finalDelta;
  138.  
  139. }
  140.  
  141. int main()
  142. {
  143.  
  144. start_timeout_mutex_n_threads_test();
  145. printf("MAX DELTA = %.5lf\n", maxDelta);
  146. printf("MIN DELTA = %.5lf", minDelta);
  147. return 0;
  148.  
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement