13,15 → 13,45 |
#include "chimera.h" |
|
struct action_event *first_action_event = NULL; |
struct action_event *action_event_list; |
int total_events = 0; |
|
int get_free_slot(); |
|
int init_action_event(int number_of_events) { |
|
action_event_list = calloc(number_of_events * sizeof(struct action_event),0); |
total_events = number_of_events; |
|
if (action_event_list != NULL) return 0; |
|
total_events = 0; |
return -1; |
|
} |
|
int insert_action_event(struct action_event *e) { |
|
struct action_event *t = first_action_event, *k = NULL; |
int free; |
|
SYS_FLAGS f; |
|
f = kern_fsave(); |
|
free = get_free_slot(); |
|
if (free != -1) { |
|
memcpy(&(action_event_list[free]),e,sizeof(struct action_event)); |
e = &(action_event_list[free]); |
|
} else { |
|
return -1; |
|
} |
|
e->status = EVT_STATUS_WAIT; |
|
if (!t) { |
48,17 → 78,18 |
|
kern_frestore(f); |
|
return 0; |
return free; |
|
} |
|
int delete_action_event(struct action_event *e) { |
int delete_action_event(int event) { |
|
struct action_event *t = first_action_event; |
struct action_event *e = &(action_event_list[event]); |
|
SYS_FLAGS f; |
|
if (!t) return -1; |
if ((!t || !e) && (e->status != EVT_STATUS_FREE)) return -1; |
|
f = kern_fsave(); |
|
65,6 → 96,7 |
if (t == e) { |
|
first_action_event = t->next; |
e->status = EVT_STATUS_FREE; |
kern_frestore(f); |
return 0; |
|
78,6 → 110,7 |
|
if (t) { |
t->next = e->next; |
e->status = EVT_STATUS_FREE; |
kern_frestore(f); |
return 0; |
} |
88,6 → 121,23 |
|
} |
|
int get_free_slot() { |
|
int k = 0; |
|
while (k < total_events) { |
|
if (action_event_list[k].status == EVT_STATUS_FREE || |
action_event_list[k].status == EVT_STATUS_DONE) |
return k; |
k++; |
|
} |
|
return -1; |
|
} |
|
struct action_event * get_first_old_event(struct timespec *time) { |
|
struct action_event *t = first_action_event; |