summaryrefslogtreecommitdiffstats
path: root/bsd_eth_drivers/libbsdport/taskqueue.h
blob: a341ec13d41297336f1225837d43e1dd7c4ad1e3 (plain) (blame)
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
#ifndef RTEMS_TASKQUEUE_H
#define RTEMS_TASKQUEUE_H

#include <stdarg.h>

#ifdef __cplusplus
extern "C" {
#endif

struct taskqueue;

typedef void (*task_fn)(void *ctxt, int pending);

/* forwarded 'ctxt' that was passed to taskqueue_create() */
typedef void (*tq_enq_fn)(void *ctxt);

struct task {
	struct task *ta_next;
	int		     ta_pending;
	int		     ta_priority;
	task_fn      ta_fn;
	void        *ta_fn_arg;
};

struct taskqueue *
taskqueue_create(const char *name, int mflags, tq_enq_fn, void *ctxt);

struct taskqueue *
taskqueue_create_fast(const char *name, int mflags, tq_enq_fn, void *ctxt);

int
taskqueue_enqueue(struct taskqueue *tq, struct task *ta);

void
taskqueue_thread_enqueue(void *ctxt);

#define PI_NET	150
/* Returns 0 on success */
int
taskqueue_start_threads(struct taskqueue **ptq, int count, int prio, const char *fmt, ...);

void
taskqueue_drain(struct taskqueue *tq, struct task *ta);

void
taskqueue_free(struct taskqueue *tq);

#define TASK_INIT(task, pri, fn, arg) \
	do { \
		(task)->ta_next     = 0; \
		(task)->ta_priority = (pri); \
		(task)->ta_pending  = 0; \
		(task)->ta_fn       = (fn); \
		(task)->ta_fn_arg   = (arg); \
	} while (0)

extern struct taskqueue *taskqueue_fast;

/* Initialize taskqueue facility [networking must have been initialized already] */
rtems_id
rtems_taskqueue_initialize();

#ifdef __cplusplus
}
#endif

#endif