4 #include "tasklet_api.h"
6 ////////////////////////////////////////////
8 typedef struct _tasklet_context {
9 A_tasklet_t *schedule_tasks;
12 static tasklet_context g_tasklet_ctx;
14 /* Initialize timer software. Called once during initialization. */
16 cmnos_tasklet_init(void)
19 g_tasklet_ctx.schedule_tasks = NULL;
23 cmnos_tasklet_init_task(A_TASKLET_FUNC fn, void * arg, A_tasklet_t *tasklet)
28 tasklet->state = A_TASKLET_STATE_DISABLE;
32 cmnos_tasklet_schedule(A_tasklet_t *tasklet)
34 if ( tasklet->state == A_TASKLET_STATE_SCHEDULED ) {
38 tasklet->state = A_TASKLET_STATE_SCHEDULED;
39 if ( g_tasklet_ctx.schedule_tasks == NULL ) {
40 g_tasklet_ctx.schedule_tasks = tasklet;
42 tasklet->next = g_tasklet_ctx.schedule_tasks;
43 g_tasklet_ctx.schedule_tasks = tasklet;
48 cmnos_tasklet_disable(A_tasklet_t *tasklet)
51 A_tasklet_t *prev = NULL;
53 if ( tasklet->state != A_TASKLET_STATE_SCHEDULED ) {
57 tmp = g_tasklet_ctx.schedule_tasks;
58 while ( tmp != NULL ) {
59 if ( tmp == tasklet ) {
61 g_tasklet_ctx.schedule_tasks = NULL;
63 prev->next = tmp->next;
66 tasklet->state = A_TASKLET_STATE_DISABLE;
76 cmnos_tasklet_run(void)
80 tmp = g_tasklet_ctx.schedule_tasks;
81 while ( tmp != NULL ) {
82 g_tasklet_ctx.schedule_tasks = tmp->next;
85 tmp->state = A_TASKLET_STATE_RUNNING;
87 tmp->state = A_TASKLET_STATE_DISABLE;
89 tmp = g_tasklet_ctx.schedule_tasks;
92 g_tasklet_ctx.schedule_tasks = NULL;
96 cmnos_tasklet_module_install(struct tasklet_api *tbl)
98 tbl->_tasklet_init = cmnos_tasklet_init;
99 tbl->_tasklet_init_task = cmnos_tasklet_init_task;
100 tbl->_tasklet_disable = cmnos_tasklet_disable;
101 tbl->_tasklet_schedule = cmnos_tasklet_schedule;
102 tbl->_tasklet_run = cmnos_tasklet_run;
105 //#define CMNOS_TASKLET_UT
106 #ifdef CMNOS_TASKLET_UT
108 #include <adf_os_defer.h>
113 void test_tasklet(void *arg)
115 adf_os_bh_t *tmpBH = (adf_os_bh_t *)arg;
118 adf_os_print("Tasklet1 running...\n");
119 else if ( tmpBH == &bh2 )
120 adf_os_print("Tasklet2 running...\n");
126 adf_os_init_bh(NULL, &bh, test_tasklet, &bh);
127 adf_os_init_bh(NULL, &bh2, test_tasklet, &bh2);
129 adf_os_sched_bh(NULL, &bh);
130 adf_os_sched_bh(NULL, &bh2);