fis-gtm/sr_unix_gnp/cmi_idle.c

50 lines
1.3 KiB
C

/****************************************************************
* *
* Copyright 2001 Sanchez Computer Associates, Inc. *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include "cmidef.h"
#include "gt_timer.h"
#include "eintr_wrappers.h"
GBLDEF struct NTD *ntd_root;
void cmi_idle(uint4 hiber)
{
boolean_t posted = FALSE;
sigset_t oset;
struct CLB *lnk;
int rc;
/*
* call housekeeping twice - once to catch the
* async write completion, and another time
* to catch potential completion from an
* I/O interrupt.
*/
SIGPROCMASK(SIG_BLOCK, &ntd_root->mutex_set, &oset, rc);
cmj_housekeeping();
while (lnk = cmj_getdeferred(ntd_root))
{
lnk->deferred_event = FALSE;
posted = TRUE;
SIGPROCMASK(SIG_SETMASK, &oset, NULL, rc);
cmj_postevent(lnk);
SIGPROCMASK(SIG_BLOCK, &ntd_root->mutex_set, &oset, rc);
}
SIGPROCMASK(SIG_SETMASK, &oset, NULL, rc);
if (!posted)
{
hiber_start_wait_any(hiber);
SIGPROCMASK(SIG_BLOCK, &ntd_root->mutex_set, &oset, rc);
cmj_housekeeping();
SIGPROCMASK(SIG_SETMASK, &oset, NULL, rc);
}
}