changeset 572:27a826cb2551

merge
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 23 Oct 2009 00:40:24 +0900
parents 34c3be70b3f8
children 2f4b5ce2a515
files Renderer/Engine/SceneGraphList.cc Renderer/Engine/SceneGraphList.h Renderer/Engine/SgStruct.h Renderer/Engine/lindaapi.cc Renderer/Engine/viewer.cc
diffstat 5 files changed, 513 insertions(+), 283 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/Engine/SceneGraphList.cc	Fri Oct 23 00:40:24 2009 +0900
@@ -0,0 +1,89 @@
+/*!
+  MemList は空にならない。最低1個は要素が入っていて
+  1個目は特別扱いする。getFirst すると first->next を返す
+ */
+#include <stdio.h>
+#include "SceneGraphList.h"
+
+/*!
+  最初の1個は特別扱いなので、それの後に追加していく
+ */
+void
+SceneGraphList::addFirst(SgStruct* e)
+{
+    e->prev = first;
+    e->next = first->next;
+    first->next->prev = e;
+    first->next = e;
+}
+
+void
+SceneGraphList::addLast(SgStruct* e)
+{
+    e->next = first;
+    e->prev = last;
+    last->next = e;
+    last = e;
+}
+
+SgStruct*
+SceneGraphList::getFirst()
+{
+    return first->next;
+}
+
+SgStruct*
+SceneGraphList::getLast()
+{
+    return last;
+}
+
+int
+SceneGraphList::remove(SgStruct* e)
+{
+    e->prev->next = e->next;
+    e->next->prev = e->prev;
+
+    if (first->next == e) {
+	first->next = e->next;
+    }
+    if (last == e) {
+	last = e->prev;
+    }
+
+    e->prev = NULL;
+    e->next = NULL;
+
+    return 1;
+}
+
+/*!
+  リストの先頭を取得および削除する。リストが空の場合は NULL を返す。
+ */
+
+SgStruct*
+SceneGraphList::poll()
+{
+    SgStruct* e = first->next;
+    if (e == this) {
+	return NULL;
+    }
+    remove(e);
+    return e;
+}
+
+/*!
+  リスト内の指定された name を持つオブジェクトを返す。
+  見つからなかった場合 NULL を返す。
+ */
+
+SgStruct*
+SceneGraphList::get(const char *obj_name)
+{
+    SgStruct* e = first->next;
+    while (e) {
+	if (strcmp(e->name, obj_name) == 0) return e;
+	e = e->next;
+    }
+    return NULL;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/Engine/SceneGraphList.h	Fri Oct 23 00:40:24 2009 +0900
@@ -0,0 +1,31 @@
+#ifndef SCENE_GRAPH_LIST
+#define SCENE_GRAPH_LIST
+
+#include <stdlib.h>
+#include "SgStruct.h"
+
+class SceneGraphList : SgStruct {
+public:    
+    SgStruct* first;
+    SgStruct* last;
+    int sgid;
+
+    SceneGraphList () {
+        first = last = this;
+        next = prev = this;
+	sgid = 0;
+    }
+    
+    ~SceneGraphList () {
+    }    
+
+    void addFirst(SgStruct* e);
+    void addLast(SgStruct* e);
+    SgStruct* getFirst();
+    SgStruct* getLast();
+    int remove(SgStruct* e);
+    SgStruct* poll();
+    SgStruct* get(const char *name);    
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/Engine/SgStruct.h	Fri Oct 23 00:40:24 2009 +0900
@@ -0,0 +1,16 @@
+#ifndef SGSTRUCT
+#define SGSTRUCT
+#include "types.h"
+#include "SceneGraph.h"
+
+class SgStruct {
+public:
+    SgStruct* next;
+    SgStruct* prev;
+    const char *name;
+    int id;
+};
+
+typedef SgStruct *SgStructPtr;
+
+#endif
--- a/Renderer/Engine/lindaapi.cc	Fri Oct 23 00:16:38 2009 +0900
+++ b/Renderer/Engine/lindaapi.cc	Fri Oct 23 00:40:24 2009 +0900
@@ -1,73 +1,77 @@
-//  $Id: lindaapi.c,v 1.9 2006/04/03 08:17:11 kono Exp $
+//  $Id$
 //
 
 /*----------------------------------------------------------------------
- 󥯥롼ɥեɤ߹
+ インクルードファイル読み込み
 ----------------------------------------------------------------------*/
-#include <sys/file.h>
 #include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
+#include <stdlib.h>
+#include <sys/time.h>
 #include <unistd.h>
-#include <fcntl.h>
-#include <sys/uio.h>
-#include <sys/time.h>
+#include <netinet/in.h>
 #include <sys/select.h>
-#include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/socket.h>
-#include <sys/un.h>
-#include <netinet/in.h>
+#include <netdb.h>
 #include <netinet/tcp.h>
-#include <signal.h>
-#include <termios.h>
-#include <netdb.h>
+#include <sys/un.h>
 #include <errno.h>
-#include <sys/select.h>
+#include <arpa/inet.h>
 
 #include "lindaapi.h"
 
-#define TIMEDELTA       10
+
 #if 0
 #define PSX_Debug(deb)    (putchar(PS_DEB)),\
             (printf deb ),\
             (putchar(PS_DEB))
-#define DEB(a)
+#define DEB(a)         
 #else
-#define PSX_Debug(deb)
+#define PSX_Debug(deb)    
 #define DEB(a)        /* a */
 #endif
 
-COMMAND *q_top, *q_end;
-REPLY *reply, *r_end;
+/* Global Variables */
+static COMMAND *q_top, *q_end; /* コマンドキュー */
+static REPLY *reply, *r_end;   /* 受け取り用キュー */
+static int qsize; /* コマンドキューのサイズ */
+static fd_set g_fds;   /* 接続しているタプルスペース群のFD(FileDiscripter)を保持 */
+static int g_max_fds;  /* 監視するFDの最大値 */
 
-int qsize, ps;
-unsigned short seq;
+/* Static Functions */
+static void unix_chkserv(int ps);
+void psx_free(void *);
+static int psx_queue(unsigned int tspace_id, unsigned int id,
+              unsigned int size, unsigned char *data, char mode,
+              void(*callback)(unsigned char *,void *),void * obj);
 
 #ifdef COUNT_PACKET
 // print packet count message per PRINT_INTERVAL sec
 #define PRINT_INTERVAL 4
+static void count_packet(char type);
 
 /*-------------------------------------------------------------------/
-  void
+  static void
   count_packet (char type):
-      ѥåȤȤ
-
-  :
-      type -  (char: s,r)
+      パケットの送受信カウントする
+      
+  引き数:
+      type - 送信、受信 (char型: s,r)
 /-------------------------------------------------------------------*/
-void count_packet(char type)
+static void
+count_packet(char type)
 {
     static int send_packet=-1,receive_packet=0;
     static struct timeval start,now,previous;
-
+    
     if (out_packet == -1) {
         gettimeofday(&start,NULL);
         gettimeofday(&previous,NULL);
         send_packet = 0;
         printf("packet\tout\tread\t\ttime\n");
     }
-
+    
     if (type == 's') {
         send_packet++;
     } else if (type == 'r') {
@@ -76,13 +80,13 @@
         fprintf(stderr,"No type in count_packet function\n");
         return;
     }
-
+    
     gettimeofday(&now,NULL);
     if ((now.tv_sec-previous.tv_sec) > PRINT_INTERVAL) {
         printf("log\t%d\t%d\t%ld\n",
                send_packet,receive_packet,now.tv_sec-start.tv_sec);
         fflush(stdout);
-
+        
         previous.tv_sec = now.tv_sec;
         send_packet = receive_packet = 0;
     }
@@ -90,64 +94,26 @@
 #endif
 
 
-#define unix_open       open
 #define unix_read_w     read
-/*-------------------------------------------------------------------/
-  int
-  unix_read (int fd, char *buf, unsigned int size):
-      ФTUPLEɤߤࡣ
-      ߤϻȤƤʤ
+
+
+static int
+unix_write(int fd,unsigned char *buf,unsigned int size) {
+    unsigned int count=0;
+    uint32_t nsize;
 
-  :
-      fd   - ФΥեǥץ
-      buf  - ǡγǼ(TUPLEإåޤ)
-      size - bufbyte
-  ֤:
-      ɤߤbyte
-/-------------------------------------------------------------------*/
-int
-unix_read(int fd,char *buf,unsigned int size) {
-    int len,a,i;
-    if(read(fd,buf,INT_SIZE)!=INT_SIZE) {  // INT_SIZE is sizeof(int)
-        fprintf(stderr, "read error! on fd:%d len=%d %s\n", fd,
-                *(unsigned int*)&buf[0],
-                strerror(errno));
-        exit(1);
+    /* これから送信するデータのサイズをまず送信  */
+    nsize = htonl(size);
+    write(fd, &nsize, INT_SIZE);
+
+    /* 目的のデータを送信  */
+    while (count < size) {
+	count += write(fd, buf+count, size-count);
     }
-    len = ntohl(*(unsigned int*)&buf[0]);
-    if((unsigned int)len>size) len=(int)size;
-    for(a=0;a<len;a+=i) {
-        if((i=read(fd,buf+a,len-a))<0) {
-            fprintf(stderr, "ldserv: client read error! on i=%d len= %d %s\n",
-                    i, len, strerror(errno));
-            exit(1);
-        }
-    }
-    return len;
-}
-
-/*-------------------------------------------------------------------/
-  int
-  unix_write (int fd, unsigned char *buf, unsigned int size):
-      ФTUPLE롣
-
-  :
-      fd   - ФΥեǥץ
-      buf  - Фǡ(TUPLEإåޤ)
-      size - bufbyte
-  ֤:
-      ä(񤭤)ǡbyte
-/-------------------------------------------------------------------*/
-int
-unix_write(int fd,unsigned char *buf,unsigned int size) {
-    int i,nsize;
-    nsize = htonl(size);
-    i  = write(fd,&nsize,INT_SIZE);
-    i += write(fd,buf,size); // size == datasize + LINDA_HEADER_SIZE
 #ifdef COUNT_PACKET
     count_packet('s');
 #endif
-    return(i);
+    return count+INT_SIZE;
 }
 
 #define unix_write_w   unix_write
@@ -157,84 +123,80 @@
 #define SERVER_NAME    hostname
 #define MAX_REQ        16
 
-int fd,paddrlen;
-struct hostent *hoste;
-struct sockaddr_in serv_addr;
-struct sockaddr_un serv_addr_un;
-unsigned char ipaddr[4];
+
+
+/*-------------------------------------------------------------------/
+  void
+  init_linda():
+      大域変数の初期化等を行なう
+/-------------------------------------------------------------------*/
+void
+init_linda() {
+    FD_ZERO(&g_fds);
+    /* 大域変数はゼロクリアされる
+    g_max_fds = 0;
+    q_end = q_top = NULL;
+    r_end = reply = NULL;
+    qsize = 0;
+    */
+}
 
 
 /*-------------------------------------------------------------------/
   int
-  start_linda (char * hostname):
-      ФȤΥͥΩCOMMAND塼REPLY塼
-      Ԥʤ
+  open_linda (char * hostname, int port):
+      Lindaサーバとのコネクションを確立し、タプルスペースのIDを返す。
+      現在はファイルディスクリプタを返している。
 
-  :
-      hostname - ФΥۥ̾
-  ֤:
-      ͥΩȤΥեǥץ֤
-      Ԥ -1 ֤
+  引き数:
+      hostname - サーバのホスト名
+      port - サーバのポート番号
+  返り値:
+      コネクション確立が成功するとそのファイルディスクリプタを返す。
+      失敗すると -1 を返す。
 /-------------------------------------------------------------------*/
 int
-start_linda(char * hostname){
-    char *p;
-    const char *hostname0 = "/tmp/ldserv";
-
-    if (! hostname) {
-        hostname = (char *)hostname0;
-    }
+open_linda(char * hostname, int port){
+    int fd;
+    struct hostent *hoste;
+    struct sockaddr_in serv_addr;
+    struct sockaddr_un serv_addr_un;
+    
     if (hostname[0]=='/') {
         /* Unix domain */
         if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == FAIL){
-            fprintf(stderr, "socket open error! errno :%d %s\n", errno,
-                    strerror(errno));
+	    perror("socket");
             return(-1);
         }
         serv_addr_un.sun_family = AF_UNIX;
         strcpy(serv_addr_un.sun_path, hostname);
-        fprintf(stdout,"connecting ... %d\n", ntohs(serv_addr.sin_port));
+        fprintf(stdout,"connecting ... %d\n", serv_addr.sin_port);
         if (connect(fd, (struct sockaddr *)&serv_addr_un,sizeof(serv_addr_un)) == FAIL){
-            fprintf(stderr,"connection error! errno :%d %s\n", errno,
-                    strerror(errno));
+	    perror("connect");
             close(fd);
             return(-1);
         }
-
+        
     } else {
         /* INET domain */
         if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == FAIL){
-            fprintf(stderr, "socket open error! errno :%d %s\n", errno,
-                    strerror(errno));
+			perror("socket");
             return(-1);
         }
-        /* check optional port number */
-        serv_addr.sin_port = htons(10000);
-        p = (char *)malloc(strlen(hostname));
-        strcpy(p,hostname);
-        hostname = p;
-        while(*p) {
-            if (*p==':') {
-                serv_addr.sin_port = htons(atoi(p+1));
-                *p = 0;
-                break;
-            }
-            p++;
-        }
-        if ((hoste = gethostbyname(hostname)) == NULL){
+        if ((hoste = gethostbyname(SERVER_NAME)) == NULL){
             fprintf(stderr,"hostname error\n");
             close(fd);
             return(-1);
         }
-        free(hostname); hostname=0;
         serv_addr.sin_family = AF_INET;
+        serv_addr.sin_port = port;
         serv_addr.sin_addr.s_addr = ((struct in_addr *)(hoste->h_addr))->s_addr;
         if (serv_addr.sin_family == AF_INET) {
             int tmp = 1;
             setsockopt (fd, IPPROTO_TCP, TCP_NODELAY,
                         (char *) &tmp, sizeof (int));
         }
-        fprintf(stdout,"connecting ... %d\n", ntohs(serv_addr.sin_port));
+        fprintf(stdout,"connecting ... %d\n", serv_addr.sin_port);
         if (connect(fd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)) == FAIL){
             fprintf(stderr,"connection error! errno :%d %s\n", errno,
                     strerror(errno));
@@ -243,57 +205,149 @@
         }
     }
 
-    ps = fd;
+    FD_SET(fd, &g_fds);
+    if (g_max_fds < fd) g_max_fds = fd;
+    
     fprintf(stdout," connect middle server %d\n", fd);
-    q_end = q_top = NULL;
-    r_end = reply = NULL;
-    qsize = seq = 0;
-    seq = 120;
-    return ps;
+    return fd;
+}
+
+int
+open_linda_java(char * hostname, int port){
+    int fd;
+    struct hostent *hoste;
+    struct sockaddr_in serv_addr;
+    struct sockaddr_un serv_addr_un;
+    
+    if (hostname[0]=='/') {
+        /* Unix domain */
+        if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == FAIL){
+			perror("socket");
+            return(-1);
+        }
+        serv_addr_un.sun_family = AF_UNIX;
+        strcpy(serv_addr_un.sun_path, hostname);
+        DEB(fprintf(stdout,"connecting ... %d\n", serv_addr.sin_port));
+        if (connect(fd, (struct sockaddr *)&serv_addr_un,sizeof(serv_addr_un)) == FAIL){
+			perror("connect");
+            close(fd);
+            return(-1);
+        }
+        
+    } else {
+        /* INET domain */
+        if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == FAIL){
+			perror("socket");
+            return(-2);
+        }
+	serv_addr.sin_family = AF_INET;
+	serv_addr.sin_port = htons(port);
+
+	serv_addr.sin_addr.s_addr = inet_addr(hostname);
+	if (serv_addr.sin_addr.s_addr == 0xffffffff) {
+	  if ((hoste = gethostbyname(hostname)) == NULL){
+	    fprintf(stdout, "hostname error\n");
+	    close(fd);
+	    return(-1);
+	  }
+	  serv_addr.sin_addr.s_addr = *(unsigned int *)hoste->h_addr_list[0];
+	}
+
+        if (serv_addr.sin_family == AF_INET) {
+            int tmp = 1;
+            setsockopt (fd, IPPROTO_TCP, TCP_NODELAY,
+                        (char *) &tmp, sizeof (int));
+        }
+        DEB(fprintf(stdout,"connecting ... %d \n", ntohs(serv_addr.sin_port)));
+        DEB(fprintf(stdout," serv_addr.sin_port ... %d \n", ntohs(serv_addr.sin_port)));
+	//fprintf(stdout," serv_addr.sin_addr.s_addr... %s\n", serv_addr.sin_addr.s_addr);
+        if (connect(fd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)) == FAIL){
+			perror("connect");
+            close(fd);
+            return(-4);
+        }
+    }
+
+    FD_SET(fd, &g_fds);
+    if (g_max_fds < fd) g_max_fds = fd;
+    
+    DEB(fprintf(stdout," connect middle server %d\n", fd));
+    return fd;
+}
+
+
+/*-------------------------------------------------------------------/
+  int
+  close_linda(int tspace_id):
+      接続しているタプルスペースへの接続を切る。
+      ソケットを閉じ、g_fds から外す。
+  引数:
+      tspace_id - 閉じるタプルスペースのID
+  返り値:
+      close の値
+/-------------------------------------------------------------------*/
+int
+close_linda(int tspace_id){
+    int retval;
+    int i;
+    if ((retval = close(tspace_id)) == 0) {
+        FD_CLR(tspace_id, &g_fds);
+        if (g_max_fds == tspace_id) {
+            for (i = g_max_fds-1; FD_ISSET(i, &g_fds) && i; i--);
+            g_max_fds = i;
+        }
+    }
+    return retval;
 }
 
 /*-------------------------------------------------------------------/
   int
-  psx_out (unsigned int id, unsigned char *data, unsigned int size):
-      outޥɤCOMMAND塼ί롣
+  psx_out (unsigned int tspace_id, unsigned int id,
+           unsigned char *data, unsigned int size):
+      outコマンドをCOMMANDキューへ溜める。
 
-  :
-      id   - TUPLE SpaceID
-      data - ǡ
-      size - dataΥ
-  ֤:
-      ֹ
+  引き数:
+      tspace_id - タプルスペースのID
+      id        - タプルのID
+      data      - 送信するデータ
+      size      - dataのサイズ
+  返り値:
+      シーケンス番号
 /-------------------------------------------------------------------*/
 int
-psx_out(unsigned int id, unsigned char *data, unsigned int size){
-    if (psx_queue(id, size, data, 'o', NULL, NULL) == FAIL){
+psx_out(unsigned int tspace_id, unsigned int id,
+        unsigned char *data, unsigned int size){
+    int r;
+    if ((r = psx_queue(tspace_id, id, size, data, 'o', NULL, NULL)) == FAIL) {
         return(FAIL);
     }
     DEB( fprintf(stdout, "psx_out: size = %d, command = %s\n",
                  q_end->size, q_end->command+LINDA_HEADER_SIZE));
-    return(seq);
+    return(r);
 }
 
 /*-------------------------------------------------------------------/
   int
-  psx_ld (unsigned int id, char mode, void(*callback)(char*,void*),
-              void * obj):
-      in,read,waitʤɤμޥɤCOMMAND塼ί롣
-      psx_in,psx_rd,psx_wait_rdʤɤ֤Ƥ롣
-
-  :
-      id       - TUPLE SpaceID
-      mode     - i,r,w ʸꡢơin,read,waitɽƤ롣
-      callback - ХåѤδؿؤΥݥ󥿡
-                 ѤʤNULL򤤤롣
-      obj      - ХåѤؿΰ
-  ֤:
-      psx_queuemalloc줿REPLY¤ΤؤΥݥ
+  psx_ld (unsigned tspace_id, unsigned int id,
+          char mode, void(*callback)(char*,void*), void * obj):
+      in,read,waitなどの受信コマンドをCOMMANDキューへ溜める。
+      psx_in,psx_rd,psx_wait_rdなどに置き換えられている。
+      
+  引き数:
+      tspace_id- タプルスペースのID
+      id       - タプルのID
+      mode     - i,r,w の文字を取り、各々in,read,waitを表している。
+      callback - コールバックを使用する場合の関数へのポインタ。
+                 使用しない場合はNULLをいれる。
+      obj      - コールバックで用いる関数の引き数。
+  返り値:
+      psx_queue内でmallocされたREPLY構造体へのポインタ
 /-------------------------------------------------------------------*/
 int
-psx_ld(unsigned int id, char mode,void(*callback)(char *,void *),void * obj){
+psx_ld(unsigned int tspace_id, unsigned int id,
+       char mode, void(*callback)(unsigned char *,void *), void * obj){
     int r;
-    if ((r=psx_queue(id, 0, NULL, mode, callback, obj)) == FAIL){
+    if ((r = psx_queue(tspace_id, id, 0, NULL, mode, callback, obj)) == FAIL) {
         return(FAIL);
     }
     return(r);
@@ -302,26 +356,26 @@
 /*-------------------------------------------------------------------/
   unsigned char *
   psx_reply (int seq):
-      Ф褿ǡ֤
+      サーバから答えが来たデータを返す。
 
-  :
-      seq - psx_ld()֤͡
-  ֤:
-      seqбǡ֤ǡޤƤʤ
-      NULL֤
+  引き数:
+      seq - psx_ld()が返した値。
+  返り値:
+      seqに対応したデータを返す。データをまだ受信していない場合は
+      NULLを返す。
 /-------------------------------------------------------------------*/
 unsigned char *
-psx_reply(int seq){
+psx_reply(unsigned int seq){
     REPLY *p, *q;
-    char *ans;
-
+    unsigned char *ans;
+    
     DEB(fprintf(stdout, "psx_reply: search of seq = %d\n", seq));
-    PSX_Debug(("psx_reply: seq %d", seq));
-    for(q = NULL,p = reply;p;q = p,p = p->next){
-        if (p->seq == (unsigned)seq){
+    PSX_Debug(("psx_reply: seq %d", seq)); 
+    for(q = NULL,p = reply; p; q = p,p = p->next){
+        if (p->seq == seq){
             DEB(fprintf(stdout, "psx_reply: match of seq = %d\n", seq));
             if (p->mode == '!'){
-                ans = (char *)p->answer;
+                ans = p->answer;
                 if (q == NULL){
                     reply = p->next;
                     if(p==r_end) {
@@ -333,12 +387,12 @@
                         r_end = q;
                     }
                 }
-                PSX_Debug(("psx_reply: reply %x r_end %x p %x q %x",reply,r_end,p,q));
-                free(p);
+                PSX_Debug(("psx_reply: reply %x r_end %x p %x q %x",reply,r_end,p,q)); 
+                psx_free(p);
                 DEB( for(p=reply;p;p=p->next) { PSX_Debug(("psx_queue dump: seq %d mode %c %x %x",p->seq,p->mode,p,p->next))});
                 DEB( fprintf(stdout, "psx_reply: returned answer = %s\n", ans));
                 PSX_Debug(("psx_reply: answer %s",ans));
-                return((unsigned char *)ans);
+                return(ans);
             } else {
                 if (p->mode == '?'){
                     DEB(fprintf(stdout, "psx_reply: don't accept anser\n"));
@@ -356,15 +410,17 @@
 /*-------------------------------------------------------------------/
   void
   psx_sync_n ():
-      Фȥǡ򤹤롣COMMAND塼ίޤäǡ
-      Ф褿ǡбREPLYؤ롣
+      サーバとデータの送受信をする。COMMANDキューに溜まったデータを
+      送信し、サーバから送られて来たデータを対応するREPLYへいれる。
 /-------------------------------------------------------------------*/
+#define TIMEDELTA       10
 void
 psx_sync_n(){
     int acount;
+    int i;
     COMMAND *c, *t;
 
-    fd_set tmp, fds;
+    fd_set tmp;
     struct timeval timeout;
     timeout.tv_sec=0;
     timeout.tv_usec=TIMEDELTA * 1000;
@@ -372,62 +428,60 @@
     acount = 0;
     while (q_top != NULL){
         c = q_top;
-        unix_write_w(ps, c->command, c->size);
-        free(c->command);
+        unix_write_w(c->tspace_id, c->command, c->size);
+        psx_free(c->command);
         t = c->next;
-        free(c);
-        q_top = c = t;qsize--;
+        psx_free(c);
+        q_top = c = t;
+        qsize--;
     }
-    FD_ZERO(&fds);
-    FD_SET(ps, &fds);
-    tmp = fds;
-    while(select(32, &tmp, NULL, NULL, &timeout) > 0) {
-        if(FD_ISSET(ps, &tmp)) {
-            unix_chkserv();
+
+    tmp = g_fds;
+    while(select(g_max_fds+1, &tmp, NULL, NULL, &timeout) > 0) {
+        for (i = 0; i < g_max_fds+1; i++) {
+            if (FD_ISSET(i, &tmp)) {
+                unix_chkserv(i);
+            }
         }
-    }
+    }    
 }
 
 /*-------------------------------------------------------------------/
-  int
-  psx_queue (unsigned int id, unsigned int size, unsigned char *data,
-             char mode, void(*callback)(char*,void*), void * obj):
-      out,in,read,waitʤɤΥޥɤCOMMAND塼ί롣ǡ
-      륳ޥ(in,read,wait)ΤȤϼäȤ˥ǡ
-      ǼREPLY¤Τ롣
+  static int
+  psx_queue (unsigned int tspace_id, unsigned int id,
+             unsigned int size, unsigned char *data, char mode,
+             void(*callback)(char*,void*), void * obj):
+      out,in,read,waitなどのコマンドをCOMMANDキューに溜める。データを
+      受信するコマンド(in,read,wait)のときは受け取ったときにデータを
+      格納するREPLY構造体を作る。
 
-  :
-      id       - TUPLE SpaceID
-      size     - dataΥ
-      data     - ǡNULL
-      mode     - ޥɤΥ⡼(out,in,read,wait ϳơchar: o,i,r,w)
-      callback - ХåѤδؿؤΥݥ󥿡
-                 ѤʤNULL
-      obj      - ХåѤؿ˰Ϥǡ
-  ֤:
-       - mallocREPLY¤ΤؤΥݥ󥿡outξ
-                     0֤롣
-      Ԥ - FAIL(-1)֤롣
+  引き数:
+      tspace_id- 送信先タプルスペースのID
+      id       - アクセスするTUPLE SpaceのID
+      size     - dataのサイズ
+      data     - 送信するデータ。受信時はNULL。
+      mode     - コマンドのモード(out,in,read,wait は各々char型: o,i,r,w)
+      callback - コールバックを使用する場合の関数へのポインタ。
+                 使用しない場合はNULL。
+      obj      - コールバックで用いる関数に引き渡すデータ。
+  返り値:
+      成功した場合 - mallocしたREPLY構造体へのポインタ。outの場合は
+                     0が返る。
+      失敗した場合 - FAIL(-1)が返る。
 /-------------------------------------------------------------------*/
-int
-psx_queue(unsigned int id, unsigned int size, unsigned char *data, char mode,
-          void(*callback)(char *,void *), void * obj){
+static int
+psx_queue(unsigned int tspace_id, unsigned int id,
+          unsigned int size, unsigned char *data, char mode,
+          void(*callback)(unsigned char *,void *), void * obj){
     REPLY *p;
     COMMAND *c;
-
-    seq++;
-    if (qsize >= MAX_QUEUE){
+    
+    if (qsize >= MAX_QUEUE) {
 //        PSX_Debug(("max queue: qsize=%d",qsize));
         psx_sync_n();
     }
-
-    for(p=reply;p;p=p->next){
-        if(p->seq == seq){
-            printf("same seq number: %d\n",seq);
-        }
-    }
-
-    if (q_top == NULL){
+    
+    if (q_top == NULL) {
         if ((q_top = (COMMAND *) malloc (sizeof(COMMAND))) == NULL){
             return(FAIL);
         }
@@ -439,15 +493,16 @@
         c = q_end;
         q_end = q_end->next;
     }
-
-    // size  DATASIZE
-    if ((q_end->command = (unsigned char *) malloc(size+LINDA_HEADER_SIZE)) == NULL){
-        free(q_end);
+    
+    /* size は DATASIZE */
+    if ((q_end->command = (unsigned char *) malloc(size+LINDA_HEADER_SIZE)) == NULL) {
+        psx_free(q_end);
         c->next = NULL;
         return(FAIL);
     }
 
-    if (mode != 'o'){
+    /* データ受け取り要求(in,rd,wait)なら受け取り用の箱を用意 */
+    if (mode != 'o') {  
         if (reply == NULL){
             if ((reply = (REPLY *) malloc (sizeof(REPLY))) == NULL){
                 return(FAIL);
@@ -460,12 +515,12 @@
             p = r_end->next; r_end = p; p->next = NULL;
         }
         p->mode = '?';
-        p->seq = (int)p;  // ¤ΤΥɥ쥹Ǽ
+        p->seq = (int)p;  // 構造体のアドレスで識別
         p->callback = callback;
         p->obj = obj;
         PSX_Debug(("psx_queue: seq %d reply %x p %x r_end %x",seq,reply,p,r_end));
-    }else{
-        p=0;
+    } else {
+        p = 0;
     }
     q_end->command[LINDA_MODE_OFFSET] = mode;
 
@@ -476,43 +531,48 @@
     q_end->command[LINDA_SEQ_OFFSET+1] = ((int)p>>16) & 0xff;
     q_end->command[LINDA_SEQ_OFFSET+2] = ((int)p>>8)  & 0xff;
     q_end->command[LINDA_SEQ_OFFSET+3] = ((int)p)     & 0xff;
-
+    
     q_end->command[LINDA_DATA_LENGTH_OFFSET]   = (size>>24) & 0xff;
     q_end->command[LINDA_DATA_LENGTH_OFFSET+1] = (size>>16) & 0xff;
     q_end->command[LINDA_DATA_LENGTH_OFFSET+2] = (size>>8)  & 0xff;
     q_end->command[LINDA_DATA_LENGTH_OFFSET+3] = (size)     & 0xff;
-
+    
     q_end->size = size+LINDA_HEADER_SIZE;       /* command size */
-    q_end->next = NULL; qsize++;
-    if (data && size>0) memcpy(q_end->command+LINDA_HEADER_SIZE, data, size);
+    q_end->tspace_id = tspace_id;  /* destination id */
+    q_end->next = NULL;
+    qsize++;
+    if (data && size>0)
+        memcpy(q_end->command+LINDA_HEADER_SIZE, data, size);
     return((int)p);
 }
 
 /*-------------------------------------------------------------------/
-  void
-  unix_chkserv ():
-      Фǡ(TUPLE)롣REPLY¤Τ˥Хåؿ
-      ꤵƤФδؿ¹ԤREPLY¤Τ򥭥塼
-      ХåؿꤵƤʤREPLY¤Τ˥ǡ
-      Ϥ
+  static void
+  unix_chkserv (int ps):
+      サーバからデータ(TUPLE)を受け取る。REPLY構造体にコールバック関数
+      が指定されていればその関数を実行し、REPLY構造体をキューから取り
+      除く。コールバック関数が指定されていなければREPLY構造体にデータ
+      を引き渡す。
+  引数:
+      ps - 接続しているタプルスペースのソケット
 /-------------------------------------------------------------------*/
-void
-unix_chkserv(){
-    int i,k,pkt,npkt;
+static void
+unix_chkserv(int ps){
+    int i,pkt,npkt,mode;
+    unsigned int k;
     REPLY *r,*prev;
     int a;
     unsigned char * tuple = 0;
 
     if((i=read(ps,&npkt,INT_SIZE))<0) {
-        fprintf(stderr, "size read error! on fd:%d %s\n", ps,
-                strerror(errno));
+		perror("read");
         exit(1);
     }
     pkt = ntohl(npkt);
     DEB(printf("pkt: %d\n",pkt));
     DEB(fprintf(stdout, "psx_chkserv: queue number: %d , size = %d\n", i, pkt));
     if((tuple = (unsigned char *)malloc(pkt))==NULL){
-        fprintf(stderr,"allocate error! errno :%d %s",errno,strerror(errno));
+		perror("malloc");
         exit(1);
     }
     for(a=0;a<pkt;a+=i) {
@@ -526,24 +586,21 @@
 #ifdef COUNT_PACKET
     count_packet('r');
 #endif
-
-    i = tuple[LINDA_ID_OFFSET] * 256 + tuple[LINDA_ID_OFFSET+1];  /* id */
-    k = (tuple[LINDA_SEQ_OFFSET]  <<24) +
-        (tuple[LINDA_SEQ_OFFSET+1]<<16) +
-        (tuple[LINDA_SEQ_OFFSET+2]<<8)  +
-        (tuple[LINDA_SEQ_OFFSET+3]);  /* seq */
-    PSX_Debug(("psx_chkserv: anser packet size = %d id %d seq %d", pkt,i,k));
+    mode = psx_get_mode(tuple);
+    i = psx_get_id(tuple);
+    k = psx_get_seq(tuple);
+    PSX_Debug(("psx_chkserv: anser packet size = %d id %d seq %d", pkt,i,k)); 
     DEB(fprintf(stdout, "psx_chkserv: data from server: %s id=%d seq = %d\n", tuple, i, k));
     DEB (
         for(p=reply;p;p=p->next) {
         PSX_Debug(printf("psx_queue dump: seq %d mode %c %x %x",p->seq,p->mode,p,p->next));
         })
-
+        
     for(prev = NULL,r = reply; r; prev = r,r = r->next){
         DEB(fprintf(stdout,"seq: %d\n",r->seq);)
-	if (r->seq == (unsigned int)k){
+        if (r->seq == k){
             if(r->callback){     // call callback function
-                (*r->callback)((char *)tuple,r->obj);
+                (*r->callback)(tuple,r->obj);
                 if (prev == NULL){
                     reply = r->next;
                     if(r == r_end) {
@@ -555,11 +612,15 @@
                         r_end = prev;
                     }
                 }
-                free(r);
+                psx_free(r);
             }else{                // normal reply
                 PSX_Debug(("psx_chkserv: copy answer r %x seq %d",r,k));
-                r->answer = tuple;
-                r->mode = '!';
+                if(mode == 'a'){
+		    r->answer = tuple;
+		}else{
+		    r->answer = NULL;
+		}
+		r->mode = '!';
             }
             break;
         }
@@ -570,29 +631,28 @@
     }
 }
 
-void psx_free(char * tuple)
+void psx_free(void *tuple)
 {
-//    free(tuple - LINDA_HEADER_SIZE);
     free(tuple);
 }
 
 /*-------------------------------------------------------------------/
-  int
+  static unsigned int
   get_int(unsigned char * tuple, int offset):
-      TUPLEΥإå˳Ǽ줿 int Υǡ뤿δؿ
-      psx_get_datalength()  psx_get_seq() ƤФ롣
+      TUPLEのヘッダに格納された int型 のデータを得るための関数
+      psx_get_datalength() と psx_get_seq() から呼ばれる。
 
-  :
-      tuple  - إåޤTUPLEpsx_reply()ΤǤ⤤
-      offset - ǡΥեåȡLINDA_DATA_LENGTH_OFFSET
-                LINDA_SEQ_OFFSET
+  引き数:
+      tuple  - ヘッダ情報も含んだTUPLE。psx_reply()で得たものでもいい。
+      offset - 取りだすデータのオフセット。LINDA_DATA_LENGTH_OFFSET
+               か LINDA_SEQ_OFFSET。
 
-  ֤:
-      ꤷեåȤ˳ǼƤ(int)
+  返り値:
+      指定したオフセットに格納されていた数値(int型)
 /-------------------------------------------------------------------*/
-static
-int get_int(unsigned char * tuple, int offset){
-    int i;
+static unsigned int
+get_int(unsigned char * tuple, int offset){
+    unsigned int i;
     i = (tuple[offset]  <<24) +
         (tuple[offset+1]<<16) +
         (tuple[offset+2]<<8)  +
@@ -600,28 +660,62 @@
     return i;
 }
 
-int psx_get_datalength(unsigned char * tuple){
+unsigned int
+psx_get_datalength(unsigned char * tuple){
     return get_int(tuple,LINDA_DATA_LENGTH_OFFSET);
 }
 
-unsigned char *psx_get_data(unsigned char * tuple){
-    return tuple+LINDA_HEADER_SIZE;
+unsigned char *
+psx_get_data(unsigned char * tuple) {
+    return tuple + LINDA_HEADER_SIZE;
 }
 
-int psx_get_seq(unsigned char * tuple){
+unsigned int
+psx_get_seq(unsigned char * tuple){
     return get_int(tuple,LINDA_SEQ_OFFSET);
 }
 
-short psx_get_id(unsigned char * tuple){
-    short s;
-    s = tuple[LINDA_ID_OFFSET] * 256 +
-        tuple[LINDA_ID_OFFSET+1];
-    return s;
+unsigned short
+psx_get_id(unsigned char * tuple){
+    return (tuple[LINDA_ID_OFFSET] * 256 + tuple[LINDA_ID_OFFSET+1]);
 }
 
-char psx_get_mode(unsigned char * tuple){
+unsigned char
+psx_get_mode(unsigned char * tuple){
     return tuple[LINDA_MODE_OFFSET];
 }
 
+static
+void
+set_int_to_char(unsigned char * tuple, int i, int offset){
+    tuple[offset]   = (i>>24) & 0xff;
+    tuple[offset+1] = (i>>16) & 0xff;
+    tuple[offset+2] = (i>>8)  & 0xff;
+    tuple[offset+3] = (i)     & 0xff;
+}
+
+void
+psx_set_datalength(unsigned char * tuple, int length){
+    set_int_to_char(tuple,length,LINDA_DATA_LENGTH_OFFSET);
+}
+
+
+void
+psx_set_seq(unsigned char * tuple, int seq){
+    set_int_to_char(tuple,seq,LINDA_SEQ_OFFSET);
+}
+
+void
+psx_set_id(unsigned char * tuple, short id){
+    tuple[LINDA_ID_OFFSET]   = id >> 8;
+    tuple[LINDA_ID_OFFSET+1] = id & 0xff;
+}
+
+void
+psx_set_mode(unsigned char * tuple, char mode){
+    tuple[LINDA_MODE_OFFSET] = mode;
+}
+
+
 
 /* end */
--- a/Renderer/Engine/viewer.cc	Fri Oct 23 00:16:38 2009 +0900
+++ b/Renderer/Engine/viewer.cc	Fri Oct 23 00:40:24 2009 +0900
@@ -101,7 +101,7 @@
     frames     = 0;
 
     sgroot = new SceneGraphRoot(this->width, this->height);
-    sgroot->tmanger = this;
+    sgroot->tmanager = manager;
 
     MainLoop *mainloop = app->init(this, this->width, this->height);