From 289fc5efbf5cb2f75f1993ad0131dada78400d3b Mon Sep 17 00:00:00 2001 From: Wenyong Huang Date: Wed, 8 Mar 2023 16:36:08 +0800 Subject: [PATCH] Enhance/Fix sample socket-api and workload (#2006) - Add python script to test socket-api cases - Fix issues in socket-api send_recv wasm app - Fix issues in building samples/workload/meshoptimizer - Enhance build script of sample workload --- samples/simple/sample_test_run.py | 24 ++- samples/socket-api/README.md | 4 +- samples/socket-api/sample_test_run.py | 141 ++++++++++++++++++ samples/socket-api/wasm-src/send_recv.c | 15 +- samples/wasm-c-api-imports/wasm/send_recv.c | 15 +- samples/workload/CMakeLists.txt | 6 +- samples/workload/bwa/CMakeLists.txt | 4 +- samples/workload/meshoptimizer/CMakeLists.txt | 4 +- .../workload/meshoptimizer/codecbench.patch | 18 +-- samples/workload/wasm-av1/CMakeLists.txt | 2 +- 10 files changed, 199 insertions(+), 34 deletions(-) create mode 100755 samples/socket-api/sample_test_run.py diff --git a/samples/simple/sample_test_run.py b/samples/simple/sample_test_run.py index ed4916c8..09c36db5 100755 --- a/samples/simple/sample_test_run.py +++ b/samples/simple/sample_test_run.py @@ -10,9 +10,18 @@ import subprocess import sys import time import traceback +import glob WAMRC_CMD = "../../wamr-compiler/build/wamrc" +def compile_wasm_files_to_aot(wasm_apps_dir): + wasm_files = glob.glob(wasm_apps_dir + "/*.wasm") + print("Compile wasm app into aot files") + for wasm_file in wasm_files: + aot_file = wasm_file[0 : len(wasm_file) - 5] + ".aot"; + cmd = [ WAMRC_CMD, "-o", aot_file, wasm_file ] + subprocess.check_call(cmd) + def start_server(cwd): """ Startup the 'simple' process works in TCP server mode @@ -92,19 +101,8 @@ def main(): print("Test with AOT mode") test_aot = True suffix = ".aot" - wasm_files = [ "timer", "sensor", "connection", - "event_publisher", "event_subscriber", - "request_handler", "request_sender" ] - work_dir = args.working_directory - wasm_apps_dir = work_dir + "/wasm-apps" - print("Compile wasm app into aot files") - for wasm_file in wasm_files: - CMD = [] - CMD.append(WAMRC_CMD) - CMD.append("-o") - CMD.append(wasm_apps_dir + "/" + wasm_file + ".aot") - CMD.append(wasm_apps_dir + "/" + wasm_file + ".wasm") - subprocess.check_call(CMD) + wasm_apps_dir = args.working_directory + "/wasm-apps" + compile_wasm_files_to_aot(wasm_apps_dir) ret = 1 app_server = None diff --git a/samples/socket-api/README.md b/samples/socket-api/README.md index 8e5a3fcc..a3bc5ac1 100644 --- a/samples/socket-api/README.md +++ b/samples/socket-api/README.md @@ -68,7 +68,7 @@ Say Hi from the Server send and receive data via 127.0.0.1:1234. ```bash -$ ./iwasm --addr-pool=127.0.0.1/0 ./send_recv.wasm +$ ./iwasm --addr-pool=127.0.0.1/0 ./send_recv.wasm ``` The output is: @@ -164,7 +164,7 @@ Datagram sent `addr_resolve.wasm` demonstrates the usage of resolving a domain name ``` -$ ./iwasm --allow-resolve=*.com addr_resolve.wasm github.com +$ ./iwasm --allow-resolve=*.com addr_resolve.wasm github.com ``` The command displays the host name and its corresponding IP address: diff --git a/samples/socket-api/sample_test_run.py b/samples/socket-api/sample_test_run.py new file mode 100755 index 00000000..ec006028 --- /dev/null +++ b/samples/socket-api/sample_test_run.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2023 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +# + +import argparse +import shlex +import subprocess +import sys +import time +import traceback +import glob + +WAMRC_CMD = "../../wamr-compiler/build/wamrc" + +def compile_wasm_files_to_aot(wasm_apps_dir): + wasm_files = glob.glob(wasm_apps_dir + "/*.wasm") + print("Compile wasm app into aot files") + for wasm_file in wasm_files: + aot_file = wasm_file[0 : len(wasm_file) - 5] + ".aot"; + cmd = [ WAMRC_CMD, "-o", aot_file, wasm_file ] + subprocess.check_call(cmd) + +def start_server(cmd, cwd): + app_server = subprocess.Popen(shlex.split(cmd), cwd=cwd) + return app_server + +def run_cmd(cmd, cwd): + qry_prc = subprocess.run( + shlex.split(cmd), cwd=cwd, check=False, capture_output=True + ) + if (qry_prc.returncode != 0): + print("Run {} failed, return {}".format(cmd), qry_prc.returncode) + return + print("return code: {}, output:\n{}".format(qry_prc.returncode, + qry_prc.stdout.decode())) + +def main(): + """ + GO!GO!!GO!!! + """ + parser = argparse.ArgumentParser(description="run the sample and examine outputs") + parser.add_argument("working_directory", type=str) + parser.add_argument("--aot", action='store_true', help="Test with AOT") + args = parser.parse_args() + + test_aot = False + suffix = ".wasm" + if not args.aot: + print("Test with interpreter mode") + else: + print("Test with AOT mode") + test_aot = True + suffix = ".aot" + wasm_apps_dir = args.working_directory + compile_wasm_files_to_aot(wasm_apps_dir) + + ret = 1 + app_server = None + try: + print("\n================================") + print("Test TCP server and client") + cmd = "./iwasm --addr-pool=0.0.0.0/15 tcp_server" + suffix + app_server = start_server(cmd, args.working_directory) + # wait for a second + time.sleep(1) + cmd = "./iwasm --addr-pool=127.0.0.1/15 tcp_client" + suffix + for i in range(5): + run_cmd(cmd, args.working_directory) + + print("\n================================") + print("Test UDP server and client") + cmd = "./iwasm --addr-pool=0.0.0.0/15 udp_server" + suffix + app_server = start_server(cmd, args.working_directory) + # wait for a second + time.sleep(1) + cmd = "./iwasm --addr-pool=127.0.0.1/15 udp_client" + suffix + for i in range(5): + run_cmd(cmd, args.working_directory) + + print("\n=====================================================") + print("Sleep 80 seconds to wait TCP server port actually close") + time.sleep(80) + + print("\n================================") + print("Test send and receive") + cmd = "./iwasm --addr-pool=127.0.0.1/0 ./send_recv" + suffix + run_cmd(cmd, args.working_directory) + + print("\n================================") + print("Test socket options") + cmd = "./iwasm socket_opts" + suffix + run_cmd(cmd, args.working_directory) + + print("\n================================") + print("Test timeout server and client") + cmd = "./iwasm --addr-pool=0.0.0.0/15 timeout_server" + suffix + app_server = start_server(cmd, args.working_directory) + # wait for a second + time.sleep(1) + cmd = "./iwasm --addr-pool=127.0.0.1/15 timeout_client" + suffix + run_cmd(cmd, args.working_directory) + + print("\n==========================================") + print("Test multicast_client and multicast_server") + cmd = "./iwasm --addr-pool=0.0.0.0/0,::/0 multicast_client.wasm 224.0.0.1" + app_server = start_server(cmd, args.working_directory) + # wait for a second + time.sleep(1) + cmd = "./multicast_server 224.0.0.1" + run_cmd(cmd, args.working_directory) + + cmd = "./iwasm --addr-pool=0.0.0.0/0,::/0 multicast_client.wasm FF02:113D:6FDD:2C17:A643:FFE2:1BD1:3CD2" + app_server = start_server(cmd, args.working_directory) + # wait for a second + time.sleep(1) + cmd = "./multicast_server FF02:113D:6FDD:2C17:A643:FFE2:1BD1:3CD2" + run_cmd(cmd, args.working_directory) + + print("\n================================") + print("Test address resolving") + cmd = "./iwasm --allow-resolve=*.com addr_resolve.wasm github.com" + cmd = "./multicast_server FF02:113D:6FDD:2C17:A643:FFE2:1BD1:3CD2" + run_cmd(cmd, args.working_directory) + + # wait for a second + time.sleep(1) + + print("--> All pass") + ret = 0 + except AssertionError: + traceback.print_exc() + finally: + app_server.kill() + + return ret + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/samples/socket-api/wasm-src/send_recv.c b/samples/socket-api/wasm-src/send_recv.c index 169dc471..0071b2a7 100644 --- a/samples/socket-api/wasm-src/send_recv.c +++ b/samples/socket-api/wasm-src/send_recv.c @@ -19,6 +19,7 @@ static pthread_mutex_t lock = { 0 }; static pthread_cond_t cond = { 0 }; +static bool server_create_failed = false; static bool server_is_ready = false; void * @@ -46,6 +47,8 @@ run_as_server(void *arg) pthread_mutex_lock(&lock); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { + server_create_failed = true; + pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); perror("Create a socket failed"); return NULL; @@ -53,6 +56,8 @@ run_as_server(void *arg) #ifndef __wasi__ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on))) { + server_create_failed = true; + pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); perror("Setsockopt failed"); goto fail1; @@ -66,12 +71,16 @@ run_as_server(void *arg) addrlen = sizeof(addr); if (bind(sock, (struct sockaddr *)&addr, addrlen) < 0) { + server_create_failed = true; + pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); perror("Bind failed"); goto fail1; } if (listen(sock, 0) < 0) { + server_create_failed = true; + pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); perror("Listen failed"); goto fail1; @@ -117,11 +126,15 @@ run_as_client(void *arg) ssize_t recv_len = 0; pthread_mutex_lock(&lock); - while (false == server_is_ready) { + while (!server_create_failed && !server_is_ready) { pthread_cond_wait(&cond, &lock); } pthread_mutex_unlock(&lock); + if (server_create_failed) { + return NULL; + } + printf("Client is running...\n"); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { diff --git a/samples/wasm-c-api-imports/wasm/send_recv.c b/samples/wasm-c-api-imports/wasm/send_recv.c index 72e1a672..d9f95573 100644 --- a/samples/wasm-c-api-imports/wasm/send_recv.c +++ b/samples/wasm-c-api-imports/wasm/send_recv.c @@ -23,6 +23,7 @@ static pthread_mutex_t lock = { 0 }; static pthread_cond_t cond = { 0 }; +static bool server_create_failed = false; static bool server_is_ready = false; #ifdef __wasi__ @@ -71,6 +72,8 @@ run_as_server(void *arg) pthread_mutex_lock(&lock); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { + server_create_failed = true; + pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); perror("Create a socket failed"); return NULL; @@ -78,6 +81,8 @@ run_as_server(void *arg) #ifndef __wasi__ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on))) { + server_create_failed = true; + pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); perror("Setsockopt failed"); goto fail1; @@ -91,12 +96,16 @@ run_as_server(void *arg) addrlen = sizeof(addr); if (bind(sock, (struct sockaddr *)&addr, addrlen) < 0) { + server_create_failed = true; + pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); perror("Bind failed"); goto fail1; } if (listen(sock, 0) < 0) { + server_create_failed = true; + pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); perror("Listen failed"); goto fail1; @@ -142,11 +151,15 @@ run_as_client(void *arg) ssize_t recv_len = 0; pthread_mutex_lock(&lock); - while (false == server_is_ready) { + while (!server_create_failed && !server_is_ready) { pthread_cond_wait(&cond, &lock); } pthread_mutex_unlock(&lock); + if (server_create_failed) { + return NULL; + } + local_printf("Client is running...\n"); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { diff --git a/samples/workload/CMakeLists.txt b/samples/workload/CMakeLists.txt index 5e5dca28..667f0b4e 100644 --- a/samples/workload/CMakeLists.txt +++ b/samples/workload/CMakeLists.txt @@ -24,7 +24,7 @@ ExternalProject_Add(iwasm CONFIGURE_COMMAND ${CMAKE_COMMAND} -S ${CMAKE_CURRENT_SOURCE_DIR}/../../product-mini/platforms/linux -B build -DWAMR_BUILD_LIBC_EMCC=1 BUILD_COMMAND - ${CMAKE_COMMAND} --build build + ${CMAKE_COMMAND} --build build --parallel 4 INSTALL_COMMAND # FIXME: replace with --install ${CMAKE_COMMAND} -E copy_if_different @@ -43,7 +43,7 @@ ExternalProject_Add(wamrc CONFIGURE_COMMAND ${CMAKE_COMMAND} -S ${CMAKE_CURRENT_SOURCE_DIR}/../../wamr-compiler -B build BUILD_COMMAND - ${CMAKE_COMMAND} --build build + ${CMAKE_COMMAND} --build build --parallel 4 INSTALL_COMMAND # FIXME: replace with --install ${CMAKE_COMMAND} -E copy_if_different @@ -113,4 +113,4 @@ add_test( ./iwasm --dir=. testavx.aot ./wasm-av1/elephants_dream_480p24.ivf WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -) \ No newline at end of file +) diff --git a/samples/workload/bwa/CMakeLists.txt b/samples/workload/bwa/CMakeLists.txt index 731dd4c7..5db52a38 100644 --- a/samples/workload/bwa/CMakeLists.txt +++ b/samples/workload/bwa/CMakeLists.txt @@ -50,7 +50,7 @@ ExternalProject_Add(bwa -DCMAKE_SYSROOT=${WASISDK_SYSROOT} -DCMAKE_C_FLAGS=-isystem\ ${CMAKE_CURRENT_SOURCE_DIR}/../include/sse\ -isystem\ ${CMAKE_CURRENT_SOURCE_DIR}/../include/libc/musl ${CMAKE_CURRENT_SOURCE_DIR}/bwa - BUILD_COMMAND make bwa_wasm_opt + BUILD_COMMAND make bwa_wasm_opt -j 4 INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different ./bwa.opt.wasm ${CMAKE_CURRENT_BINARY_DIR}/bwa.wasm ) @@ -70,4 +70,4 @@ ExternalProject_Add(bwa-kit INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/bwa-kit/src/bwa-kit/resource-GRCh38/hs38DH-extra.fa ${CMAKE_CURRENT_BINARY_DIR}/hs38DH-extra.fa -) \ No newline at end of file +) diff --git a/samples/workload/meshoptimizer/CMakeLists.txt b/samples/workload/meshoptimizer/CMakeLists.txt index cb490f91..263f6a18 100644 --- a/samples/workload/meshoptimizer/CMakeLists.txt +++ b/samples/workload/meshoptimizer/CMakeLists.txt @@ -21,7 +21,7 @@ include(ExternalProject) ExternalProject_Add(codecbench PREFIX codecbench GIT_REPOSITORY https://github.com/zeux/meshoptimizer.git - GIT_TAG f926b288264522e1b331a41b07ba40167f396913 + GIT_TAG f734fd572aed5bf76e84d9ed62ca6f4f6c47d84e GIT_SHALLOW ON GIT_PROGRESS ON SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/meshoptimizer @@ -33,6 +33,6 @@ ExternalProject_Add(codecbench -DCMAKE_TOOLCHAIN_FILE=${WASISDK_TOOLCHAIN} -DCMAKE_SYSROOT=${WASISDK_SYSROOT} ${CMAKE_CURRENT_SOURCE_DIR}/meshoptimizer - BUILD_COMMAND make codecbench + BUILD_COMMAND make codecbench -j 4 INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different ./codecbench.wasm ${CMAKE_CURRENT_BINARY_DIR}/codecbench.wasm ) diff --git a/samples/workload/meshoptimizer/codecbench.patch b/samples/workload/meshoptimizer/codecbench.patch index 667b8ab2..19db792b 100644 --- a/samples/workload/meshoptimizer/codecbench.patch +++ b/samples/workload/meshoptimizer/codecbench.patch @@ -1,8 +1,8 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index b13d946..4254003 100644 +index 612cf3b..22a365a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -149,3 +149,43 @@ install(FILES +@@ -158,3 +158,43 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/meshoptimizerConfigVersion.cmake COMPONENT meshoptimizer DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/meshoptimizer) @@ -47,10 +47,10 @@ index b13d946..4254003 100644 + +add_dependencies(codecbench.opt codecbench) diff --git a/src/vertexcodec.cpp b/src/vertexcodec.cpp -index 821c467..b7d30b1 100644 +index 4bd1112..257c258 100644 --- a/src/vertexcodec.cpp +++ b/src/vertexcodec.cpp -@@ -83,13 +83,13 @@ +@@ -89,13 +89,13 @@ #endif #ifdef SIMD_WASM @@ -71,7 +71,7 @@ index 821c467..b7d30b1 100644 #endif namespace meshopt -@@ -691,7 +691,7 @@ static v128_t decodeShuffleMask(unsigned char mask0, unsigned char mask1) +@@ -757,7 +757,7 @@ static v128_t decodeShuffleMask(unsigned char mask0, unsigned char mask1) v128_t sm1 = wasm_v128_load(&kDecodeBytesGroupShuffle[mask1]); v128_t sm1off = wasm_v128_load(&kDecodeBytesGroupCount[mask0]); @@ -80,7 +80,7 @@ index 821c467..b7d30b1 100644 v128_t sm1r = wasm_i8x16_add(sm1, sm1off); -@@ -741,7 +741,7 @@ static const unsigned char* decodeBytesGroupSimd(const unsigned char* data, unsi +@@ -807,7 +807,7 @@ static const unsigned char* decodeBytesGroupSimd(const unsigned char* data, unsi v128_t shuf = decodeShuffleMask(mask0, mask1); @@ -89,7 +89,7 @@ index 821c467..b7d30b1 100644 wasm_v128_store(buffer, result); -@@ -763,7 +763,7 @@ static const unsigned char* decodeBytesGroupSimd(const unsigned char* data, unsi +@@ -829,7 +829,7 @@ static const unsigned char* decodeBytesGroupSimd(const unsigned char* data, unsi v128_t shuf = decodeShuffleMask(mask0, mask1); @@ -99,7 +99,7 @@ index 821c467..b7d30b1 100644 wasm_v128_store(buffer, result); diff --git a/src/vertexfilter.cpp b/src/vertexfilter.cpp -index 14a73b1..8f4b3c1 100644 +index 5c7589c..c79cad4 100644 --- a/src/vertexfilter.cpp +++ b/src/vertexfilter.cpp @@ -57,10 +57,10 @@ @@ -116,4 +116,4 @@ index 14a73b1..8f4b3c1 100644 +#define wasmx_unziphi_v32x4(a, b) wasm_i32x4_shuffle(a, b, 1, 3, 5, 7) #endif - namespace meshopt + #ifndef __has_builtin diff --git a/samples/workload/wasm-av1/CMakeLists.txt b/samples/workload/wasm-av1/CMakeLists.txt index 6fea31ea..3d263bfb 100644 --- a/samples/workload/wasm-av1/CMakeLists.txt +++ b/samples/workload/wasm-av1/CMakeLists.txt @@ -36,7 +36,7 @@ ExternalProject_Add(av1 -DCMAKE_SYSROOT=${WASISDK_SYSROOT} -DCMAKE_C_FLAGS=-isystem\ ${CMAKE_CURRENT_SOURCE_DIR}/../include/sse\ -isystem\ ${CMAKE_CURRENT_SOURCE_DIR}/../include/libc/musl ${CMAKE_CURRENT_SOURCE_DIR}/av1 - BUILD_COMMAND make testavx_opt + BUILD_COMMAND make testavx_opt -j 4 INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different testavx.opt.wasm ${CMAKE_CURRENT_SOURCE_DIR}/av1/third_party/samples/elephants_dream_480p24.ivf