home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
progm
/
ctask.zip
/
TSKFLG.C
< prev
next >
Wrap
C/C++ Source or Header
|
1988-03-01
|
2KB
|
135 lines
/*
TSKFLG.C - CTask - Flag handling routines.
Public Domain Software written by
Thomas Wagner
Patschkauer Weg 31
D-1000 Berlin 33
West Germany
*/
#include <stdio.h>
#include "tsk.h"
#include "tsklocal.h"
/*
create_flag - initialises flag.
*/
void far create_flag (flagptr flg)
{
flg->wait_set = flg->wait_clear = NULL;
flg->state = 0;
}
/*
delete_flag - kills all processes waiting for flag
*/
void far delete_flag (flagptr flg)
{
CRITICAL;
C_ENTER;
tsk_kill_queue (&(flg->wait_set));
tsk_kill_queue (&(flg->wait_clear));
flg->state = 0;
C_LEAVE;
}
/*
wait_flag_set - Wait until flag is != 0. If flag is != 0 on
entry, the task continues to run.
*/
int far wait_flag_set (flagptr flg, dword timeout)
{
CRITICAL;
C_ENTER;
if (flg->state)
{
C_LEAVE;
return 0;
}
tsk_current->retptr = NULL;
tsk_wait (&flg->wait_set, timeout);
return (int)tsk_current->retptr;
}
/*
wait_flag_clear - Wait until flag is == 0. If flag is == 0 on
entry, the task continues to run.
*/
int far wait_flag_clear (flagptr flg, dword timeout)
{
CRITICAL;
C_ENTER;
if (!flg->state)
{
C_LEAVE;
return 0;
}
tsk_current->retptr = NULL;
tsk_wait (&flg->wait_clear, timeout);
return (int)tsk_current->retptr;
}
/*
set_flag - Set flag to 1. If there are tasks waiting for the
set state, all tasks in the queue are made eligible.
*/
void far set_flag (flagptr flg)
{
CRITICAL;
C_ENTER;
flg->state = 1;
while (flg->wait_set != NULL)
flg->wait_set = tsk_runable (flg->wait_set);
C_LEAVE;
}
/*
clear_flag - Set flag to 0. If there are tasks waiting for the
clear state, all tasks in the queue are made eligible.
*/
void far clear_flag (flagptr flg)
{
CRITICAL;
C_ENTER;
flg->state = 0;
while (flg->wait_clear != NULL)
flg->wait_clear = tsk_runable (flg->wait_clear);
C_LEAVE;
}
/*
check_flag - return current flag state.
*/
int far check_flag (flagptr flg)
{
return flg->state;
}