/****************************************************************
 *								*
 * Copyright (c) 2001-2020 Fidelity National Information	*
 * Services, Inc. and/or its subsidiaries. All rights reserved.	*
 *								*
 *	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"

GBLREF 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);
	}
}
