OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [c/] [src/] [libnetworking/] [rtems_webserver/] [websuemf.c] - Rev 1765

Compare with Previous | Blame | View Log

/*
 * websuemf.c -- GoAhead Micro Embedded Management Framework
 *
 * Copyright (c) GoAhead Software Inc., 1995-2000. All Rights Reserved.
 *
 * See the file "license.txt" for usage and redistribution license requirements
 */
 
/********************************** Description *******************************/
 
/*
 *	This modules provides compatibility with the full GoAhead EMF.
 */
 
/*********************************** Includes *********************************/
 
#include	"ejIntrn.h"
#include	"wsIntrn.h"
 
/*********************************** Defines **********************************/
 
/*
 *	This structure stores scheduled events.
 */
typedef struct {
	void	(*routine)(void *arg, int id);
	void	*arg;
	time_t	at;
	int		schedid;
} sched_t;
 
/*********************************** Locals ***********************************/
 
static sched_t		**sched;
static int			schedMax;
 
/************************************* Code ***********************************/
/*
 *	Evaluate a script
 */
 
int scriptEval(int engine, char_t *cmd, char_t **result, int chan)
{
	int		ejid;
 
	if (engine == EMF_SCRIPT_EJSCRIPT) {
		ejid = (int) chan;
		if (ejEval(ejid, cmd, NULL) ) {
			return 0;
		} else {
			return -1;
		}
	}
	return -1;
}
 
/******************************************************************************/
/*
 * Compare strings, ignoring case:  normal strcmp return codes.
 *
 *	WARNING: It is not good form to increment or decrement pointers inside a
 *	"call" to tolower et al. These can be MACROS, and have undesired side
 *	effects.
 */
 
int strcmpci(char_t *s1, char_t *s2)
{
	int		rc;
 
	a_assert(s1 && s2);
	if (s1 == NULL || s2 == NULL) {
		return 0;
	}
 
	if (s1 == s2) {
		return 0;
	}
 
	do {
		rc = gtolower(*s1) - gtolower(*s2);
		if (*s1 == '\0') {
			break;
		}
		s1++;
		s2++;
	} while (rc == 0);
	return rc;
}
 
/******************************************************************************/
/*
 *	This function is called when a scheduled process time has come.
 */
 
void TimerProc(int schedid)
{
	sched_t	*s;
 
	a_assert(0 <= schedid && schedid < schedMax);
	s = sched[schedid];
	a_assert(s);
 
	(s->routine)(s->arg, s->schedid);
}
 
/******************************************************************************/
/*
 *	Schedule an event in delay milliseconds time. We will use 1 second
 *	granularity for webServer.
 */
 
int emfSchedCallback(int delay, emfSchedProc *proc, void *arg)
{
	sched_t	*s;
	int		schedid;
 
	if ((schedid = hAllocEntry((void***) &sched, &schedMax,
		sizeof(sched_t))) < 0) {
		return -1;
	}
	s = sched[schedid];
	s->routine = proc;
	s->arg = arg;
	s->schedid = schedid;
 
/*
 *	Round the delay up to seconds.
 */
	s->at = ((delay + 500) / 1000) + time(0);
 
	return schedid;
}
 
/******************************************************************************/
/*
 *	Reschedule to a new delay.
 */
 
void emfReschedCallback(int schedid, int delay)
{
	sched_t	*s;
 
	if (sched == NULL || schedid == -1 || schedid >= schedMax || 
		(s = sched[schedid]) == NULL) {
		return;
	}
	s->at = ((delay + 500) / 1000) + time(0);
}
 
/******************************************************************************/
 
void emfUnschedCallback(int schedid)
{
	sched_t	*s;
 
	if (sched == NULL || schedid == -1 || schedid >= schedMax || 
		(s = sched[schedid]) == NULL) {
		return;
	}
	bfree(B_L, s);
	schedMax = hFree((void***) &sched, schedid);
}
 
/******************************************************************************/
/*
 *	Take the tasks off the queue in a round robin fashion.
 */
 
void emfSchedProcess()
{
	sched_t		*s;
	int			schedid;
	static int	next = 0;	
 
/*
 *	If schedMax is 0, there are no tasks scheduled, so just return.
 */
	if (schedMax <= 0) {
		return;
	}
 
/*
 *	If next >= schedMax, the schedule queue was reduced in our absence
 *	so reset next to 0 to start from the begining of the queue again.
 */
	if (next >= schedMax) {
		next = 0;
	}
 
	schedid = next;
	for (;;) {
		if ((s = sched[schedid]) != NULL &&	(int)s->at <= (int)time(0)) {
			TimerProc(schedid);
			next = schedid + 1;
			return;
		}
		if (++schedid >= schedMax) {
			schedid = 0;
		}
		if (schedid == next) {
/*
 *			We've gone all the way through the queue without finding 
 *			anything to do so just return.
 */
			return;
		}
	}
}
 
/******************************************************************************/
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.