Added Interval Time Scheduler (ITS) for calling kernel functions in time interval...
[ZeXOS.git] / kernel / core / its.c
blob044c911a4ad1eb6841ce1a3c96f21f5596a1a797
1 /*
2 * ZeX/OS
3 * Copyright (C) 2009 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 /** Interval Time Scheduler - NOTE: it's not a task/process scheduler */
21 #include <system.h>
22 #include <its.h>
24 its_t its_list;
26 extern unsigned long timer_ticks;
28 unsigned task_its ()
30 for (;; schedule ()) {
31 its_t *its;
32 for (its = its_list.next; its != &its_list; its = its->next)
33 if ((timer_ticks-its->timer) >= its->interval) {
34 its->handler ();
35 its->timer = timer_ticks;
39 return 1;
42 unsigned int its_register (unsigned long interval, its_handler_t *handler)
44 its_t *its = its_list.next;
45 /* create ITS' task when it's really needed */
46 if (its == &its_list)
47 task_create ("its", (unsigned) task_its, 255);
49 /* alloc and init context */
50 its = (its_t *) kmalloc (sizeof (its_t));
52 if (!its)
53 return 0;
55 its->timer = timer_ticks;
56 its->interval = interval;
57 its->handler = handler;
59 /* add into list */
60 its->next = &its_list;
61 its->prev = its_list.prev;
62 its->prev->next = its;
63 its->next->prev = its;
65 DPRINT (DBG_CORE, "its_register () -> 0x%x every %dms", handler, interval);
67 return 1;
70 unsigned int init_its ()
72 its_list.next = &its_list;
73 its_list.prev = &its_list;
75 return 1;