# HG changeset patch # User ichikitakahiro # Date 1642098809 -32400 # Node ID a4e57a764cac2c49f18d767f27939e9536b28381 # Parent ea620dff804c33efb10425772df868d687527494 sending struct diff -r ea620dff804c -r a4e57a764cac src/parallel_execution/examples/socketQueue/LocalDGMQueue.cbc --- a/src/parallel_execution/examples/socketQueue/LocalDGMQueue.cbc Thu Jan 13 23:05:41 2022 +0900 +++ b/src/parallel_execution/examples/socketQueue/LocalDGMQueue.cbc Fri Jan 14 03:33:29 2022 +0900 @@ -18,14 +18,14 @@ * 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). */ -TQueue* createLocalDGMQueue(struct Context* context) { +TQueue* createLocalDGMQueue(struct Context* context, char* sNum) { struct TQueue* tQueue = new TQueue(); struct LocalDGMQueue* LocalDGMQueue = new LocalDGMQueue(); LocalDGMQueue->top = new Element(); // allocate a free node LocalDGMQueue->top->next = NULL; LocalDGMQueue->last = LocalDGMQueue->top; LocalDGMQueue->atomic = createAtomicReference(context); - LocalDGMQueue->socket = createSocket(); + LocalDGMQueue->socket = createSocket(sNum); tQueue->tQueue = (union Data*)LocalDGMQueue; tQueue->take = C_takeLocalDGMQueue; @@ -36,11 +36,11 @@ return tQueue; } -int* createSocket(){ +int* createSocket(char* sNum){ int w_addr, c_sock; struct sockaddr_in a_addr; char *hostname = "Localhost"; - char *service = "8080"; + char *service = sNum; struct addrinfo hints, *res0, *res; int err; @@ -182,7 +182,9 @@ char recv_buf[BUF_SIZE], send_buf; /* クライアントから文字列を受信 */ - recv_size = recv(tQueue->socket, recv_buf, BUF_SIZE, 0); + FileString* fileString = NEW(FileString); + recv(tQueue->socket, fileString, sizeof(struct FileString), 0); + printf("[%s] [%d]\n", fileString->str, fileString->size); if (recv_size == -1) { printf("recv error\n"); goto exit_code(); @@ -193,12 +195,10 @@ } /* 受信した文字列を表示 */ - printf("%s\n", recv_buf); - /**/ /* 文字列が"finish"ならクライアントとの接続終了 */ - if (strcmp(recv_buf, "finish") == 0) { + if (strcmp(fileString->str, "finish") == 0) { /* 接続終了を表す0を送信 */ send_buf = 0; send_size = send(tQueue->socket, &send_buf, 1, 0); @@ -216,11 +216,9 @@ } } - FileString* string = NEW(FileString); - memcpy(string->str, recv_buf, sizeof(string->str)); - Gearef(context, TQueue)->data = string; - - goto putLocalDGMQueue(string, next); + Gearef(context, TQueue)->data = fileString; + + goto putLocalDGMQueue(fileString, next); } __code sendData(struct RemoteDGMQueue* tQueue, struct FileString* string, __code next(...)){ diff -r ea620dff804c -r a4e57a764cac src/parallel_execution/examples/socketQueue/Local_test.cbc --- a/src/parallel_execution/examples/socketQueue/Local_test.cbc Thu Jan 13 23:05:41 2022 +0900 +++ b/src/parallel_execution/examples/socketQueue/Local_test.cbc Fri Jan 14 03:33:29 2022 +0900 @@ -12,7 +12,7 @@ } __code Task1_stub(struct Context* context){ - TQueue* localDGMQueue = createLocalDGMQueue(context); + TQueue* localDGMQueue = createLocalDGMQueue(context, service_num); goto Task1(context, localDGMQueue); } @@ -27,8 +27,7 @@ __code Task3(TQueue* localDGMQueue, FileString* string){ - printf("take[%s]\n", string->str); - printf("num = %d\n", string->size); + printf("take[%s] [num:%d]\n", string->str, string->size); goto localDGMQueue->isEmpty(noEmp, whenEmp); } @@ -57,5 +56,9 @@ int main(int argc, char** argv) { printf("main\n"); + init(argc, argv); + if (service_num == NULL){ + service_num = "8080"; + } goto Task1(); } diff -r ea620dff804c -r a4e57a764cac src/parallel_execution/examples/socketQueue/RemoteDGMQueue.cbc --- a/src/parallel_execution/examples/socketQueue/RemoteDGMQueue.cbc Thu Jan 13 23:05:41 2022 +0900 +++ b/src/parallel_execution/examples/socketQueue/RemoteDGMQueue.cbc Fri Jan 14 03:33:29 2022 +0900 @@ -18,14 +18,14 @@ * 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). */ -TQueue* createRemoteDGMQueue(struct Context* context) { +TQueue* createRemoteDGMQueue(struct Context* context, char* sNum) { struct TQueue* tQueue = new TQueue(); struct RemoteDGMQueue* RemoteDGMQueue = new RemoteDGMQueue(); RemoteDGMQueue->top = new Element(); // allocate a free node RemoteDGMQueue->top->next = NULL; RemoteDGMQueue->last = RemoteDGMQueue->top; RemoteDGMQueue->atomic = createAtomicReference(context); - RemoteDGMQueue->socket = createSocket(); + RemoteDGMQueue->socket = createSocket(sNum); tQueue->tQueue = (union Data*)RemoteDGMQueue; tQueue->take = C_takeRemoteDGMQueue; @@ -36,11 +36,11 @@ return tQueue; } -int* createSocket(){ +int* createSocket(char *sNum){ int sock; struct sockaddr_in a_addr; char *hostname = "localhost"; - char *service = "8080"; + char *service = sNum; struct addrinfo hints, *res0, *res; int err; @@ -170,7 +170,7 @@ memcpy(send_buf, string->str, sizeof(send_buf)); /* 文字列を送信 */ - send_size = send(tQueue->socket, send_buf, strlen(send_buf) + 1, 0); + send_size = send(tQueue->socket, string, sizeof(struct FileString), 0); if (send_size == -1) { printf("send error\n"); close(tQueue->socket); diff -r ea620dff804c -r a4e57a764cac src/parallel_execution/examples/socketQueue/Remote_test.cbc --- a/src/parallel_execution/examples/socketQueue/Remote_test.cbc Thu Jan 13 23:05:41 2022 +0900 +++ b/src/parallel_execution/examples/socketQueue/Remote_test.cbc Fri Jan 14 03:33:29 2022 +0900 @@ -3,16 +3,18 @@ #interface "Integer.h" #interface "FileString.h" #interface "DataTransfer.h" +char* service_num; __code Task1(TQueue* remoteDGMQueue){ FileString* string = NEW(FileString); char word[1024] = "first"; memcpy(string->str, word, strlen(word)); + string->size = 456; goto remoteDGMQueue->put(string, Task2); } __code Task1_stub(struct Context* context){ - TQueue* remoteDGMQueue = createRemoteDGMQueue(context); + TQueue* remoteDGMQueue = createRemoteDGMQueue(context, service_num); goto Task1(context, remoteDGMQueue); } @@ -20,6 +22,7 @@ printf("Task2\n"); FileString* string = NEW(FileString); char word[1024] = "secound"; + string->size = 789; memcpy(string->str, word, strlen(word)); goto remoteDGMQueue->put(string, Task3); } @@ -43,6 +46,7 @@ } __code Task4(TQueue* remoteDGMQueue){ + printf("exit\n"); goto exit_code(); } @@ -51,7 +55,19 @@ goto Task4(context, remoteDGMQueue); } +void init(int argc, char** argv) { + for (int i = 1; argv[i]; ++i) { + if (strcmp(argv[i], "-sn") == 0){ + service_num = argv[i+1]; + } + } +} + int main(int argc, char** argv) { printf("main\n"); + init(argc, argv); + if (service_num == NULL){ + service_num = "8080"; + } goto Task1(); }