summaryrefslogtreecommitdiff
path: root/minix/drivers/storage/filter/util.c
blob: 474783ceabb2fc56020389b713d0e02e7743890e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* 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);

	return p;
}

/*===========================================================================*
 *				flt_free				     *
 *===========================================================================*/
void flt_free(char *buf, size_t size, const char *sbuf)
{	
	/* Free a buffer previously allocated with flt_malloc().
	 */

	if(buf != sbuf)
		free_contig(buf, size);
}

/*===========================================================================*
 *				flt_alarm				     *
 *===========================================================================*/
clock_t flt_alarm(clock_t dt)
{
	int r;

	if((int) dt < 0)
		return next_alarm;

	r = sys_setalarm(dt, 0);

	if(r != OK)
		panic("sys_setalarm failed: %d", r);

	if(dt == 0) {
		if(!next_alarm)
			panic("clearing unset alarm: %d", r);
		next_alarm = 0;
	} else {
		if(next_alarm)
			panic("overwriting alarm: %d", r);
		next_alarm = getticks() + dt;
	}

	return next_alarm;
}