Mercurial > hg > Members > kent > CbCTaskManager
diff TaskQueue.c @ 0:5b089096921f
first commit.
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 18 Dec 2009 21:57:05 +0900 |
parents | |
children | 803d6bf22e6d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskQueue.c Fri Dec 18 21:57:05 2009 +0900 @@ -0,0 +1,92 @@ +#include"TaskList.h" + +typedef struct _TaskQueue { + TaskList *head; + TaskList *tail; + int length; +} TaskQueue; + +TaskQueue * +newTaskQueue() +{ + TaskQueue *queue; + /* TODO: mallocはあとで独自実装に書き直し! */ + malloc(sizeof(struct _TaskQueue)); + queue->head = NULL; + queue->tail = NULL; + queue->length = 0; + return queue; +} + +void +queueAddFirst(TaskQueue *queue, Task *) +{ + TaskList *oldhead = queue->head; + TaskList *newlist; + newlist = malloc(sizeof(struct _TaskList)); + + if (oldhead) { + oldhead->prev = newlist; + } + newlist->next = oldhead; + newlist->prev = NULL; + queue->head = newlist; + queue->length++; + return ; +} + +void +queueAddLast(TaskQueue *queue, Task *task) +{ + TaskList *oldtail = queue->tail; + TaskList *newlist; + newlist = malloc(sizeof(struct _TaskList)); + + if (oldtail) { + oldtail->next = newlist; + } + newlist->next = NULL; + newlist->prev = oldtail; + queue->tail = newlist; + queue->length++; + return ; +} + +Task * +queuePollFirst(TaskQueue *queue) +{ + TaskList *first = queue->head; + TaskList *second; + Task *task; + if (!first) return NULL; + + second = first->next; + task = first->task; + free(first); + + second->prev = NULL; + queue->head = second; + queue->length--; + return task; +} + +Task * +queuePollLast(TaskQueue *queue) +{ + TaskList *first = queue->tail; + TaskList *second; + Task *task; + if (!first) return NULL; + + second = first->prev; + task = first->task; + free(first); + + second->next = NULL; + queue->tail = second; + queue->length--; + return task; +} + + +