home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / DOOG / CTASK.ZIP / TSKCNT.C < prev    next >
C/C++ Source or Header  |  1989-12-22  |  4KB  |  193 lines

  1. /*
  2.     --- Version 2.0 89-12-14 12:50 ---
  3.  
  4.    TSKCNT.C - CTask - Counter handling routines.
  5.  
  6.    Public Domain Software written by
  7.       Thomas Wagner
  8.       Patschkauer Weg 31
  9.       D-1000 Berlin 33
  10.       West Germany
  11. */
  12.  
  13. #include <stdio.h>
  14.  
  15. #include "tsk.h"
  16. #include "tsklocal.h"
  17.  
  18. /*
  19.    create_counter - initialises counter.
  20. */
  21.  
  22. counterptr far create_counter (counterptr cnt
  23. #if (TSK_NAMEPAR)
  24.                               ,byteptr name
  25. #endif
  26.                               )
  27. {
  28. #if (TSK_DYNAMIC)
  29.    if (cnt == NULL)
  30.       {
  31.       if ((cnt = tsk_alloc (sizeof (counter))) == NULL)
  32.          return NULL;
  33.       cnt->flags = F_TEMP;
  34.       }
  35.    else
  36.       cnt->flags = 0;
  37. #endif
  38.  
  39.    tsk_init_qhead (&cnt->wait_set);
  40.    tsk_init_qhead (&cnt->wait_clear);
  41.    cnt->state = 0;
  42.  
  43. #if (TSK_NAMED)
  44.    tsk_add_name (&cnt->name, name, TYP_COUNTER, cnt);
  45. #endif
  46.  
  47.    return cnt;
  48. }
  49.  
  50.  
  51. /*
  52.    delete_counter - kills all processes waiting for counter
  53. */
  54.  
  55. void far delete_counter (counterptr cnt)
  56. {
  57.    CRITICAL;
  58.  
  59.    C_ENTER;
  60.    tsk_kill_queue (&(cnt->wait_set));
  61.    tsk_kill_queue (&(cnt->wait_clear));
  62.    cnt->state = 0L;
  63.    C_LEAVE;
  64.  
  65. #if (TSK_NAMED)
  66.    tsk_del_name (&cnt->name);
  67. #endif
  68.  
  69. #if (TSK_DYNAMIC)
  70.    if (cnt->flags & F_TEMP)
  71.       tsk_free (cnt);
  72. #endif
  73. }
  74.  
  75.  
  76. /*
  77.    clear_counter  - Sets counter to zero. All tasks waiting for
  78.                     Counter zero are made eligible.
  79. */
  80.  
  81. void far clear_counter (counterptr cnt)
  82. {
  83.    CRITICAL;
  84.  
  85.    C_ENTER;
  86.    cnt->state = 0L;
  87.    tsk_runable_all (&cnt->wait_clear);
  88.    C_LEAVE;
  89. }
  90.  
  91.  
  92. /*
  93.    wait_counter_set  - Wait until counter is != 0. If counter is != 0 on
  94.                        entry, the counter is decremented and the task
  95.                        continues to run. If the counter is decremented to 
  96.                        zero, tasks waiting for zero are made eligible.
  97. */
  98.  
  99. int far wait_counter_set (counterptr cnt, dword timeout)
  100. {
  101.    CRITICAL;
  102.  
  103.    C_ENTER;
  104.    if (cnt->state)
  105.       {
  106.       if (!--cnt->state)
  107.          tsk_runable_all (&cnt->wait_clear);
  108.       C_LEAVE;
  109.       return 0;
  110.       }
  111.  
  112.    GLOBDATA current_task->retptr = NULL;
  113.    tsk_wait (&cnt->wait_set, timeout);
  114.    return (int)GLOBDATA current_task->retptr;
  115. }
  116.  
  117. /*
  118.    wait_counter_clear - Wait until counter is == 0. If counter is == 0 on
  119.                        entry, the task continues to run.
  120. */
  121.  
  122. int far wait_counter_clear (counterptr cnt, dword timeout)
  123. {
  124.    CRITICAL;
  125.  
  126.    C_ENTER;
  127.    if (!cnt->state)
  128.       {
  129.       C_LEAVE;
  130.       return 0;
  131.       }
  132.  
  133.    GLOBDATA current_task->retptr = NULL;
  134.    tsk_wait (&cnt->wait_clear, timeout);
  135.    return (int)GLOBDATA current_task->retptr;
  136. }
  137.  
  138.  
  139. /*
  140.    inc_counter - Increment counter. If there are tasks waiting for the
  141.                  set state, the first task in the queue is made eligible.
  142. */
  143.  
  144. void far inc_counter (counterptr cnt)
  145. {
  146.    CRITICAL;
  147.  
  148.    C_ENTER;
  149.    if (!cnt->wait_set.first->kind)
  150.       {
  151.       cnt->state++;
  152.       C_LEAVE;
  153.       return;
  154.       }
  155.    tsk_runable ((tcbptr)cnt->wait_set.first);
  156.    C_LEAVE;
  157. }
  158.  
  159.  
  160. /*
  161.    check_counter - return current counter state.
  162. */
  163.  
  164. dword far check_counter (counterptr cnt)
  165. {
  166.    return cnt->state;
  167. }
  168.  
  169.  
  170.  
  171. /*
  172.    set_counter  - Sets counter to given value. Depending on the value,
  173.                   tasks waiting for counter zero or counter set are made
  174.                   eligible.
  175. */
  176.  
  177. void far set_counter (counterptr cnt, dword val)
  178. {
  179.    CRITICAL;
  180.  
  181.    C_ENTER;
  182.    while (val && cnt->wait_set.first->kind)
  183.       {
  184.       tsk_runable ((tcbptr)cnt->wait_set.first);
  185.       val--;
  186.       }
  187.    if (!val)
  188.       tsk_runable_all (&cnt->wait_clear);
  189.    cnt->state = val;
  190.    C_LEAVE;
  191. }
  192.  
  193.