Blame usr/iscsi_timer.c

Packit eace71
/*
Packit eace71
 * iSCSI timer
Packit eace71
 *
Packit eace71
 * Copyright (C) 2002 Cisco Systems, Inc.
Packit eace71
 *
Packit eace71
 * This program is free software; you can redistribute it and/or modify
Packit eace71
 * it under the terms of the GNU General Public License as published
Packit eace71
 * by the Free Software Foundation; either version 2 of the License, or
Packit eace71
 * (at your option) any later version.
Packit eace71
 *
Packit eace71
 * This program is distributed in the hope that it will be useful, but
Packit eace71
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit eace71
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Packit eace71
 * General Public License for more details.
Packit eace71
 *
Packit eace71
 * See the file COPYING included with this distribution for more details.
Packit eace71
 */
Packit eace71
#include <string.h>
Packit eace71
#include <sys/time.h>
Packit eace71
Packit eace71
void iscsi_timer_clear(struct timeval *timer)
Packit eace71
{
Packit eace71
	memset(timer, 0, sizeof (*timer));
Packit eace71
}
Packit eace71
Packit eace71
/* set timer to now + seconds */
Packit eace71
void iscsi_timer_set(struct timeval *timer, int seconds)
Packit eace71
{
Packit eace71
	if (timer) {
Packit eace71
		memset(timer, 0, sizeof (*timer));
Packit eace71
		gettimeofday(timer, NULL);
Packit eace71
Packit eace71
		timer->tv_sec += seconds;
Packit eace71
	}
Packit eace71
}
Packit eace71
Packit eace71
int iscsi_timer_expired(struct timeval *timer)
Packit eace71
{
Packit eace71
	struct timeval now;
Packit eace71
Packit eace71
	/* no timer, can't have expired */
Packit eace71
	if ((timer == NULL) || ((timer->tv_sec == 0) && (timer->tv_usec == 0)))
Packit eace71
		return 0;
Packit eace71
Packit eace71
	memset(&now, 0, sizeof (now));
Packit eace71
	gettimeofday(&now, NULL);
Packit eace71
Packit eace71
	if (now.tv_sec > timer->tv_sec)
Packit eace71
		return 1;
Packit eace71
	if ((now.tv_sec == timer->tv_sec) && (now.tv_usec >= timer->tv_usec))
Packit eace71
		return 1;
Packit eace71
	return 0;
Packit eace71
}
Packit eace71
Packit eace71
int iscsi_timer_msecs_until(struct timeval *timer)
Packit eace71
{
Packit eace71
	struct timeval now;
Packit eace71
	int msecs;
Packit eace71
	long partial;
Packit eace71
Packit eace71
	/* no timer, can't have expired, infinite time til it expires */
Packit eace71
	if ((timer == NULL) || ((timer->tv_sec == 0) && (timer->tv_usec == 0)))
Packit eace71
		return -1;
Packit eace71
Packit eace71
	memset(&now, 0, sizeof (now));
Packit eace71
	gettimeofday(&now, NULL);
Packit eace71
Packit eace71
	/* already expired? */
Packit eace71
	if (now.tv_sec > timer->tv_sec)
Packit eace71
		return 0;
Packit eace71
	if ((now.tv_sec == timer->tv_sec) && (now.tv_usec >= timer->tv_usec))
Packit eace71
		return 0;
Packit eace71
Packit eace71
	/* not expired yet, do the math */
Packit eace71
	partial = timer->tv_usec - now.tv_usec;
Packit eace71
	if (partial < 0) {
Packit eace71
		partial += 1000 * 1000;
Packit eace71
		msecs = (partial + 500) / 1000;
Packit eace71
		msecs += (timer->tv_sec - now.tv_sec - 1) * 1000;
Packit eace71
	} else {
Packit eace71
		msecs = (partial + 500) / 1000;
Packit eace71
		msecs += (timer->tv_sec - now.tv_sec) * 1000;
Packit eace71
	}
Packit eace71
Packit eace71
	return msecs;
Packit eace71
}