diff options
| author | pengxuanzheng <[email protected]> | 2020-08-24 17:10:55 +0800 |
|---|---|---|
| committer | pengxuanzheng <[email protected]> | 2020-08-24 17:10:55 +0800 |
| commit | 503f4af4d8514913eb2ad0405b557abfd4326976 (patch) | |
| tree | 5dd4f67e39f543c1cb1e2048eae0c0f720691c58 /example/multithread.cpp | |
Initial commit
Diffstat (limited to 'example/multithread.cpp')
| -rw-r--r-- | example/multithread.cpp | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/example/multithread.cpp b/example/multithread.cpp new file mode 100644 index 0000000..26b45ec --- /dev/null +++ b/example/multithread.cpp @@ -0,0 +1,265 @@ +/************************************************************************* + > File Name: main.c + > Author: pxz + > Mail: [email protected] + > Created Time: Thu 09 Jul 2020 07:08:40 AM CST + ************************************************************************/ +extern "C" +{ + #include<stdio.h> + #include<stdlib.h> + #include<string.h> + #include<pthread.h> + #include<unistd.h> + #include<time.h> +} +#include"../include/tsg_lua_interface.h" +#ifndef MAX_THREAD_NUM +#define MAX_THREAD_NUM 9 +#endif +#define MAX_SCRIPT_NUM 3 +#define SCRIPT_NO_CACHE -1 + +typedef struct lua_script_info_s{ + const char *script_data; + int script_len; + int script_id; +}lua_script_info_t; + +typedef struct lua_data_s{ + char data[1024]; + int data_len; +}lua_data_t; + +typedef struct{ + lua_data_t data; + int thread_id; +}userdata_t; + + +/* 存储脚本以及脚本id */ +#define SCRIPT_PROTOCOL_RECOGNITION "./script/protocol_recognition.lua" +#define SCRIPT_COUNT_1 "./script/count_1.lua" +#define SCRIPT_MATCH_12345 "./script/match_12345.lua" + +void debuginfo(int thread_id, char *out, int out_len, int out_type) +{ + printf("[C][thread_id:%d]output.len:%d\n", thread_id, out_len); + printf("[C][thread_id:%d]output.type:%d\n", thread_id, out_type); + switch(out_type) + { + case STRING: + printf("[C][thread_id:%d]output.data:%s\n", thread_id, out); + break; + case BOOLEAN: + printf("[C][thread_id:%d]outpt.data:%d\n", thread_id, out[0]); + break; + case INTEGER: + printf("[C][thread_id:%d]outpt.data:%ld\n", thread_id, *(long int *)out); + break; + default: + + break; + } + return; +} + +void *lua_function(void *ptr) +{ + int ret; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + memset(out, 0, 255); + tsg_lua_handle L = NULL; + + userdata_t *userdata = (userdata_t *)ptr; + lua_data_t *data = &userdata->data; + int thread_id = userdata->thread_id; + + lua_script_info_t script_info[MAX_SCRIPT_NUM] = + { + {SCRIPT_PROTOCOL_RECOGNITION, (int)strlen(SCRIPT_PROTOCOL_RECOGNITION), SCRIPT_NO_CACHE}, + {SCRIPT_COUNT_1, (int)strlen(SCRIPT_COUNT_1), SCRIPT_NO_CACHE}, + {SCRIPT_MATCH_12345, (int)strlen(SCRIPT_MATCH_12345), SCRIPT_NO_CACHE}, + }; + + printf("[C][thread_id:%d]:tsg_lua_vm_create start...\n", thread_id); + L = tsg_lua_vm_create(); + if (L == NULL) + { + printf("[C][thread_id:%d]:tsg_lua_vm_create failed...\n", thread_id); + return (void *)"lua vm create failed"; + } + printf("[C][thread_id:%d]:lua:%p ...\n", thread_id, L); + printf("[C][thread_id:%d]:tsg_lua_vm_create success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_exec_file start...\n", thread_id); + ret = tsg_lua_exec_file(L, script_info[0].script_data, data->data, data->data_len, out, &out_len, &out_type); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_lua_exec_file failed...\n", thread_id); + return (void *)"exec failed"; + } + debuginfo(thread_id, out, out_len, out_type); + printf("[C][thread_id:%d]:tsg_lua_exec_file success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_cache_script_file start...\n", thread_id); + script_info[1].script_id = tsg_lua_cache_script_file(L, script_info[1].script_data); + if (script_info[1].script_id < 0) + { + printf("[C][thread_id:%d]:tsg_lua_cache_script_file failed...\n", thread_id); + return (void *)"cache script failed"; + } + printf("[C][thread_id:%d]:script_id:%d ...\n", thread_id, script_info[1].script_id); + printf("[C][thread_id:%d]:tsg_lua_cache_script_file success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_cache_exec start...\n", thread_id); + ret = tsg_lua_cache_exec(L, script_info[1].script_id, data->data, data->data_len, out, &out_len, &out_type); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_lua_cache_exec failed...\n", thread_id); + return (void *)"cache exec failed"; + } + debuginfo(thread_id, out, out_len, out_type); + printf("[C][thread_id:%d]:tsg_lua_cache_exec success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_cache_script_file start...\n", thread_id); + script_info[2].script_id = tsg_lua_cache_script_file(L, script_info[2].script_data); + if (script_info[2].script_id < 0) + { + printf("[C][thread_id:%d]:tsg_lua_cache_script_file failed...\n", thread_id); + return (void *)"cache script failed"; + } + printf("[C][thread_id:%d]:script_id:%d ...\n", thread_id, script_info[2].script_id); + printf("[C][thread_id:%d]:tsg_lua_cache_script_file success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_cache_exec start...\n", thread_id); + ret = tsg_lua_cache_exec(L, script_info[2].script_id, data->data, data->data_len, out, &out_len, &out_type); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_lua_cache_exec failed...\n", thread_id); + return (void *)"cache exec failed"; + } + debuginfo(thread_id, out, out_len, out_type); + printf("[C][thread_id:%d]:tsg_lua_cache_exec success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_uncache_script start...\n", thread_id); + ret = tsg_lua_uncache_script(L, script_info[1].script_id); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_lua_uncache_script failed...\n", thread_id); + return (void *)"uncache script failed"; + } + printf("[C][thread_id:%d]:tsg_uncache_script success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_uncache_script start...\n", thread_id); + ret = tsg_lua_uncache_script(L, script_info[2].script_id); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_lua_uncache_script failed...\n", thread_id); + return (void *)"uncache script failed"; + } + printf("[C][thread_id:%d]:tsg_uncache_script success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_destory_lua start...\n", thread_id); + ret = tsg_destory_lua(L); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_destory_lua failed...\n", thread_id); + return (void *)"uncache script failed"; + } + printf("[C][thread_id:%d]:tsg_destory_lua success...\n", thread_id); + pthread_exit((void *)"OK"); +} + + +int main(int argc, char *argv[]) +{ + int thread_num; + pthread_t thread[MAX_THREAD_NUM] = {0}; + int thread_sum; + int ch, i; + char buf[1024]; + int buf_len; + userdata_t userdata[MAX_THREAD_NUM] = {0}; + lua_data_t *data = NULL; + char *retval; + +#ifndef MIN +#define MIN(a, b) ((a) > (b) ?(b):(a)) +#endif + + /* default */ + thread_sum = 3; + strcpy(buf, "this is tcp"); + buf_len = strlen("this is tcp"); + + while((ch = getopt(argc, argv, "t:s:b:d:h")) != -1) + { + switch(ch) + { + case 't': + thread_sum = atoi(optarg); + if (thread_sum > MAX_THREAD_NUM) + { + printf("MAX_THREAD_NUM is %d\n",MAX_THREAD_NUM); + thread_sum = MAX_THREAD_NUM; + } + break; + case 's': + buf_len = MIN(1024, strlen(optarg)); + strncpy(buf, optarg, buf_len); + buf[buf_len] = '\0'; + break; + case 'b': + buf_len = MIN(1024, strlen(optarg)); + for (i = 0; i < buf_len; i++) + { + if ((optarg[i] != '0') && (optarg[i] != '1')) + { + printf("error: input wrong\n"); + return -1; + } + buf[i] = optarg[i] - '0'; + } + break; + case 'd': + buf_len = MIN(1024, strlen(optarg)); + for (i = 0; i < buf_len; i++) + { + if ((optarg[i] < '0') && (optarg[i] > '9')) + { + printf("error: input wrong\n"); + return -1; + } + buf[i] = optarg[i] - '0'; + } + break; + case 'h': + default: + printf("usage: multithread [-t set thread num] [-s input string] [-b input bin] [-d input integer] [-h show help info]\n"); + return -1; + break; + } + } + + for (thread_num = 0; thread_num < thread_sum; thread_num++) + { + userdata[thread_num].thread_id = thread_num; + data = &userdata[thread_num].data; + memcpy(data->data, buf, buf_len); + data->data_len = buf_len; + data->data[buf_len] = thread_num; + data->data_len++; + pthread_create(&thread[thread_num], NULL, lua_function, (void *)&userdata[thread_num]); + } + + for (thread_num = 0; thread_num < thread_sum; thread_num++) + { + pthread_join(thread[thread_num], (void **)&retval); + printf("[C][thread_id:%d]: %s\n", thread_num, retval); + } + + return 0; +} |
