minix/drivers/filter/util.c

109 lines
2.7 KiB
C
Raw Normal View History

2009-12-02 11:08:58 +01:00
/* Filter driver - utility functions */
#include "inc.h"
#include <sys/mman.h>
#include <signal.h>
static clock_t next_alarm;
/*===========================================================================*
* flt_malloc *
*===========================================================================*/
char *flt_malloc(size_t size, char *sbuf, size_t ssize)
{
/* Allocate a buffer for 'size' bytes. If 'size' is equal to or less
* than 'ssize', return the static buffer 'sbuf', otherwise, use
* malloc() to allocate memory dynamically.
*/
char *p;
if (size <= ssize)
return sbuf;
if(!(p = alloc_contig(size, 0, NULL)))
panic("out of memory: %d", size);
2009-12-02 11:08:58 +01:00
return p;
}
/*===========================================================================*
* flt_free *
*===========================================================================*/
void flt_free(char *buf, size_t size, char *sbuf)
{
/* Free a buffer previously allocated with flt_malloc().
*/
if(buf != sbuf)
free_contig(buf, size);
2009-12-02 11:08:58 +01:00
}
/*===========================================================================*
* print64 *
*===========================================================================*/
char *print64(u64_t p)
{
#define NB 10
static int n = 0;
static char buf[NB][100];
u32_t lo = ex64lo(p), hi = ex64hi(p);
n = (n+1) % NB;
if(!hi) sprintf(buf[n], "%lx", lo);
else sprintf(buf[n], "%lx%08lx", hi, lo);
return buf[n];
}
/*===========================================================================*
* flt_alarm *
*===========================================================================*/
clock_t flt_alarm(clock_t dt)
{
int r;
if(dt < 0)
return next_alarm;
r = sys_setalarm(dt, 0);
if(r != OK)
panic("sys_setalarm failed: %d", r);
2009-12-02 11:08:58 +01:00
if(dt == 0) {
if(!next_alarm)
panic("clearing unset alarm: %d", r);
2009-12-02 11:08:58 +01:00
next_alarm = 0;
} else {
if(next_alarm)
panic("overwriting alarm: %d", r);
2009-12-02 11:08:58 +01:00
if ((r = getuptime(&next_alarm)) != OK)
panic("getuptime failed: %d", r);
2009-12-02 11:08:58 +01:00
next_alarm += dt;
}
return next_alarm;
}
/*===========================================================================*
* got_alarm *
*===========================================================================*/
static void got_alarm(int sig)
{
/* Do nothing. */
}
/*===========================================================================*
* flt_sleep *
*===========================================================================*/
void flt_sleep(int secs)
{
/* Sleep for the given number of seconds. Don't use sleep(), as that
* will end up calling select() to VFS. This implementation could be
* improved.
*/
signal(SIGALRM, got_alarm);
alarm(secs);
pause();
}