# HG changeset patch # User kent # Date 1263371218 -32400 # Node ID d31f9a0f90241768a2b49f76e24f48964ec77d11 # Parent e89acebd97b12a039c8a96cc61d8bb6cb61cf485 change interfaces of List.c. diff -r e89acebd97b1 -r d31f9a0f9024 Makefile.am --- a/Makefile.am Tue Jan 12 16:29:05 2010 +0900 +++ b/Makefile.am Wed Jan 13 17:26:58 2010 +0900 @@ -1,2 +1,5 @@ AUTOMAKE_OPTIONS = foreign SUBDIRS = src examples + +bin_SCRIPTS = taskmanager-config +CLEANFILES = $(bin_SCRIPTS) diff -r e89acebd97b1 -r d31f9a0f9024 Makefile.in --- a/Makefile.in Tue Jan 12 16:29:05 2010 +0900 +++ b/Makefile.in Wed Jan 13 17:26:58 2010 +0900 @@ -13,6 +13,7 @@ # PARTICULAR PURPOSE. @SET_MAKE@ + VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -32,8 +33,8 @@ subdir = . DIST_COMMON = $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ - $(top_srcdir)/configure COPYING INSTALL depcomp install-sh \ - missing + $(srcdir)/taskmanager-config.in $(top_srcdir)/configure \ + COPYING INSTALL depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ @@ -42,7 +43,10 @@ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = +CONFIG_CLEAN_FILES = taskmanager-config +am__installdirs = "$(DESTDIR)$(bindir)" +binSCRIPT_INSTALL = $(INSTALL_SCRIPT) +SCRIPTS = $(bin_SCRIPTS) SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ @@ -161,6 +165,8 @@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign SUBDIRS = src examples +bin_SCRIPTS = taskmanager-config +CLEANFILES = $(bin_SCRIPTS) all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive @@ -215,6 +221,27 @@ distclean-hdr: -rm -f config.h stamp-h1 +taskmanager-config: $(top_builddir)/config.status $(srcdir)/taskmanager-config.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_SCRIPTS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f $$d$$p; then \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ + else :; fi; \ + done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. @@ -496,9 +523,12 @@ exit 1; } >&2 check-am: all-am check: check-recursive -all-am: Makefile config.h +all-am: Makefile $(SCRIPTS) config.h installdirs: installdirs-recursive installdirs-am: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive @@ -516,6 +546,7 @@ mostlyclean-generic: clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) @@ -546,7 +577,7 @@ install-dvi: install-dvi-recursive -install-exec-am: +install-exec-am: install-binSCRIPTS install-html: install-html-recursive @@ -578,7 +609,7 @@ ps-am: -uninstall-am: +uninstall-am: uninstall-binSCRIPTS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip @@ -589,14 +620,15 @@ dist-lzma dist-shar dist-tarZ dist-zip distcheck distclean \ distclean-generic distclean-hdr distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ - info-am install install-am install-data install-data-am \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ + info-am install install-am install-binSCRIPTS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ - pdf-am ps ps-am tags tags-recursive uninstall uninstall-am + pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ + uninstall-binSCRIPTS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff -r e89acebd97b1 -r d31f9a0f9024 configure --- a/configure Tue Jan 12 16:29:05 2010 +0900 +++ b/configure Wed Jan 13 17:26:58 2010 +0900 @@ -600,7 +600,7 @@ PACKAGE_STRING='TaskManager 0.1' PACKAGE_BUGREPORT='kent@cr.ie.u-ryukyu.ac.jp' -ac_unique_file="memo.txt" +ac_unique_file="src/TaskManagerAbst.cbc" # Factoring default headers for most tests. ac_includes_default="\ #include @@ -2196,8 +2196,8 @@ # Define the identity of the package. - PACKAGE=TaskManager - VERSION=0.1 + PACKAGE='taskmanager' + VERSION='0.1' cat >>confdefs.h <<_ACEOF @@ -4019,7 +4019,6 @@ RANLIB="$ac_cv_prog_RANLIB" fi - for ac_prog in cbcc gcc-cbc cbc-gcc gcc do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -5635,25 +5634,22 @@ +CFLAGS="-g -O2 -Wall" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then enableval=$enable_debug; case "${enableval}" in yes) CPPFLAGS="${CPPFLAGS} -DDEBUG" - CFLAGS="-g3 -O0" + CFLAGS="-g3 -O0 -Wall" ;; - *) CPPFLAGS="${CPPFLAGS} -UDEBUG";; + *) + CPPFLAGS="${CPPFLAGS} -UDEBUG" + CFLAGS="-g -O2 -Wall" + ;; esac fi -#AC_ARG_ENABLE([fifo], - #[ --enable-fifo use only fifo scheduler], - #[case "${enableval}" in - #yes) fifo=true;; - #no) fifo=false;; - #*) AC_MSG_ERROR([bad value ${enableval} for --enable-fifo]) - #esac], - #[fifo=true]) + # Check whether --with-mode was given. if test "${with_mode+set}" = set; then @@ -5707,7 +5703,7 @@ -ac_config_files="$ac_config_files Makefile src/Makefile examples/Makefile" +ac_config_files="$ac_config_files Makefile src/Makefile examples/Makefile taskmanager-config" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -6368,6 +6364,7 @@ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; + "taskmanager-config") CONFIG_FILES="$CONFIG_FILES taskmanager-config" ;; *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 $as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} diff -r e89acebd97b1 -r d31f9a0f9024 configure.ac --- a/configure.ac Tue Jan 12 16:29:05 2010 +0900 +++ b/configure.ac Wed Jan 13 17:26:58 2010 +0900 @@ -3,15 +3,14 @@ AC_PREREQ(2.63) AC_INIT([TaskManager],[0.1],[kent@cr.ie.u-ryukyu.ac.jp]) -AM_INIT_AUTOMAKE(TaskManager, 0.1) -AC_CONFIG_SRCDIR([memo.txt]) +AM_INIT_AUTOMAKE([foreign -Wall]) +AC_CONFIG_SRCDIR([src/TaskManagerAbst.cbc]) AC_CONFIG_HEADERS(config.h) # Checks for programs. AC_PROG_CXX AC_PROG_CC AC_PROG_RANLIB - AC_CHECK_PROGS(CbCC, [cbcc gcc-cbc cbc-gcc gcc]) if test "x$CbCC" = "x"; then AC_MSG_ERROR([cbc compiler not found.]) @@ -32,23 +31,20 @@ AC_CHECK_FUNCS([strdup]) +CFLAGS="-g -O2 -Wall" AC_ARG_ENABLE([debug], [ --enable-debug enable debug mode], [case "${enableval}" in yes) CPPFLAGS="${CPPFLAGS} -DDEBUG" - CFLAGS="-g3 -O0" + CFLAGS="-g3 -O0 -Wall" ;; - *) CPPFLAGS="${CPPFLAGS} -UDEBUG";; + *) + CPPFLAGS="${CPPFLAGS} -UDEBUG" + CFLAGS="-g -O2 -Wall" + ;; esac],) -#AC_ARG_ENABLE([fifo], - #[ --enable-fifo use only fifo scheduler], - #[case "${enableval}" in - #yes) fifo=true;; - #no) fifo=false;; - #*) AC_MSG_ERROR([bad value ${enableval} for --enable-fifo]) - #esac], - #[fifo=true]) + AC_ARG_WITH([mode], AS_HELP_STRING([--with-mode=MODE], [Specify the mode you want build: One of fifo, pthread, cell, cluster])) @@ -69,6 +65,6 @@ -AC_CONFIG_FILES([Makefile src/Makefile examples/Makefile]) +AC_CONFIG_FILES([Makefile src/Makefile examples/Makefile taskmanager-config]) AC_OUTPUT diff -r e89acebd97b1 -r d31f9a0f9024 examples/treedependtask/Makefile --- a/examples/treedependtask/Makefile Tue Jan 12 16:29:05 2010 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -#CC = gcc -CbCC = ~/WorkSpace/Mercurial/build_cbc44/INSTALL_DIR/bin/gcc -CC = $(CbCC) - -BASEDIR = ../../../build_taskamanger/INSTALL_DIR - -LDFLAGS = -L$(BASEDIR)/lib -LIBS = -lTaskManager - -ENVIRONMENT=Fifo -#ENVIRONMENT=Cell - -INCLUDE = -I$(BASEDIR)/include -I. -CFLAGS = -Wall -g -O0 $(INCLUDE) -DDEBUG - -.SUFFIXES: .cbc .c .o - -all: testmanager - -.c.o: - $(CC) -c $(CFLAGS) -o $@ $^ -.cbc.o: - $(CbCC) -c $(CFLAGS) -o $@ $^ - -testmanager: testmanager.o taskinit.o - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) - -clean: - rm -f *.o testmanager - - - diff -r e89acebd97b1 -r d31f9a0f9024 src/Debug.h --- a/src/Debug.h Tue Jan 12 16:29:05 2010 +0900 +++ b/src/Debug.h Wed Jan 13 17:26:58 2010 +0900 @@ -2,14 +2,23 @@ #define _DEBUG_H #ifdef DEBUG + #include #define __DEBUG(f, args...) \ fprintf(stderr, "in %s: "f, __FUNCTION__, ## args) #define __DEBUGnoF(f, args...) \ fprintf(stderr, f, ## args) + + #include + #define YIELD \ + sched_yield() + #else + #define __DEBUG(f, args...) #define __DEBUGnoF(f, args...) + #define YIELD + #endif #endif /* !_DEBUG_H */ diff -r e89acebd97b1 -r d31f9a0f9024 src/Fifo/TaskManager.cbc --- a/src/Fifo/TaskManager.cbc Tue Jan 12 16:29:05 2010 +0900 +++ b/src/Fifo/TaskManager.cbc Wed Jan 13 17:26:58 2010 +0900 @@ -51,24 +51,14 @@ __code startTaskManager() { - /* - TaskManager *manager; - manager = malloc(sizeof(TaskManager)); - manager->waitingList = NULL; - manager->schedTasks = NULL; - manager->exitTasks = NULL; - manager->running = NULL; - scheduler = schedEntry; - goto searchStartTask(manager); - */ - TaskManager *manager; UserManager *umanager; manager = malloc(sizeof(TaskManager)); umanager= malloc(sizeof(UserManager)); - manager->waitingList = NULL; - manager->activeList = NULL; - manager->exitTasks = NULL; + manager->waitingList = createList(); + manager->activeList = createList(); + manager->exitTasks = createList(); + manager->schedTasks = createList(); manager->running = NULL; manager->user = umanager; @@ -87,7 +77,7 @@ stask->rbuff = task->rbuff; stask->wbuff = task->wbuff; - manager->schedTasks = _listAddFirst(manager->schedTasks, stask); + listAddFirst(manager->schedTasks, stask); goto executed(manager, iter, task); } @@ -102,10 +92,9 @@ { SchedTask *stask; Task *task; - //printTasks(manager); - if (manager->exitTasks) { - stask = _listGetnthData(manager->exitTasks, 0); - manager->exitTasks = _listRemove(manager->exitTasks, stask); + printTasks(manager); + if (!listEmpty(manager->exitTasks)) { + stask = listPollLast(manager->exitTasks); task = stask->task; free(stask); __DEBUG("task[%d] finished.\n", task->id); @@ -131,8 +120,8 @@ selectCode(TaskManager *manager) { SchedTask *task; - if (manager->schedTasks) { - task = (SchedTask*)_listGetLastData(manager->schedTasks); + if (!listEmpty(manager->schedTasks)) { + task = (SchedTask*)listPollLast(manager->schedTasks); manager->running = task; /* goto user-defined task. */ @@ -151,18 +140,16 @@ /* schedulerd */ if ( nextcode==NULL ) { /* the task finished. */ - manager->schedTasks = - _listRemove(manager->schedTasks, manager->running); - manager->exitTasks = - _listAddFirst(manager->exitTasks, manager->running); + listAddFirst(manager->exitTasks, manager->running); goto selectCode(manager); } else { + SchedTask *stask; /* save the next code segment for the task. */ manager->running->nextcode = nextcode; manager->running->rbuff = rbuff; manager->running->wbuff = wbuff; /* move last task to first to be fair. */ - manager->schedTasks = _listMoveLasttoFirst(manager->schedTasks); + listAddFirst(manager->schedTasks, manager->running); goto selectCode(manager); } } @@ -178,29 +165,32 @@ Task *task; SchedTask *stask; ListIter *iter; - __DEBUG("waiting:\n\t"); - iter = _listIterator(manager->waitingList); - while ( (task=_listIterNext(iter))!=NULL ) { + __DEBUG("waiting: "); + iter = createIterator(manager->waitingList); + while ( listIterhasNext(iter) ) { + task = listIterNext(iter); __DEBUGnoF("%d, ", task->id); } __DEBUGnoF("\n"); - _listIterEnd(iter); + destroyIterator(iter); - __DEBUG("scheduled:\n\t"); - iter = _listIterator(manager->schedTasks); - while ( (stask=_listIterNext(iter))!=NULL ) { + __DEBUG("scheduled: "); + iter = createIterator(manager->schedTasks); + while ( listIterhasNext(iter) ) { + stask = listIterNext(iter); __DEBUGnoF("%d, ", stask->task->id); } __DEBUGnoF("\n"); - _listIterEnd(iter); + destroyIterator(iter); - __DEBUG("exit:\n\t"); - iter = _listIterator(manager->exitTasks); - while ( (stask=_listIterNext(iter))!=NULL ) { + __DEBUG("exit: "); + iter = createIterator(manager->exitTasks); + while ( listIterhasNext(iter) ) { + stask = listIterNext(iter); __DEBUGnoF("%d, ", stask->task->id); } __DEBUGnoF("\n"); - _listIterEnd(iter); + destroyIterator(iter); } @@ -208,7 +198,7 @@ taskSpawn(UserManager *user, Task *task) { TaskManager *manager = user->manager; - manager->waitingList = _listAddFirst(manager->waitingList, task); + listAddFirst(manager->waitingList, task); //ablayer->spawnedTasks = _listAddFirst(ablayer->spawnedTasks, task); return ; } diff -r e89acebd97b1 -r d31f9a0f9024 src/List.c --- a/src/List.c Tue Jan 12 16:29:05 2010 +0900 +++ b/src/List.c Wed Jan 13 17:26:58 2010 +0900 @@ -3,200 +3,255 @@ #include"List.h" /* - * doubly-linked list. - * interfaces of these routines is based on glib. + * + * UserInterface * - * Usage: - * create new list. - * list = NULL - * add new data - * list = _listAddFirst(list, data) - * remove data from the list - * list = _listRemove(list, data) - * get n-th data - * data = _listGetnthData(list, n) + * list = createList(); + * addFirst(list, data); + * addLast(list, data); + * getFirst(list, data); + * getLast(list, data); + * destroyList(list); + * + * iter = createIterator(list); + * while (HasNext(iter)) { + * data = Next(iter); + * if (data->l...) + * Remove(iter); + * } + * destroyListIter(iter); * * - * NOTE: - * Although `struct List' is a doubly-linked List, the List - * is made as a Ring. An User's variable is treated as a - * head of the list. And head->prev is last. And then if - * list have only one data, both next and prev field of - * head will point to oneself. - * If the variable is NULL, it means no data. + * from JavaDoc java.util.Iterator + * boolean hasNext() Returns true if the iteration has more elements. + * E next() Returns the next element in the iteration. + * void remove() Removes from the underlying collection the last element returned by the iterator. + * + * + * ユーザは常にcreateList()で生成されたList構造体をもつ + * このbaseだけは特別で何もデータを所持していない + * base->nextは最初の要素 + * base->prevは最後の要素を指している + * それ以外のListは通常どおり、 + * list->nextは次の要素 + * list->prevは前の要素を指す + * 最初の要素のlist->prev, 際の要素のlist->nextはNULL. + * baseを指したりしない + * + * */ + List * -_listAddFirst(List* top, void *data) +createList() { List *newlist; - List *last; - newlist = malloc(sizeof(struct _List)); - newlist->data = data; - - if (!top) { - newlist->next = newlist; - newlist->prev = newlist; - return newlist; - } - last = top->prev; - newlist->next = top; - newlist->prev = last; - - top->prev = newlist; - last->next = newlist; + newlist = malloc(sizeof(List)); + newlist->next = NULL; + newlist->prev = NULL; return newlist; } -List * -_listRemove(List *top, void *data) +void +destroyList(List *list) +{ +} + +int +listEmpty(List *base) +{ + return (base->next==NULL); +} + +void +listAddFirst(List *base, void *data) { - List *t; - if (top->data==data) { - if (top->next==top) { - free(top); - return NULL; - } - List *newtop = top->next; - top->next->prev = top->prev; - top->prev->next = top->next; - free(top); - return newtop; + List *head, *new; + head = base->next; + + new = malloc(sizeof(List)); + new->data = data; + new->next = head; + new->prev = NULL; + + if (head) { + head->prev = new; + } else { + base->prev = new; } - for (t=top->next; t!=top; t=t->next) { - if (t->data==data) { - t->next->prev = t->prev; - t->prev->next = t->next; - free(t); - return top; - } + base->next = new; + + return; +} + +void +listAddLast(List *base, void *data) +{ + List *tail, *new; + tail = base->prev; + + new = malloc(sizeof(List)); + new->data = data; + new->prev = tail; + new->next = NULL; + + if (tail) { + tail->next = new; + } else { + base->next = new; } - return top; + base->prev = new; + + return; } void * -_listGetnthData(List *top, int n) +listGetLast(List *base) { - List *t; + if (base->prev) + return base->prev->data; + else + return NULL; +} - for (t=top; n>0; n--) { - t = t->next; - if (t==top) return NULL; +void * +listGetFirst(List *base) +{ + if (base->next) + return base->next->data; + else + return NULL; +} + + +void * +listPollLast(List *base) +{ + List *last, *newlast; + void *data; + last = base->prev; + + if (!last) { + return NULL; } - return t->data; -} -void * -_listGetLastData(List *top) -{ - if (!top) return NULL; - return top->prev->data; + newlast = last->prev; + data = last->data; + free(last); + + if (newlast) { + newlast->next = NULL; + } else { + base->next = NULL; + } + base->prev = newlast; + + return data; } -List * -_listMoveLasttoFirst(List *top) +void * +listPollFirst(List *base) { - if (!top) return NULL; - return top->prev; + List *head, *newhead; + void *data; + head = base->next; + + if (!head) { + return NULL; + } + + newhead = head->next; + data = head->data; + free(head); + + if (newhead) { + newhead->next = NULL; + } else { + base->next = NULL; + } + base->next = newhead; + + return data; } void -_listApply(List *top, ApplyFn fn, void *arg) +listRemove(List *base, void *data) { - List *t = top; - do { - fn(t->data, arg); - t = t->next; - } while ( t!=top ); + List *list; + list = base->next; + for (list=base->next; list; list=list->next) { + if (list->data!=data) continue; + + if (list->prev) { + list->prev->next = list->next; + } else { + base->next = list->next; + } + + if (list->next) { + list->next->prev = list->prev; + } else { + base->prev = list->prev; + } + free(list); + return; + } + return; } -/* - * Iterator's functions. - * - * iter = _listIterator(list); - * while ( (data=_listIterNext(iter)!=NULL ) { - * exe(data); - * if (data...) { - * list = _listIterRemove(iter); - * } - * } - */ ListIter * -_listIterator(List *top) +createIterator(List *base) { ListIter *iter; - iter = malloc(sizeof(struct _ListIter)); - iter->head = top; - iter->next = top; + iter = malloc(sizeof(ListIter)); + iter->list = base; + iter->current = base; return iter; } - -void * -_listIterNext(ListIter *iter) -{ - void *rtn; - if (!iter->next) return NULL; - - rtn = iter->next->data; - iter->next = iter->next->next; - if (iter->next==iter->head) { - iter->next = NULL; - } - return rtn; -} - void -_listIterEnd(ListIter *iter) +destroyIterator(ListIter *iter) { free(iter); } -List * -_listIterRemoveCurrent(ListIter *iter) +int +listIterhasNext(ListIter *iter) { - List *cur; - if (!iter->head) return NULL; - else if (!iter->next) cur = iter->head->prev; - else cur = iter->next->prev; + return iter->current->next!=NULL ; +} + +void * +listIterNext(ListIter *iter) +{ + iter->current = iter->current->next; + return iter->current->data; +} - if (cur==iter->head) { - if (cur->next==iter->head) { - free(iter->head); - return NULL; - } - iter->head = iter->head->next; +void +listIterRemove(ListIter *iter) +{ + List *list, *removed; + list = iter->list; + removed = iter->current; + + if (removed->prev) { + removed->prev->next = removed->next; + iter->current = removed->prev; + } else { + iter->list->next = removed->next; + iter->current = iter->list; } - cur->prev->next = cur->next; - cur->next->prev = cur->prev; - free(cur); - return iter->head; + if (removed->next) { + removed->next->prev = removed->prev; + } else { + iter->list->prev = removed->prev; + } + free(removed); } -/* - * for DEBUG - */ -int -_listRingCheck(List *head) -{ - List *cur = head; - if (cur->prev->next!=cur) return 0; - if (cur->next->prev!=cur) return 0; - do { - if (cur->prev->next!=cur) return 0; - if (cur->next->prev!=cur) return 0; - cur = cur->prev; - } while (cur!=head); - if (cur->prev->next!=cur) return 0; - if (cur->next->prev!=cur) return 0; - cur = cur->next; - if (cur->prev->next!=cur) return 0; - if (cur->next->prev!=cur) return 0; - return 1; -} - diff -r e89acebd97b1 -r d31f9a0f9024 src/List.h --- a/src/List.h Tue Jan 12 16:29:05 2010 +0900 +++ b/src/List.h Wed Jan 13 17:26:58 2010 +0900 @@ -8,24 +8,26 @@ } List; typedef struct _ListIter { - struct _List *head; - struct _List *next; + struct _List *list; + struct _List *current; } ListIter; -List * _listAddFirst(List*, void *); -List * _listRemove(List *, void *); -void * _listGetnthData(List *, int); -void * _listGetLastData(List *); -List * _listMoveLasttoFirst(List *); -typedef int (*ApplyFn)(void*,void*); -void _listApply(List *, ApplyFn, void *); - - -ListIter * _listIterator(List *); -void * _listIterNext(ListIter *); -void _listIterEnd(ListIter *); -List * _listIterRemoveCurrent(ListIter *); - +List * createList (); +void destroyList (List *list); +void listAddFirst (List *list, void *data); +void listAddLast (List *list, void *data); +void * listGetLast (List *list); +void * listGetFirst (List *list); +void * listPollLast (List *list); +void * listPollFirst (List *list); +void listRemove (List *base, void *data); +int listEmpty (List *list); +ListIter * createIterator (List *list); +void destroyIterator (ListIter *iter); +int listIterhasNext (ListIter *iter); +void * listIterNext (ListIter *iter); +void listIterRemove (ListIter *iter); #endif /* !_LIST_H */ + diff -r e89acebd97b1 -r d31f9a0f9024 src/Queue.c --- a/src/Queue.c Tue Jan 12 16:29:05 2010 +0900 +++ b/src/Queue.c Wed Jan 13 17:26:58 2010 +0900 @@ -20,7 +20,7 @@ Queue * -createQueue(int blocking) +createQueue() { Queue *newQ; newQ = malloc(sizeof(struct _Queue)); diff -r e89acebd97b1 -r d31f9a0f9024 src/Queue.h --- a/src/Queue.h Tue Jan 12 16:29:05 2010 +0900 +++ b/src/Queue.h Wed Jan 13 17:26:58 2010 +0900 @@ -11,7 +11,7 @@ pthread_cond_t cond; } Queue; -Queue * createQueue(int blocking); +Queue * createQueue(); void destroyQueue(Queue *queue); void queueOffer(Queue *queue, void *data); void * queuePoll(Queue *queue); diff -r e89acebd97b1 -r d31f9a0f9024 src/TaskManagerAbst.cbc --- a/src/TaskManagerAbst.cbc Tue Jan 12 16:29:05 2010 +0900 +++ b/src/TaskManagerAbst.cbc Wed Jan 13 17:26:58 2010 +0900 @@ -60,7 +60,7 @@ task = createTask(i, "start task"); taskSetData(task, NULL, 0, NULL, 0); task->cpu = MAIN; - manager->waitingList = _listAddFirst(manager->waitingList, task); + listAddFirst(manager->waitingList, task); goto checkEvent(manager); } @@ -74,7 +74,7 @@ __code addNewTask(TaskManager *manager, Task *task) { - manager->waitingList = _listAddFirst(manager->waitingList, task); + listAddFirst(manager->waitingList, task); goto start(manager); } @@ -88,9 +88,9 @@ noEvent(TaskManager *manager) { ListIter *iter; - if (!manager->waitingList && !manager->activeList) + if (listEmpty(manager->waitingList) && listEmpty(manager->activeList)) goto exitTaskManager(manager); - iter = _listIterator(manager->waitingList); + iter = createIterator(manager->waitingList); goto getTask(manager, iter); } @@ -98,23 +98,26 @@ getTask(TaskManager *manager, ListIter *iter) { Task *task; - task = (Task*)_listIterNext(iter); - if (!task) + if (!listIterhasNext(iter)) { /* iteration finished. */ goto start(manager); - if (task->waitee) + } + + task = (Task*)listIterNext(iter); + if (listEmpty(task->waitee)) { + /* the task is ready! */ + goto executeTask(manager, iter, task); + } else { /* the task has been waiting yet. */ goto getTask(manager, iter); - else - /* the task is ready! */ - goto executeTask(manager, iter, task); + } } __code executed(TaskManager *manager, ListIter *iter, Task *task) { - manager->waitingList = _listIterRemoveCurrent(iter); - manager->activeList = _listAddFirst(manager->activeList, task); + listIterRemove(iter); + listAddFirst(manager->activeList, task); goto getTask(manager, iter); } /* @@ -127,8 +130,8 @@ { ListIter *iter; - manager->activeList = _listRemove(manager->activeList, task); - iter = _listIterator(task->waiter); + listRemove(manager->activeList, task); + iter = createIterator(task->waiter); goto finishTask_iter(manager, task, iter); } @@ -136,13 +139,13 @@ finishTask_iter(TaskManager *manager, Task *task, ListIter *iter) { Task *waiter; - waiter = _listIterNext(iter); - if (waiter) { - waiter->waitee = _listRemove(waiter->waitee, task); - task->waiter = _listIterRemoveCurrent(iter); + if (listIterhasNext(iter)) { + waiter = listIterNext(iter); + listRemove(waiter->waitee, task); + listIterRemove(iter); goto finishTask_iter(manager, task, iter); } else { - _listIterEnd(iter); + destroyIterator(iter); goto finishTask_end(manager, task); } } @@ -151,8 +154,8 @@ finishTask_end(TaskManager *manager, Task *task) { /* TODO: free(task) */ - assert (!task->waiter); - assert (!task->waitee); + assert (listEmpty(task->waiter)); + assert (listEmpty(task->waitee)); free(task); goto start(manager); } @@ -177,8 +180,8 @@ task->id = id++; task->rbuff = NULL; task->wbuff = NULL; - task->waiter = NULL; - task->waitee = NULL; + task->waiter = createList(); + task->waitee = createList(); task->name = name; task->cpu = ANY; task->rsize = 0; @@ -200,7 +203,7 @@ taskSetWait(Task *task_a, Task *task_b) { /* set a waiting for b. */ - task_a->waitee = _listAddFirst(task_a->waitee, task_b); - task_b->waiter = _listAddFirst(task_b->waiter, task_a); + listAddFirst(task_a->waitee, task_b); + listAddFirst(task_b->waiter, task_a); } diff -r e89acebd97b1 -r d31f9a0f9024 src/pthread/TaskManager.cbc --- a/src/pthread/TaskManager.cbc Tue Jan 12 16:29:05 2010 +0900 +++ b/src/pthread/TaskManager.cbc Wed Jan 13 17:26:58 2010 +0900 @@ -62,10 +62,10 @@ UserManager *umanager; manager = malloc(sizeof(TaskManager)); umanager= malloc(sizeof(UserManager)); - manager->waitingList = NULL; - manager->activeList = NULL; - manager->schedTasks = NULL; - manager->finishtaskQ = createQueue(1); + manager->waitingList = createList(); + manager->activeList = createList(); + manager->schedTasks = createList(); + manager->finishtaskQ = createQueue(); manager->user = umanager; umanager->manager = manager; @@ -89,10 +89,10 @@ { if (i < manager->thread_num) { manager->thread[i].finishtaskQ = manager->finishtaskQ; - manager->thread[i].newtaskQ = createQueue(1); + manager->thread[i].newtaskQ = createQueue(); manager->thread[i].thread_id = i; manager->thread[i].finishFlag = 0; - manager->thread[i].schedTasks = NULL; + manager->thread[i].schedTasks = createList(); manager->thread[i].running = NULL; pthread_create(&manager->thread[i].thread, NULL, threadbase, &manager->thread[i]); goto startThreadManager_iter(manager, i+1); @@ -114,7 +114,7 @@ stask->rbuff = task->rbuff; stask->wbuff = task->wbuff; - manager->schedTasks = _listAddFirst(manager->schedTasks, stask); + listAddFirst(manager->schedTasks, stask); } else { // どのthreadに渡すかが問題 // とりあえずラウンドロビン @@ -161,8 +161,8 @@ selectCode(TaskManager *manager) { SchedTask *task; - if (manager->schedTasks) { - task = (SchedTask*)_listGetLastData(manager->schedTasks); + if (!listEmpty(manager->schedTasks)) { + task = listPollLast(manager->schedTasks); manager->running = task; /* goto user-defined task. */ @@ -178,13 +178,11 @@ schedEntry(UserManager *user, Taskrun nextcode, void *rbuff, void *wbuff) { TaskManager *manager = user->manager; + Task *task; /* schedulerd */ if ( nextcode==NULL ) { /* the task finished. */ - Task *task; task = manager->running->task; - manager->schedTasks = - _listRemove(manager->schedTasks, manager->running); free(manager->running); queueOffer(manager->finishtaskQ, task); goto selectCode(manager); @@ -194,7 +192,7 @@ manager->running->rbuff = rbuff; manager->running->wbuff = wbuff; /* move last task to first to be fair. */ - manager->schedTasks = _listMoveLasttoFirst(manager->schedTasks); + listAddFirst(manager->schedTasks, manager->running); goto selectCode(manager); } } @@ -210,41 +208,33 @@ Task *task; SchedTask *stask; ListIter *iter; - __DEBUG("waiting:\n\t"); - iter = _listIterator(manager->waitingList); - while ( (task=_listIterNext(iter))!=NULL ) { + __DEBUG("waiting: "); + iter = createIterator(manager->waitingList); + while ( listIterhasNext(iter) ) { + task = listIterNext(iter); __DEBUGnoF("%d, ", task->id); } __DEBUGnoF("\n"); - _listIterEnd(iter); + destroyIterator(iter); - __DEBUG("scheduled:\n\t"); - iter = _listIterator(manager->schedTasks); - while ( (stask=_listIterNext(iter))!=NULL ) { + __DEBUG("scheduled: "); + iter = createIterator(manager->schedTasks); + while ( listIterhasNext(iter) ) { + stask = listIterNext(iter); __DEBUGnoF("%d, ", stask->task->id); } __DEBUGnoF("\n"); - _listIterEnd(iter); + destroyIterator(iter); - /* - __DEBUG("exit:\n\t"); - iter = _listIterator(manager->exitTasks); - while ( (stask=_listIterNext(iter))!=NULL ) { - __DEBUGnoF("%d, ", stask->task->id); - } - */ - __DEBUGnoF("\n"); - _listIterEnd(iter); } void taskSpawn(UserManager *user, Task *task) { TaskManager *manager = user->manager; - manager->waitingList = _listAddFirst(manager->waitingList, task); + listAddFirst(manager->waitingList, task); //ablayer->spawnedTasks = _listAddFirst(ablayer->spawnedTasks, task); return ; } - diff -r e89acebd97b1 -r d31f9a0f9024 src/pthread/ThreadManager.cbc --- a/src/pthread/ThreadManager.cbc Tue Jan 12 16:29:05 2010 +0900 +++ b/src/pthread/ThreadManager.cbc Wed Jan 13 17:26:58 2010 +0900 @@ -51,7 +51,7 @@ { if (manager->finishFlag) goto exitThread(manager); - else if (!manager->schedTasks) + else if (listEmpty(manager->schedTasks)) goto waitNewTask(manager); else goto checkNewTask(manager); @@ -80,7 +80,7 @@ stask->nextcode = tasktypes[task->typeid].code; stask->rbuff = task->rbuff; stask->wbuff = task->wbuff; - manager->schedTasks = _listAddFirst(manager->schedTasks, stask); + listAddFirst(manager->schedTasks, stask); } goto selectCode(manager); @@ -100,7 +100,7 @@ stask->rbuff = task->rbuff; stask->wbuff = task->wbuff; - manager->schedTasks = _listAddFirst(manager->schedTasks, stask); + listAddFirst(manager->schedTasks, stask); goto selectCode(manager); } @@ -113,8 +113,8 @@ selectCode(ThreadManager *manager) { SchedTask *task; - if (manager->schedTasks) { - task = (SchedTask*)_listGetLastData(manager->schedTasks); + if (!listEmpty(manager->schedTasks)) { + task = listPollLast(manager->schedTasks); manager->running = task; /* goto user-defined task. */ @@ -130,14 +130,14 @@ schedEntry(UserManager *user, Taskrun nextcode, void *rbuff, void *wbuff) { ThreadManager *manager = user->threadmanager; + Task *task; + YIELD; /* schedulerd */ if ( nextcode==NULL ) { /* the task finished. */ - Task *task; task = manager->running->task; - manager->schedTasks = - _listRemove(manager->schedTasks, manager->running); + listRemove(manager->schedTasks, manager->running); free(manager->running); manager->running = NULL; queueOffer(manager->finishtaskQ, task); @@ -149,7 +149,7 @@ manager->running->rbuff = rbuff; manager->running->wbuff = wbuff; /* move last task to first to be fair. */ - manager->schedTasks = _listMoveLasttoFirst(manager->schedTasks); + listAddFirst(manager->schedTasks, manager->running); goto selectCode(manager); } }