50 lines
1.3 KiB
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);
|
|
}
|
|
}
|