changeset 18:d31f9a0f9024

change interfaces of List.c.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Wed, 13 Jan 2010 17:26:58 +0900
parents e89acebd97b1
children b61658aaeef2
files Makefile.am Makefile.in configure configure.ac examples/treedependtask/Makefile src/Debug.h src/Fifo/TaskManager.cbc src/List.c src/List.h src/Queue.c src/Queue.h src/TaskManagerAbst.cbc src/pthread/TaskManager.cbc src/pthread/ThreadManager.cbc
diffstat 14 files changed, 388 insertions(+), 343 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- 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.
--- 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 <stdio.h>
@@ -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;}
--- 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
 
--- 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
-
-
-
--- 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 <stdio.h>
   #define __DEBUG(f, args...) \
     fprintf(stderr, "in %s: "f, __FUNCTION__, ## args)
   #define __DEBUGnoF(f, args...) \
     fprintf(stderr, f, ## args)
+
+  #include <sched.h>
+  #define YIELD \
+	sched_yield()
+
 #else
+
   #define __DEBUG(f, args...)
   #define __DEBUGnoF(f, args...)
+  #define YIELD 
+
 #endif
 
 #endif /* !_DEBUG_H */
--- 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 ;
 }
--- 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<E>
+ *    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;
-}
-
--- 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 */
+
--- 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));
--- 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);
--- 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);
 }
 
--- 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 ;
 }
 
 
-
--- 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);
 	}
 }