annotate Renderer/Engine/lindaapi.cc @ 1002:c79651141045

many changes.
author koba <koba@cr.ie.u-ryukyu.ac.jp>
date Sun, 24 Oct 2010 19:00:47 +0900
parents 1a5de2a29987
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
1 // $Id$
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 /*----------------------------------------------------------------------
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
5 インクルードファイル読み込み
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 ----------------------------------------------------------------------*/
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 #include <stdio.h>
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 #include <string.h>
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
9 #include <stdlib.h>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
10 #include <sys/time.h>
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 #include <unistd.h>
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
12 #include <netinet/in.h>
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 #include <sys/select.h>
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
14 #include <netdb.h>
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 #include <netinet/tcp.h>
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
16 #include <sys/un.h>
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 #include <errno.h>
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
18
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
19 #include <sys/types.h>
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
20 #include <sys/socket.h>
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
21 #include <arpa/inet.h>
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 #include "lindaapi.h"
606
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
24
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
25
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 #if 0
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 #define PSX_Debug(deb) (putchar(PS_DEB)),\
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 (printf deb ),\
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 (putchar(PS_DEB))
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
30 #define DEB(a)
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 #else
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
32 #define PSX_Debug(deb)
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 #define DEB(a) /* a */
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 #endif
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
36 /* Global Variables */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
37 static COMMAND *q_top, *q_end; /* コマンドキュー */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
38 static REPLY *reply, *r_end; /* 受け取り用キュー */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
39 static int qsize; /* コマンドキューのサイズ */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
40 static fd_set g_fds; /* 接続しているタプルスペース群のFD(FileDiscripter)を保持 */
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
41 static int g_max_fds; /* 監視するFDの最大値 */
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
43 /* Static Functions */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
44 static void unix_chkserv(int ps);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
45 void psx_free(void *);
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
46 static int psx_queue(unsigned int tspace_id, unsigned int id,
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
47 unsigned int size, unsigned char *data, char mode,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
48 void(*callback)(unsigned char *,void *),void * obj);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 #ifdef COUNT_PACKET
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 // print packet count message per PRINT_INTERVAL sec
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 #define PRINT_INTERVAL 4
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
53 static void count_packet(char type);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 /*-------------------------------------------------------------------/
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
56 static void
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 count_packet (char type):
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
58 パケットの送受信カウントする
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
60 引き数:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
61 type - 送信、受信 (char型: s,r)
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 /-------------------------------------------------------------------*/
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
63 static void
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
64 count_packet(char type)
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 static int send_packet=-1,receive_packet=0;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 static struct timeval start,now,previous;
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
68
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 if (out_packet == -1) {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 gettimeofday(&start,NULL);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 gettimeofday(&previous,NULL);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 send_packet = 0;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 printf("packet\tout\tread\t\ttime\n");
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 }
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
75
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 if (type == 's') {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 send_packet++;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 } else if (type == 'r') {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 receive_packet++;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 } else {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 fprintf(stderr,"No type in count_packet function\n");
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 return;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 }
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
84
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 gettimeofday(&now,NULL);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 if ((now.tv_sec-previous.tv_sec) > PRINT_INTERVAL) {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 printf("log\t%d\t%d\t%ld\n",
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 send_packet,receive_packet,now.tv_sec-start.tv_sec);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 fflush(stdout);
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
90
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 previous.tv_sec = now.tv_sec;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 send_packet = receive_packet = 0;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 #endif
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 #define unix_read_w read
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
99
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
100 #if 0
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
101 /*-------------------------------------------------------------------/
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
102 static int
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
103 unix_write (int fd, unsigned char *buf, unsigned int size):
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
104 サーバへTUPLEを送る。
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
105
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
106 引き数:
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
107 fd - サーバのファイルディスクリプタ
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
108 buf - サーバへ送るデータ(TUPLEヘッダ含む)
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
109 size - bufのbyte数
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
110 返り値:
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
111 送った(書きこんだ)データのbyte数
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
112 /-------------------------------------------------------------------*/
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
113 static int
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
114 unix_write_bak(int fd,unsigned char *buf,unsigned int size) {
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
115 int i,nsize;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
116 nsize = htonl(size);
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
117 i = write(fd,&nsize,INT_SIZE);
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
118 i += write(fd,buf,size); // size == datasize + LINDA_HEADER_SIZE
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
119 #ifdef COUNT_PACKET
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
120 count_packet('s');
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
121 #endif
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
122 return(i);
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
123 }
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
124 #endif
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
125
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
126 static int
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
127 unix_write(int fd,unsigned char *buf,unsigned int size) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
128 unsigned int count=0;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
129 uint32_t nsize;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
131 /* これから送信するデータのサイズをまず送信 */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
132 nsize = htonl(size);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
133 write(fd, &nsize, INT_SIZE);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
134
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
135 /* 目的のデータを送信 */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
136 while (count < size) {
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
137 count += write(fd, buf+count, size-count);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 #ifdef COUNT_PACKET
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 count_packet('s');
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 #endif
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
142 return count+INT_SIZE;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 #define unix_write_w unix_write
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 #define SERV_NAME unix_port
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 #define PROTO_NAME "tcp"
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 #define SERVER_NAME hostname
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 #define MAX_REQ 16
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
152
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
153
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
154 /*-------------------------------------------------------------------/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
155 void
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
156 init_linda():
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
157 大域変数の初期化等を行なう
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
158 /-------------------------------------------------------------------*/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
159 void
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
160 init_linda() {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
161 FD_ZERO(&g_fds);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
162 /* 大域変数はゼロクリアされる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
163 g_max_fds = 0;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
164 q_end = q_top = NULL;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
165 r_end = reply = NULL;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
166 qsize = 0;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
167 */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
168 }
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
170 struct addrinfo *gethostaddrinfo(const char *host, int port) {
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
171 struct addrinfo hints;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
172 hints.ai_protocol = 0;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
173 hints.ai_addrlen = 0;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
174 hints.ai_addr = NULL;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
175 hints.ai_canonname = NULL;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
176 hints.ai_next = NULL;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
177 hints.ai_family = PF_UNSPEC;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
178 hints.ai_socktype = SOCK_STREAM;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
179 hints.ai_flags = AI_PASSIVE;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
180 struct addrinfo *res0;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
181 char portbuf[6];
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
182 sprintf(portbuf, "%d", port);
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
183 int error = getaddrinfo(host, portbuf, &hints, &res0);
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
184 if (error) {
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
185 fprintf(stderr, "error: getaddrinfo (%d)\n", error);
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
186 }
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
187 return res0;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
188 }
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
189
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
190
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 /*-------------------------------------------------------------------/
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 int
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
194 open_linda (char * hostname, int port):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
195 Lindaサーバとのコネクションを確立し、タプルスペースのIDを返す。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
196 現在はファイルディスクリプタを返している。
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
198 引き数:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
199 hostname - サーバのホスト名
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
200 port - サーバのポート番号
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
201 返り値:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
202 コネクション確立が成功するとそのファイルディスクリプタを返す。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
203 失敗すると -1 を返す。
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 /-------------------------------------------------------------------*/
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 int
843
0c7d885f0c92 cleanup unused variables and fix warning.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 841
diff changeset
206 open_linda(const char *hostname, int port){
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
207 int fd;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
208 struct hostent *hoste;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
209 struct sockaddr_in serv_addr;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
210 struct sockaddr_un serv_addr_un;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
211
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 if (hostname[0]=='/') {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 /* Unix domain */
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == FAIL){
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
215 perror("socket");
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 return(-1);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 serv_addr_un.sun_family = AF_UNIX;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 strcpy(serv_addr_un.sun_path, hostname);
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
220 fprintf(stdout,"connecting ... %d\n", serv_addr.sin_port);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 if (connect(fd, (struct sockaddr *)&serv_addr_un,sizeof(serv_addr_un)) == FAIL){
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
222 perror("connect");
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 close(fd);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 return(-1);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 }
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
226
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 } else {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 /* INET domain */
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == FAIL){
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
230 perror("socket");
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 return(-1);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 }
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
233 if ((hoste = gethostbyname(SERVER_NAME)) == NULL){
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 fprintf(stderr,"hostname error\n");
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 close(fd);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 return(-1);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 serv_addr.sin_family = AF_INET;
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
239 serv_addr.sin_port = port;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 serv_addr.sin_addr.s_addr = ((struct in_addr *)(hoste->h_addr))->s_addr;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 if (serv_addr.sin_family == AF_INET) {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 int tmp = 1;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY,
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 (char *) &tmp, sizeof (int));
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 }
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
246 fprintf(stdout,"connecting ... %d\n", serv_addr.sin_port);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 if (connect(fd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)) == FAIL){
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 fprintf(stderr,"connection error! errno :%d %s\n", errno,
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 strerror(errno));
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 close(fd);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 return(-1);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
255 FD_SET(fd, &g_fds);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
256 if (g_max_fds < fd) g_max_fds = fd;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
257
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 fprintf(stdout," connect middle server %d\n", fd);
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
259 return fd;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
260 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
261
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
262 int
843
0c7d885f0c92 cleanup unused variables and fix warning.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 841
diff changeset
263 open_linda_java(const char *hostname, int port){
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
264 int fd;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
265 struct hostent *hoste;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
266 struct sockaddr_in serv_addr;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
267 struct sockaddr_un serv_addr_un;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
268
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
269 if (hostname[0]=='/') {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
270 /* Unix domain */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
271 if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == FAIL){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
272 perror("socket");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
273 return(-1);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
274 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
275 serv_addr_un.sun_family = AF_UNIX;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
276 strcpy(serv_addr_un.sun_path, hostname);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
277 DEB(fprintf(stdout,"connecting ... %d\n", serv_addr.sin_port));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
278 if (connect(fd, (struct sockaddr *)&serv_addr_un,sizeof(serv_addr_un)) == FAIL){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
279 perror("connect");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
280 close(fd);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
281 return(-1);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
282 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
283
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
284 } else {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
285 /* INET domain */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
286 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == FAIL){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
287 perror("socket");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
288 return(-2);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
289 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
290 serv_addr.sin_family = AF_INET;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
291 serv_addr.sin_port = htons(port);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
292
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
293 serv_addr.sin_addr.s_addr = inet_addr(hostname);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
294 if (serv_addr.sin_addr.s_addr == 0xffffffff) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
295 if ((hoste = gethostbyname(hostname)) == NULL){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
296 fprintf(stdout, "hostname error\n");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
297 close(fd);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
298 return(-1);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
299 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
300 serv_addr.sin_addr.s_addr = *(unsigned int *)hoste->h_addr_list[0];
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
301 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
302
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
303 if (serv_addr.sin_family == AF_INET) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
304 int tmp = 1;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
305 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
306 (char *) &tmp, sizeof (int));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
307 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
308 DEB(fprintf(stdout,"connecting ... %d \n", ntohs(serv_addr.sin_port)));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
309 DEB(fprintf(stdout," serv_addr.sin_port ... %d \n", ntohs(serv_addr.sin_port)));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
310 //fprintf(stdout," serv_addr.sin_addr.s_addr... %s\n", serv_addr.sin_addr.s_addr);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
311 if (connect(fd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)) == FAIL){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
312 perror("connect");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
313 close(fd);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
314 return(-4);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
315 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
316 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
317
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
318 FD_SET(fd, &g_fds);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
319 if (g_max_fds < fd) g_max_fds = fd;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
320
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
321 DEB(fprintf(stdout," connect middle server %d\n", fd));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
322 return fd;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
323 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
324
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
325
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
326 /*-------------------------------------------------------------------/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
327 int
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
328 close_linda(int tspace_id):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
329 接続しているタプルスペースへの接続を切る。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
330 ソケットを閉じ、g_fds から外す。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
331 引数:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
332 tspace_id - 閉じるタプルスペースのID
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
333 返り値:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
334 close の値
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
335 /-------------------------------------------------------------------*/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
336 int
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
337 close_linda(int tspace_id){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
338 int retval;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
339 int i;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
340 if ((retval = close(tspace_id)) == 0) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
341 FD_CLR(tspace_id, &g_fds);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
342 if (g_max_fds == tspace_id) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
343 for (i = g_max_fds-1; FD_ISSET(i, &g_fds) && i; i--);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
344 g_max_fds = i;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
345 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
346 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
347 return retval;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
349
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 /*-------------------------------------------------------------------/
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 int
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
352 psx_out (unsigned int tspace_id, unsigned int id,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
353 unsigned char *data, unsigned int size):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
354 outコマンドをCOMMANDキューへ溜める。
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
355
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
356 引き数:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
357 tspace_id - タプルスペースのID
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
358 id - タプルのID
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
359 data - 送信するデータ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
360 size - dataのサイズ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
361 返り値:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
362 シーケンス番号
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 /-------------------------------------------------------------------*/
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
364 int
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
365 psx_out(unsigned int tspace_id, unsigned int id,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
366 unsigned char *data, unsigned int size){
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
367 int r;
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
368 if ((r = psx_queue(tspace_id, id, size, data, 'o', NULL, NULL)) == FAIL) {
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
369 return(FAIL);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
370 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 DEB( fprintf(stdout, "psx_out: size = %d, command = %s\n",
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 q_end->size, q_end->command+LINDA_HEADER_SIZE));
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
373 return(r);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
375
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
376 extern int psx_callback_update(unsigned int tspace_id, unsigned int id,
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
377 unsigned char *data, unsigned int size,
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
378 void(*callback)(unsigned char *,void *),void * obj) {
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
379 int r;
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
380 if ((r = psx_queue(tspace_id, id, size, data, 'u', callback, obj)) == FAIL) {
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
381 return(FAIL);
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
382 }
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
383 DEB( fprintf(stdout, "psx_update: size = %d, command = %s\n",
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
384 q_end->size, q_end->command+LINDA_HEADER_SIZE));
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
385 return(r);
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
386 }
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
387
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
388 /*-------------------------------------------------------------------/
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 int
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
390 psx_ld (unsigned tspace_id, unsigned int id,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
391 char mode, void(*callback)(char*,void*), void * obj):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
392 in,read,waitなどの受信コマンドをCOMMANDキューへ溜める。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
393 psx_in,psx_rd,psx_wait_rdなどに置き換えられている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
394
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
395 引き数:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
396 tspace_id- タプルスペースのID
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
397 id - タプルのID
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
398 mode - i,r,w の文字を取り、各々in,read,waitを表している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
399 callback - コールバックを使用する場合の関数へのポインタ。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
400 使用しない場合はNULLをいれる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
401 obj - コールバックで用いる関数の引き数。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
402 返り値:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
403 psx_queue内でmallocされたREPLY構造体へのポインタ
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
404 /-------------------------------------------------------------------*/
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
405 int
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
406 psx_ld(unsigned int tspace_id, unsigned int id,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
407 char mode, void(*callback)(unsigned char *,void *), void * obj){
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
408 int r;
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
409 if ((r = psx_queue(tspace_id, id, 0, NULL, mode, callback, obj)) == FAIL) {
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 return(FAIL);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
412 return(r);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
413 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
414
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 /*-------------------------------------------------------------------/
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
416 unsigned char *
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 psx_reply (int seq):
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
418 サーバから答えが来たデータを返す。
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
419
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
420 引き数:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
421 seq - psx_ld()が返した値。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
422 返り値:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
423 seqに対応したデータを返す。データをまだ受信していない場合は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
424 NULLを返す。
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
425 /-------------------------------------------------------------------*/
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
426 unsigned char *
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
427 psx_reply(unsigned int seq){
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
428 REPLY *p, *q;
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
429 unsigned char *ans;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
430
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 DEB(fprintf(stdout, "psx_reply: search of seq = %d\n", seq));
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
432 PSX_Debug(("psx_reply: seq %x\n", seq));
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
433 for(q = NULL,p = reply; p; q = p,p = p->next){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
434 if (p->seq == seq){
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
435 DEB(fprintf(stdout, "psx_reply: match of seq = %d\n", seq));
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
436 if (p->mode == '!'){
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
437 ans = p->answer;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 if (q == NULL){
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
439 reply = p->next;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 if(p==r_end) {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 r_end = p->next;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
443 } else {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
444 q->next = p->next;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
445 if(p==r_end) {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
446 r_end = q;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
447 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 }
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
449 PSX_Debug(("psx_reply: reply %p r_end %p p %p q %p\n",reply,r_end,p,q));
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
450 psx_free(p);
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
451 DEB( for(p=reply;p;p=p->next) { PSX_Debug(("psx_queue dump: seq %d mode %c %x %x\n",p->seq,p->mode,p,p->next))});
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 DEB( fprintf(stdout, "psx_reply: returned answer = %s\n", ans));
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
453 PSX_Debug(("psx_reply: answer %s\n",ans));
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
454 return(ans);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
455 } else {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 if (p->mode == '?'){
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 DEB(fprintf(stdout, "psx_reply: don't accept anser\n"));
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 return(NULL);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
459 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
460 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
461 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
462
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
463 }
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
464 PSX_Debug(("psx_reply: no match seq %d\n",seq));
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
465 DEB(fprintf(stdout, "psx_reply: no match of seq\n"));
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 return(NULL);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
468
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
469 /*-------------------------------------------------------------------/
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
470 void
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
471 psx_sync_n ():
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
472 サーバとデータの送受信をする。COMMANDキューに溜まったデータを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
473 送信し、サーバから送られて来たデータを対応するREPLYへいれる。
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
474 /-------------------------------------------------------------------*/
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
475 #define TIMEDELTA 10
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
476
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 void
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
478 psx_sync_n() {
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
479 psx_sync_n_timeout(TIMEDELTA);
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
480 }
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
481
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
482 void
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
483 psx_sync_n_timeout(int time) {
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
484 int acount;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
485 COMMAND *c, *t;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
486
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
487 fd_set tmp;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
488 struct timeval timeout;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
489 timeout.tv_sec=0;
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
490 timeout.tv_usec=time * 1000;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
491
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
492 acount = 0;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 while (q_top != NULL){
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
494 c = q_top;
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
495 unix_write_w(c->tspace_id, c->command, c->size);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
496 psx_free(c->command);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
497 t = c->next;
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
498 psx_free(c);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
499 q_top = c = t;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
500 qsize--;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
501 }
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
502
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
503 tmp = g_fds;
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
504 while(select((unsigned int)g_max_fds+1, &tmp, NULL, NULL, &timeout) > 0) {
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
505 unsigned int i;
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
506 for (i = 0; i < (unsigned int)g_max_fds+1; i++) {
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
507 if (FD_ISSET(i, &tmp)) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
508 unix_chkserv(i);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
509 }
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 }
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
511 }
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
513
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
514 /*-------------------------------------------------------------------/
606
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
515 static int
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
516 psx_queue (unsigned int tspace_id, unsigned int id,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
517 unsigned int size, unsigned char *data, char mode,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
518 void(*callback)(char*,void*), void * obj):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
519 out,in,read,waitなどのコマンドをCOMMANDキューに溜める。データを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
520 受信するコマンド(in,read,wait)のときは受け取ったときにデータを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
521 格納するREPLY構造体を作る。
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
522
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
523 引き数:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
524 tspace_id- 送信先タプルスペースのID
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
525 id - アクセスするTUPLE SpaceのID
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
526 size - dataのサイズ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
527 data - 送信するデータ。受信時はNULL。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
528 mode - コマンドのモード(out,in,read,wait は各々char型: o,i,r,w)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
529 callback - コールバックを使用する場合の関数へのポインタ。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
530 使用しない場合はNULL。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
531 obj - コールバックで用いる関数に引き渡すデータ。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
532 返り値:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
533 成功した場合 - mallocしたREPLY構造体へのポインタ。outの場合は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
534 0が返る。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
535 失敗した場合 - FAIL(-1)が返る。
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
536 /-------------------------------------------------------------------*/
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
537 static int
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
538 psx_queue(unsigned int tspace_id, unsigned int id,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
539 unsigned int size, unsigned char *data, char mode,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
540 void(*callback)(unsigned char *,void *), void * obj){
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
541 REPLY *p;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
542 COMMAND *c;
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
543
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
544 if (qsize >= MAX_QUEUE) {
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
545 // PSX_Debug(("max queue: qsize=%d",qsize));
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
546 psx_sync_n();
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
547 }
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
548
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
549 if (q_top == NULL) {
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
550 if ((q_top = (COMMAND *) malloc (sizeof(COMMAND))) == NULL){
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
551 return(FAIL);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
552 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
553 c = q_end = q_top;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
554 } else {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
555 if ((q_end->next = (COMMAND *) malloc (sizeof(COMMAND))) == NULL){
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
556 return(FAIL);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
557 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
558 c = q_end;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
559 q_end = q_end->next;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
560 }
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
561
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
562 /* size は DATASIZE */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
563 if ((q_end->command = (unsigned char *) malloc(size+LINDA_HEADER_SIZE)) == NULL) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
564 psx_free(q_end);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
565 c->next = NULL;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
566 return(FAIL);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
567 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
568
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
569 /* データ受け取り要求(in,rd,wait)なら受け取り用の箱を用意 */
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
570 if (mode != 'o') {
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
571 if (reply == NULL){
606
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
572 if ((reply = (REPLY *) malloc (sizeof(REPLY))) == NULL){
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
573 return(FAIL);
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
574 }
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
575 p = r_end = reply; p->next = NULL;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
576 } else {
606
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
577 if ((r_end->next = (REPLY *) malloc (sizeof(REPLY))) == NULL){
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
578 return(FAIL);
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
579 }
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 p = r_end->next; r_end = p; p->next = NULL;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
581 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
582 p->mode = '?';
846
dbcfa04ee4db fix 64bit mode
tkaito
parents: 843
diff changeset
583 p->seq = (unsigned long)p; // 構造体のアドレスで識別
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
584 p->callback = callback;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
585 p->obj = obj;
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
586 PSX_Debug(("psx_queue: seq %d reply %p p %p r_end %p\n",p->seq,reply,p,r_end));
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
587 } else {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
588 p = 0;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
589 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
590 q_end->command[LINDA_MODE_OFFSET] = mode;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
591
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
592 q_end->command[LINDA_ID_OFFSET] = id >> 8;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
593 q_end->command[LINDA_ID_OFFSET+1] = id & 0xff;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
594
846
dbcfa04ee4db fix 64bit mode
tkaito
parents: 843
diff changeset
595 q_end->command[LINDA_SEQ_OFFSET] = ((unsigned long)p>>24) & 0xff;
dbcfa04ee4db fix 64bit mode
tkaito
parents: 843
diff changeset
596 q_end->command[LINDA_SEQ_OFFSET+1] = ((unsigned long)p>>16) & 0xff;
dbcfa04ee4db fix 64bit mode
tkaito
parents: 843
diff changeset
597 q_end->command[LINDA_SEQ_OFFSET+2] = ((unsigned long)p>>8) & 0xff;
dbcfa04ee4db fix 64bit mode
tkaito
parents: 843
diff changeset
598 q_end->command[LINDA_SEQ_OFFSET+3] = ((unsigned long)p) & 0xff;
606
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
599
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
600 q_end->command[LINDA_DATA_LENGTH_OFFSET] = (size>>24) & 0xff;
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
601 q_end->command[LINDA_DATA_LENGTH_OFFSET+1] = (size>>16) & 0xff;
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
602 q_end->command[LINDA_DATA_LENGTH_OFFSET+2] = (size>>8) & 0xff;
32a7260fad2f 32bit/64bit ABI (64 bit is not tested yet).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 605
diff changeset
603 q_end->command[LINDA_DATA_LENGTH_OFFSET+3] = (size) & 0xff;
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
604
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
605 q_end->size = size+LINDA_HEADER_SIZE; /* command size */
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
606 q_end->tspace_id = tspace_id; /* destination id */
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
607 q_end->next = NULL;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
608 qsize++;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
609 if (data && size>0)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
610 memcpy(q_end->command+LINDA_HEADER_SIZE, data, size);
846
dbcfa04ee4db fix 64bit mode
tkaito
parents: 843
diff changeset
611 return((unsigned long)p);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
612 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
613
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
614 /*-------------------------------------------------------------------/
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
615 static void
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
616 unix_chkserv (int ps):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
617 サーバからデータ(TUPLE)を受け取る。REPLY構造体にコールバック関数
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
618 が指定されていればその関数を実行し、REPLY構造体をキューから取り
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
619 除く。コールバック関数が指定されていなければREPLY構造体にデータ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
620 を引き渡す。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
621 引数:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
622 ps - 接続しているタプルスペースのソケット
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
623 /-------------------------------------------------------------------*/
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
624 static void
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
625 unix_chkserv(int ps){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
626 int i,pkt,npkt,mode;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
627 REPLY *r,*prev;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
628 int a;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
629 unsigned char * tuple = 0;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
630
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
631 if((i=read(ps,&npkt,INT_SIZE))<0) {
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
632 perror("read");
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
633 exit(1);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
634 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
635 pkt = ntohl(npkt);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
636 DEB(printf("pkt: %d\n",pkt));
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
637 DEB(fprintf(stdout, "psx_chkserv: queue number: %d , size = %d\n", i, pkt));
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
638 if((tuple = (unsigned char *)malloc(pkt))==NULL){
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
639 perror("malloc");
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
640 exit(1);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
641 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
642 for(a=0;a<pkt;a+=i) {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
643 if((i=unix_read_w(ps,tuple+a,pkt-a))<0) {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
644 fprintf(stderr, "psx_chkserv: read error! on i=%d pkt=%d %s\n",
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
645 i, pkt, strerror(errno));
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
646 exit(1);//close(ps);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
647 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
648 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
649
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
650 #ifdef COUNT_PACKET
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
651 count_packet('r');
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
652 #endif
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
653 mode = psx_get_mode(tuple);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
654 i = psx_get_id(tuple);
841
2432c7fe291c dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
655 unsigned int k = psx_get_seq(tuple);
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
656 PSX_Debug(("psx_chkserv: anser packet size = %d id %d seq %d\n", pkt,i,k));
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
657 DEB(fprintf(stdout, "psx_chkserv: data from server: %s id=%d seq = %d\n", tuple, i, k));
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
658 DEB (
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
659 for(p=reply;p;p=p->next) {
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
660 PSX_Debug(printf("psx_queue dump: seq %d mode %c %x %x\n",p->seq,p->mode,p,p->next));
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
661 })
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
662
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
663 for(prev = NULL,r = reply; r; prev = r,r = r->next){
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
664 DEB(fprintf(stdout,"seq: %d\n",r->seq);)
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
665 if (r->seq == k){
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
666 if(r->callback){ // call callback function
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
667 (*r->callback)(tuple,r->obj);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
668 if (prev == NULL){
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
669 reply = r->next;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
670 if(r == r_end) {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
671 r_end = r->next;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
672 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
673 } else {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
674 prev->next = r->next;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
675 if(r == r_end) {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
676 r_end = prev;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
677 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
678 }
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
679 psx_free(r);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
680 }else{ // normal reply
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
681 PSX_Debug(("psx_chkserv: copy answer r %p seq %d\n",r,k));
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
682 if(mode == 'a'){
919
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
683 r->answer = tuple;
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
684 }else{
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
685 r->answer = NULL;
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
686 }
1a5de2a29987 add linda_test
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents: 846
diff changeset
687 r->mode = '!';
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
688 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
689 break;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
690 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
691 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
692 tuple = 0;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
693 if (!r){
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
694 DEB(fprintf(stdout, "unix_chkserv: accepted seq %d does not match. \n",k));
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
695 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
696 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
697
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
698 void psx_free(void *tuple)
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
699 {
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
700 free(tuple);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
701 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
702
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
703 /*-------------------------------------------------------------------/
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
704 static unsigned int
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
705 get_int(unsigned char * tuple, int offset):
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
706 TUPLEのヘッダに格納された int型 のデータを得るための関数
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
707 psx_get_datalength() と psx_get_seq() から呼ばれる。
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
708
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
709 引き数:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
710 tuple - ヘッダ情報も含んだTUPLE。psx_reply()で得たものでもいい。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
711 offset - 取りだすデータのオフセット。LINDA_DATA_LENGTH_OFFSET
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
712 か LINDA_SEQ_OFFSET。
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
713
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
714 返り値:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
715 指定したオフセットに格納されていた数値(int型)
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
716 /-------------------------------------------------------------------*/
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
717 static unsigned int
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
718 get_int(unsigned char * tuple, int offset){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
719 unsigned int i;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
720 i = (tuple[offset] <<24) +
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
721 (tuple[offset+1]<<16) +
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
722 (tuple[offset+2]<<8) +
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
723 (tuple[offset+3]);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
724 return i;
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
725 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
726
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
727 unsigned int
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
728 psx_get_datalength(unsigned char * tuple){
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
729 return get_int(tuple,LINDA_DATA_LENGTH_OFFSET);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
730 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
731
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
732 unsigned char *
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
733 psx_get_data(unsigned char * tuple) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
734 return tuple + LINDA_HEADER_SIZE;
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
735 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
736
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
737 unsigned int
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
738 psx_get_seq(unsigned char * tuple){
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
739 return get_int(tuple,LINDA_SEQ_OFFSET);
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
740 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
741
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
742 unsigned short
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
743 psx_get_id(unsigned char * tuple){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
744 return (tuple[LINDA_ID_OFFSET] * 256 + tuple[LINDA_ID_OFFSET+1]);
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
745 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
746
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
747 unsigned char
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
748 psx_get_mode(unsigned char * tuple){
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
749 return tuple[LINDA_MODE_OFFSET];
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
750 }
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
751
572
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
752 static
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
753 void
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
754 set_int_to_char(unsigned char * tuple, int i, int offset){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
755 tuple[offset] = (i>>24) & 0xff;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
756 tuple[offset+1] = (i>>16) & 0xff;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
757 tuple[offset+2] = (i>>8) & 0xff;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
758 tuple[offset+3] = (i) & 0xff;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
759 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
760
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
761 void
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
762 psx_set_datalength(unsigned char * tuple, int length){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
763 set_int_to_char(tuple,length,LINDA_DATA_LENGTH_OFFSET);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
764 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
765
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
766
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
767 void
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
768 psx_set_seq(unsigned char * tuple, int seq){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
769 set_int_to_char(tuple,seq,LINDA_SEQ_OFFSET);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
770 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
771
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
772 void
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
773 psx_set_id(unsigned char * tuple, short id){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
774 tuple[LINDA_ID_OFFSET] = id >> 8;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
775 tuple[LINDA_ID_OFFSET+1] = id & 0xff;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
776 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
777
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
778 void
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
779 psx_set_mode(unsigned char * tuple, char mode){
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
780 tuple[LINDA_MODE_OFFSET] = mode;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
781 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
782
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
783
507
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
784
735f76483bb2 Reorganization..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
785 /* end */