annotate src/parallel_execution/examples/socketQueue/LocalDGMQueue.cbc @ 1022:635ccc391642

Organize repository
author ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
date Thu, 31 Mar 2022 13:23:08 +0900
parents a9c630cc1c65
children 793b21a8ea12
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #include "../../../context.h"
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 #interface "TQueue.h"
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 #interface "Atomic.h"
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 #interface "FileString.h"
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 #interface "DataTransfer.h"
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 #impl "TQueue.h" as "LocalDGMQueue.h"
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 #include <sys/socket.h>
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 #include <netinet/in.h>
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 #include <arpa/inet.h>
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 #include <stdio.h>
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 #include <string.h>
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 #include <unistd.h>
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 #include <netdb.h>
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 #define BUF_SIZE 1024
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 /*
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 * Non-blocking queue of Paper: Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms(https://www.research.ibm.com/people/m/michael/podc-1996.pdf).
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 */
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
1012
a4e57a764cac sending struct
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1011
diff changeset
21 TQueue* createLocalDGMQueue(struct Context* context, char* sNum) {
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 struct TQueue* tQueue = new TQueue();
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 struct LocalDGMQueue* LocalDGMQueue = new LocalDGMQueue();
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 LocalDGMQueue->top = new Element(); // allocate a free node
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 LocalDGMQueue->top->next = NULL;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 LocalDGMQueue->last = LocalDGMQueue->top;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 LocalDGMQueue->atomic = createAtomicReference(context);
1022
635ccc391642 Organize repository
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1014
diff changeset
28 LocalDGMQueue->socket = createSocketLocalDGMQueue(sNum);
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 tQueue->tQueue = (union Data*)LocalDGMQueue;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 tQueue->take = C_takeLocalDGMQueue;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 tQueue->put = C_putLocalDGMQueue;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 tQueue->isEmpty = C_isEmptyLocalDGMQueue;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 tQueue->clear = C_clearLocalDGMQueue;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 tQueue->getData = C_getDataLocalDGMQueue;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 return tQueue;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
1022
635ccc391642 Organize repository
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1014
diff changeset
39 int* createSocketLocalDGMQueue(char* sNum){
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 int w_addr, c_sock;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 struct sockaddr_in a_addr;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 char *hostname = "Localhost";
1012
a4e57a764cac sending struct
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1011
diff changeset
43 char *service = sNum;
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 struct addrinfo hints, *res0, *res;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 int err;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 memset(&hints, 0, sizeof(hints));
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 hints.ai_socktype = SOCK_STREAM;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 hints.ai_family = PF_UNSPEC; //UNSPECはIPv4,6両方のうち使えるものを返す
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 if((err = getaddrinfo(hostname, service, &hints, &res0)) != 0){
1006
d3355697c87c commit to pull
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1000
diff changeset
51 printf("error %d : %s\n", err, gai_strerror(err));
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 return 1;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 for (res=res0; res!=NULL; res=res->ai_next){
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 w_addr = socket(res->ai_family, res->ai_socktype, res->ai_protocol); //AF_INETは古い
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 break;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 if (w_addr == -1) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 printf("socket error\n");
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 return -1;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 struct in_addr {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 u_int32_t s_addr;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 };
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 memset(&a_addr, 0, sizeof(struct sockaddr_in));
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 a_addr.sin_family = PF_UNSPEC;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 a_addr.sin_port = res->ai_addr;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 a_addr.sin_addr.s_addr = res->ai_addrlen;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 if (bind(w_addr, res->ai_addr, res->ai_addrlen) == -1) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 printf("bind error\n");
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 close(w_addr);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 return -1;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 if (listen(w_addr, 3) == -1) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 printf("listen error\n");
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 close(w_addr);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 return -1;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 printf("Waiting connect...\n");
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 c_sock = accept(w_addr, NULL, NULL);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 if (c_sock == -1) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 printf("accept error\n");
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 close(w_addr);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 return -1;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 printf("Connected!!\n");
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 return c_sock;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 __code clearLocalDGMQueue(struct LocalDGMQueue* tQueue, __code next(...)) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 struct Element* top = tQueue->top;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 struct Atomic* atomic = tQueue->atomic;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 goto atomic->checkAndSet(&tQueue->top, top, NULL, next(...), clearLocalDGMQueue);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
1022
635ccc391642 Organize repository
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1014
diff changeset
107 __code getTranceLocalDGMQueue(struct LocalDGMQueue* tQueue, union Data* data, __code next(...)){
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 printf("get");
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 goto next(...);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 __code putLocalDGMQueue(struct LocalDGMQueue* tQueue, union Data* data, __code next(...)) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 Element* element = new Element();
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 element->data = data;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 element->next = NULL;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 Element* last = tQueue->last;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 Element* nextElement = last->next;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 if (last != tQueue->last) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 goto putLocalDGMQueue();
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 if (nextElement == NULL) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 struct Atomic* atomic = tQueue->atomic;
1013
9ca9c36a4633 tweak LDGM
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1012
diff changeset
123 goto atomic->checkAndSet(&last->next, nextElement, element, next(...), putLocalDGMQueue); //書き換え
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 } else {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 struct Atomic* atomic = tQueue->atomic;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 goto atomic->checkAndSet(&tQueue->last, last, nextElement, putLocalDGMQueue, putLocalDGMQueue);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 __code takeLocalDGMQueue(struct LocalDGMQueue* tQueue, __code next(union Data* data, ...)) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 struct Element* top = tQueue->top;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 struct Element* last = tQueue->last;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 struct Element* nextElement = top->next;
1006
d3355697c87c commit to pull
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1000
diff changeset
135 if (top != tQueue->top) { //top!= Queue->top 割り込まれたらループ?
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 goto takeLocalDGMQueue();
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 }
1006
d3355697c87c commit to pull
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1000
diff changeset
138 if (top == last) { //top = lastつまり要素が一つの場合。
d3355697c87c commit to pull
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1000
diff changeset
139 if (nextElement != NULL) { //nextがヌルでなければ、Queueのラストをlastからelementに置き換える。
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 struct Atomic* atomic = tQueue->atomic;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 goto atomic->checkAndSet(&tQueue->last, last, nextElement, takeLocalDGMQueue, takeLocalDGMQueue);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 } else {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 struct Atomic* atomic = tQueue->atomic;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 goto atomic->checkAndSet(&tQueue->top, top, nextElement, takeLocalDGMQueue1, takeLocalDGMQueue);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 goto takeLocalDGMQueue();
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 __code takeLocalDGMQueue1(struct LocalDGMQueue* tQueue, __code next(union Data* data, ...), struct Element* nextElement) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 data = nextElement->data;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 Gearef(context, TQueue)->data = data;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 goto next(data, ...);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 __code takeLocalDGMQueue1_stub(struct Context* context) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 LocalDGMQueue* tQueue = (LocalDGMQueue*)GearImpl(context, TQueue, tQueue);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 enum Code next = Gearef(context, TQueue)->next;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 Data** O_data = &Gearef(context, TQueue)->data;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 goto takeLocalDGMQueue1(context,
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 tQueue,
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 next,
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 O_data,
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 (struct Element*)Gearef(context, Atomic)->newData);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 __code isEmptyLocalDGMQueue(struct LocalDGMQueue* tQueue, __code next(...), __code whenEmpty(...)) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 struct Element* top = tQueue->top;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 struct Element* last = tQueue->last;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 struct Element* nextElement = top->next;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 if (top != tQueue->top) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 goto isEmptyLocalDGMQueue();
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 if (top == last && nextElement == NULL) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 goto whenEmpty(...);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 goto next(...);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179
1022
635ccc391642 Organize repository
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1014
diff changeset
180 __code getDataLocalDGMQueue(struct LocalDGMQueue* tQueue, __code next(...), __code whenEOF(...)){
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 int recv_size, send_size;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 char recv_buf[BUF_SIZE], send_buf;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 /* クライアントから文字列を受信 */
1014
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1013
diff changeset
185 union Data* recv_data;
1022
635ccc391642 Organize repository
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1014
diff changeset
186 recv_size = read(tQueue->socket, recv_data, sizeof(union Data));
1014
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1013
diff changeset
187 //printf("[%s] [%d]\n", fileString->str, fileString->size);
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 if (recv_size == -1) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 printf("recv error\n");
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 goto exit_code();
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 if (recv_size == 0) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 /* 受信サイズが0の場合は相手が接続閉じていると判断 */
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 printf("connection ended\n");
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 /* 受信した文字列を表示 */
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198
1011
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1006
diff changeset
199
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 /* 文字列が"finish"ならクライアントとの接続終了 */
1014
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1013
diff changeset
201
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1013
diff changeset
202 FileString* fileString = NEW(FileString);
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1013
diff changeset
203 fileString = recv_data;
1012
a4e57a764cac sending struct
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1011
diff changeset
204 if (strcmp(fileString->str, "finish") == 0) {
1014
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1013
diff changeset
205 /* 接続終了を表す0を送信 */
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 send_buf = 0;
1022
635ccc391642 Organize repository
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1014
diff changeset
207 send_size = write(tQueue->socket, &send_buf, 1);
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 if (send_size == -1) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 printf("send error\n");
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 close(tQueue->buffer);
1013
9ca9c36a4633 tweak LDGM
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1012
diff changeset
212 goto whenEOF(...);
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 } else {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 /* "finish"以外の場合はクライアントとの接続を継続 */
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 send_buf = 1;
1022
635ccc391642 Organize repository
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1014
diff changeset
216 send_size = write(tQueue->socket, &send_buf, 1);
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 if (send_size == -1) {
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 printf("send error\n");
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 }
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
1014
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1013
diff changeset
222 Gearef(context, TQueue)->data = recv_data;
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1013
diff changeset
223 goto putLocalDGMQueue(recv_data, next);
1000
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 }
1006
d3355697c87c commit to pull
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1000
diff changeset
225
1022
635ccc391642 Organize repository
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1014
diff changeset
226 __code sendDataLocalDGMQueue(struct RemoteDGMQueue* tQueue, struct FileString* string, __code next(...)){
1006
d3355697c87c commit to pull
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1000
diff changeset
227 }
d3355697c87c commit to pull
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 1000
diff changeset
228