home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / ctask.zip / TSKFLG.C < prev    next >
C/C++ Source or Header  |  1988-03-01  |  2KB  |  135 lines

  1. /*
  2.    TSKFLG.C - CTask - Flag handling routines.
  3.  
  4.    Public Domain Software written by
  5.       Thomas Wagner
  6.       Patschkauer Weg 31
  7.       D-1000 Berlin 33
  8.       West Germany
  9. */
  10.  
  11. #include <stdio.h>
  12.  
  13. #include "tsk.h"
  14. #include "tsklocal.h"
  15.  
  16.  
  17. /*
  18.    create_flag - initialises flag.
  19. */
  20.  
  21. void far create_flag (flagptr flg)
  22. {
  23.    flg->wait_set = flg->wait_clear = NULL;
  24.    flg->state = 0;
  25. }
  26.  
  27. /*
  28.    delete_flag - kills all processes waiting for flag
  29. */
  30.  
  31. void far delete_flag (flagptr flg)
  32. {
  33.    CRITICAL;
  34.  
  35.    C_ENTER;
  36.  
  37.    tsk_kill_queue (&(flg->wait_set));
  38.    tsk_kill_queue (&(flg->wait_clear));
  39.    flg->state = 0;
  40.    C_LEAVE;
  41. }
  42.  
  43.  
  44. /*
  45.    wait_flag_set  - Wait until flag is != 0. If flag is != 0 on
  46.                     entry, the task continues to run.
  47. */
  48.  
  49. int far wait_flag_set (flagptr flg, dword timeout)
  50. {
  51.    CRITICAL;
  52.  
  53.    C_ENTER;
  54.    if (flg->state)
  55.       {
  56.       C_LEAVE;
  57.       return 0;
  58.       }
  59.    tsk_current->retptr = NULL;
  60.    tsk_wait (&flg->wait_set, timeout);
  61.    return (int)tsk_current->retptr;
  62. }
  63.  
  64.  
  65. /*
  66.    wait_flag_clear - Wait until flag is == 0. If flag is == 0 on
  67.                      entry, the task continues to run.
  68. */
  69.  
  70. int far wait_flag_clear (flagptr flg, dword timeout)
  71. {
  72.    CRITICAL;
  73.  
  74.    C_ENTER;
  75.    if (!flg->state)
  76.       {
  77.       C_LEAVE;
  78.       return 0;
  79.       }
  80.  
  81.    tsk_current->retptr = NULL;
  82.    tsk_wait (&flg->wait_clear, timeout);
  83.    return (int)tsk_current->retptr;
  84. }
  85.  
  86.  
  87. /*
  88.    set_flag - Set flag to 1. If there are tasks waiting for the
  89.               set state, all tasks in the queue are made eligible.
  90. */
  91.  
  92. void far set_flag (flagptr flg)
  93. {
  94.    CRITICAL;
  95.  
  96.    C_ENTER;
  97.    flg->state = 1;
  98.  
  99.    while (flg->wait_set != NULL)
  100.       flg->wait_set = tsk_runable (flg->wait_set);
  101.    C_LEAVE;
  102. }
  103.  
  104.  
  105. /*
  106.    clear_flag - Set flag to 0. If there are tasks waiting for the
  107.                 clear state, all tasks in the queue are made eligible.
  108. */
  109.  
  110. void far clear_flag (flagptr flg)
  111. {
  112.    CRITICAL;
  113.  
  114.    C_ENTER;
  115.    flg->state = 0;
  116.  
  117.    while (flg->wait_clear != NULL)
  118.       flg->wait_clear = tsk_runable (flg->wait_clear);
  119.  
  120.    C_LEAVE;
  121. }
  122.  
  123.  
  124. /*
  125.    check_flag - return current flag state.
  126. */
  127.  
  128. int far check_flag (flagptr flg)
  129. {
  130.    return flg->state;
  131. }
  132.  
  133.  
  134.  
  135.