# HG changeset patch # User Shinji KONO # Date 1256226024 -32400 # Node ID 27a826cb2551fa012110588f190705b01338858c # Parent 34c3be70b3f8d70e30dff65b5a1d753177cb455f merge diff -r 34c3be70b3f8 -r 27a826cb2551 Renderer/Engine/SceneGraphList.cc --- /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 +#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; +} diff -r 34c3be70b3f8 -r 27a826cb2551 Renderer/Engine/SceneGraphList.h --- /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 +#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 diff -r 34c3be70b3f8 -r 27a826cb2551 Renderer/Engine/SgStruct.h --- /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 diff -r 34c3be70b3f8 -r 27a826cb2551 Renderer/Engine/lindaapi.cc --- 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 #include -#include #include +#include +#include #include -#include -#include -#include +#include #include -#include #include #include -#include -#include +#include #include -#include -#include -#include +#include #include -#include +#include #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;ah_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;anext) { 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 */ diff -r 34c3be70b3f8 -r 27a826cb2551 Renderer/Engine/viewer.cc --- 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);