Advertisement
Guest User

Untitled

a guest
Jun 25th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.85 KB | None | 0 0
  1. /*     header.h     */
  2. #ifndef _Timer_Header_Included_
  3. #define _Timer_Header_Included_
  4.  
  5. #include <stdbool.h>
  6.  
  7. struct TimerLink;
  8.  
  9. typedef struct
  10. {
  11.     unsigned timeOut;
  12.     void(*function)();
  13.     struct TimerLink* next;
  14. } TimerLink;
  15.  
  16. TimerLink* CreateTimerLink(void(*)(), unsigned);
  17. void InsertTimerIntoChain(TimerLink*);
  18. bool CheckTimerChain();
  19. void GetSomeSleep();
  20.  
  21. #endif // _Timer_Header_Included_
  22. /*    /header.h     */
  23.  
  24. /*     source.c     */
  25.  
  26. #include "Header.h"
  27. #include <stdlib.h>
  28.  
  29. TimerLink* timerChainHead = NULL;
  30. unsigned currentTime = 1;
  31. unsigned sleepTime = 0;
  32.  
  33. TimerLink* CreateTimerLink(void(*f)(), unsigned s)
  34. {
  35.     TimerLink* ptr = malloc(sizeof(TimerLink));
  36.  
  37.     ptr->function = f;
  38.     ptr->timeOut = s;
  39.     ptr->next = NULL;
  40.  
  41.     return ptr;
  42. }
  43.  
  44. void InsertTimerIntoChain(TimerLink* ptr)
  45. {
  46.     if (!timerChainHead)
  47.     {
  48.         timerChainHead = ptr;
  49.         return;
  50.     }
  51.  
  52.     if (timerChainHead->timeOut < ptr->timeOut)
  53.     {
  54.         ptr->next = timerChainHead;
  55.         timerChainHead = ptr;
  56.         return;
  57.     }
  58.  
  59.     else
  60.     {
  61.         TimerLink* preIter = timerChainHead;
  62.         for (TimerLink* iter = preIter->next; iter; iter = iter->next, preIter = preIter->next)
  63.         {
  64.             if (iter->timeOut < ptr)
  65.                 continue;
  66.             else
  67.             {
  68.                 ptr->next = iter;
  69.                 preIter->next = ptr;
  70.                 return;
  71.             }
  72.         }
  73.     }
  74. }
  75.  
  76. bool CheckTimerChain()
  77. {
  78.     if (!timerChainHead)
  79.         return true;
  80.  
  81.     if (timerChainHead->timeOut % currentTime == 0)
  82.     {
  83.         timerChainHead->function();
  84.  
  85.         if (timerChainHead->next)
  86.         {
  87.             TimerLink* next = timerChainHead->next;
  88.             sleepTime = next->timeOut - timerChainHead->timeOut;
  89.         }
  90.  
  91.         TimerLink* killer = timerChainHead;
  92.         timerChainHead = timerChainHead->next;
  93.         free(killer);
  94.     }
  95.  
  96.     return false;
  97. }
  98.  
  99. void GetSomeSleep()
  100. {
  101.     if (sleepTime == 0)
  102.         sleepTime = timerChainHead->timeOut;
  103.     sleep(sleepTime);
  104.     ++currentTime;
  105. }
  106.  
  107. /*     /source.c     */
  108.  
  109. /*     main.c     */
  110. #include <stdio.h>
  111. #include <stdbool.h>
  112.  
  113. #include "Header.h"  
  114.  
  115. void sleep(int seconds);
  116. void cb_1();
  117. void cb_2();
  118.  
  119. void timer_add(void(*func)(), int seconds)
  120. {
  121.     TimerLink* ptr = CreateTimerLink(func, seconds);
  122.  
  123.     if (!ptr)
  124.     {
  125.         fprintf(stderr, "create timer fail");
  126.         return;
  127.     }
  128.  
  129.     InsertTimerIntoChain(ptr);
  130. }
  131.  
  132. void call_timers()
  133. {
  134.     while (true)
  135.     {
  136.         bool timeToBreak = CheckTimerChain();
  137.         if (timeToBreak)
  138.             break;
  139.         else
  140.             GetSomeSleep();
  141.     }
  142. }
  143.  
  144. int main()
  145. {
  146.     timer_add(cb_1, 3);
  147.     timer_add(cb_2, 7);
  148.     timer_add(cb_1, 5);
  149.     timer_add(cb_2, 9);
  150.     call_timers();
  151.     return 0;
  152. }
  153. /*     /main.c     */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement