/* OS Scheduler Simulator ** 連絡先: 琉球大学情報工学科 河野 真治 ** (E-Mail Address: kono@ie.u-ryukyu.ac.jp) ** ** このソースのいかなる複写,改変,修正も許諾します。ただし、 ** その際には、誰が貢献したを示すこの部分を残すこと。 ** 再配布や雑誌の付録などの問い合わせも必要ありません。 ** 営利利用も上記に反しない範囲で許可します。 ** バイナリの配布の際にはversion messageを保存することを条件とします。 ** このプログラムについては特に何の保証もしない、悪しからず。 ** ** Everyone is permitted to do anything on this program ** including copying, modifying, improving, ** as long as you don't try to pretend that you wrote it. ** i.e., the above copyright notice has to appear in all copies. ** Binary distribution requires original version messages. ** You don't have to ask before copying, redistribution or publishing. ** THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE. Simple Event Driven Simulator Event Management */ #include <stdio.h> #include <stdlib.h> #include "queue.h" #include "event.h" extern int task_clock; int event_errno; static EventPtr freeEvent; /* Free Pool of Event */ static EventPtr eventPool; /* List of malloced free Event */ static int extend_event_pool(int num); const int EVENT_MALLOC_ERROR = 10; const int EVENT_POOL_SIZE_OVER_ERROR = 11; const int EVENT_MAX_POOL_SIZE = 65536*100; static int pool_size; // // Initialize Event Pool // return NULL on error // int init_event(int num) { if (! eventPool) { return extend_event_pool(num); } return 1; } static int extend_event_pool(int num) { EventPtr q; // Keep malloc history in EventPool pool_size = num; q = (EventPtr) malloc(sizeof(Event) * (num+1)); if (!q) { event_errno = EVENT_MALLOC_ERROR; return NULL; } q->next = eventPool; eventPool = q; // Connect all free event in the pool q = eventPool + 1; for(q = eventPool+1; num-->0; q++) q->next = q+1; q->next = freeEvent; freeEvent = eventPool+1; return 1; } void destory_event() { EventPtr q; for(q = eventPool ;q; q = q->next) { free(q); } freeEvent = eventPool = NULL; } EventPtr new_event(int time, EventPtr event(),QueuePtr *param) { EventPtr q; if (!freeEvent) { pool_size *= 2; if (pool_size > EVENT_MAX_POOL_SIZE ) { event_errno = EVENT_POOL_SIZE_OVER_ERROR; return NULL; } if (!extend_event_pool(pool_size)) { return NULL; } } q = freeEvent; freeEvent = freeEvent->next; q->next = NULL; q->time = time; q->event = event; q->param = param; return q; } void free_event(EventPtr q) { q->next = freeEvent; freeEvent = q; } EventPtr insert_event(EventPtr list,EventPtr q) { EventPtr p = list; int time = q->time; if (!p) { return q; } if (p->time > time) { q->next = p; return q; } if (!p->next) { p->next = q; return p; } while(p->next && p->next->time < time) { p = p->next; } q->next = p->next; p->next = q; return list; } /* Insert one event, one event at a time. Duplicate event is freed. */ EventPtr insert_event1(EventPtr list,EventPtr q) { EventPtr p = list; int time = q->time; if (!p) { return q; } if (p->time > time) { q->next = p; return q; } else if (p->time == time) { free_event(q); return list; } if (!p->next) { p->next = q; return p; } while(p->next && p->next->time <= time) { if (p->next->time == time) { free_event(q); return list; } p = p->next; } q->next = p->next; p->next = q; return list; } EventPtr get_event(EventPtr list,EventPtr *q) { EventPtr p = list; if (p) { *q = list; return list->next; } return p; } EventPtr remove_event(EventPtr list,EventPtr q) { EventPtr p = list; EventPtr p1; if (!p) return p; p1 = p->next; while(p1 && p1 != q) { p1 = p1->next; p = p->next; } if (p1) { p->next = p1->next; } return list; } /* end */