/*-
 * See the file LICENSE for redistribution information.
 *
 * Copyright (c) 1997,2008 Oracle.  All rights reserved.
 *
 * $Id: os_vx_yield.c,v 1.6 2008/01/08 20:58:45 bostic Exp $
 */

#include "db_config.h"

#include "db_int.h"

/*
 * __os_yield --
 *	Yield the processor, optionally pausing until running again.
 */
void
__os_yield(env, secs, usecs)
	ENV *env;
	u_long secs, usecs;		/* Seconds and microseconds. */
{
	int ticks_delay, ticks_per_second;

	COMPQUIET(env, NULL);

	/* Don't require the values be normalized. */
	for (; usecs >= US_PER_SEC; usecs -= US_PER_SEC)
		++secs;

	/*
	 * Yield the processor so other processes or threads can run.
	 *
	 * As a side effect, taskDelay() moves the calling task to the end of
	 * the ready queue for tasks of the same priority. In particular, you
	 * can yield the CPU to any other tasks of the same priority by
	 * "delaying" for zero clock ticks.
	 *
	 * Never wait less than a tick, if we were supposed to wait at all.
	 */
	ticks_per_second = sysClkRateGet();
	ticks_delay =
	    secs * ticks_per_second + (usecs * ticks_per_second) / US_PER_SEC;
	if (ticks_delay == 0 && (secs != 0 || usecs != 0))
		ticks_delay = 1;
	(void)taskDelay(ticks_delay);
}
