From 6a98d2a04167f48c4d24b51f50ffe6bc824149b0 Mon Sep 17 00:00:00 2001 From: fengweihao Date: Mon, 9 Jul 2018 14:32:41 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=B7=BB=E5=8A=A0Redis=E5=88=86=E5=B8=83?= =?UTF-8?q?=E5=BC=8F=E9=94=81=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=AE=8F=E6=8E=A7=E5=88=B6=E5=90=AF=E5=8A=A8=EF=BC=88=E7=9B=AE?= =?UTF-8?q?=E5=89=8D=E9=9D=9E=E5=90=AF=E7=94=A8=EF=BC=89=20=EF=BC=88?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E9=97=AE=E9=A2=981.=E7=94=B1=E4=BA=8Eredis?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=EF=BC=8C=E9=94=81=E5=AD=98=E5=9C=A8=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E8=BE=83=E9=AB=98=EF=BC=8C=E5=8A=A0=E9=94=81=E5=90=8E?= =?UTF-8?q?=E5=BD=B1=E5=93=8D=E6=80=A7=E8=83=BD=E8=BE=83=E4=B8=A5=E9=87=8D?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=202.=E4=B8=8D=E6=98=AF=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E9=94=81=E9=83=BD=E8=83=BD=E6=88=90=E5=8A=9F=EF=BC=89?= =?UTF-8?q?=202.=E6=B7=BB=E5=8A=A0=E6=98=BE=E7=A4=BA=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=B8=AD=EF=BC=8Copenssl=E7=94=9F=E6=88=90=E8=AF=81=E4=B9=A6?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=BF=A1=E6=81=AF=E8=BE=93=E5=87=BA=EF=BC=88?= =?UTF-8?q?=E7=94=9F=E6=88=90=E8=AF=81=E4=B9=A6=E6=80=BB=E6=97=B6=E9=97=B4?= =?UTF-8?q?/=E7=94=9F=E6=88=90=E8=AF=81=E4=B9=A6=E6=AC=A1=E6=95=B0?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Makefile | 6 +- src/cert_init.h | 4 + src/cert_session.c | 103 ++++++++++++--- src/cert_session.h | 21 +-- src/components/redis/rd_lock.c | 206 +++++++++++++++++++++++++++++ src/components/redis/rd_lock.h | 26 ++++ src/components/redis/redis.mk | 40 ++++++ src/inc/field_stat2.h | 3 +- src/inc/moodycamel_field_stat2.cpp | 17 +-- src/inc/moodycamel_field_stat2.h | 5 +- src/lib/libMESA_field_stat2.a | Bin 58804 -> 58876 bytes 11 files changed, 381 insertions(+), 50 deletions(-) create mode 100644 src/components/redis/rd_lock.c create mode 100644 src/components/redis/rd_lock.h create mode 100644 src/components/redis/redis.mk diff --git a/src/Makefile b/src/Makefile index e902554..5b67971 100644 --- a/src/Makefile +++ b/src/Makefile @@ -35,7 +35,11 @@ OBJS := \ dir := ./components/syslogd include $(dir)/syslog.mk OBJS += $(OBJS_$(dir)) - + +dir := ./components/redis +include $(dir)/redis.mk +OBJS += $(OBJS_$(dir)) + dir := ./rt include $(dir)/rt.mk OBJS += $(OBJS_$(dir)) diff --git a/src/cert_init.h b/src/cert_init.h index 869c8b6..d44b300 100644 --- a/src/cert_init.h +++ b/src/cert_init.h @@ -15,6 +15,8 @@ #include #include +#include "rd_lock.h" + struct request_t{ #define DATALEN 64 char host[DATALEN]; @@ -25,6 +27,8 @@ struct request_t{ int valid; + struct rd_lock_scb mtx; + struct evhttp_request *evh_req; }; diff --git a/src/cert_session.c b/src/cert_session.c index 5b96c5b..e7d7a65 100644 --- a/src/cert_session.c +++ b/src/cert_session.c @@ -25,6 +25,7 @@ #include "rt_common.h" #include "rt_stdlib.h" #include "rt_file.h" +#include "rt_time.h" #include "cert_init.h" #include "async.h" #include "read.h" @@ -47,7 +48,7 @@ static libevent_thread *threads; struct fs_stats_t{ - int line_ids[3]; + int line_ids[4]; screen_stat_handle_t handle; }; @@ -58,6 +59,11 @@ static struct fs_stats_t SGstats = { #define sizeof_seconds(x) (x * 24 * 60 * 60) +rt_mutex entries_mtx = PTHREAD_MUTEX_INITIALIZER; + +uint64_t startTime = 0; +uint64_t endTime = 0; + void connectCallback(const struct redisAsyncContext *c, int status) { if (status != REDIS_OK) { mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Redis connect error : %s\n", c->errstr); @@ -562,7 +568,19 @@ X509 *x509_create_cert(char *host, int days) return x509; } -int cert_redis_init(struct event_base *base, struct redisAsyncContext **cl_ctx) +int redis_sync_int(struct redisContext **c) +{ + struct config_bucket_t *redis = cert_default_config(); + + struct timeval timeout = { 1, 500000 }; // 1.5 seconds + + *c = redisConnectWithTimeout(redis->r_ip, redis->r_port, timeout); + + return 0; +} + + +int redis_rsync_init(struct event_base *base, struct redisAsyncContext **cl_ctx) { int xret = -1; struct config_bucket_t *redis = cert_default_config(); @@ -587,10 +605,18 @@ rd_set_callback(redisAsyncContext __attribute__((__unused__))*c, void *r, { redisReply *reply = (redisReply*)r; - char *host = (char *)privdata; + struct request_t *request = (struct request_t *)privdata; + +#ifdef RD_MUTEX_LOCK + libevent_thread *thread = threads + request->thread_id; + rd_mutex_unlock(&request->mtx, thread->sync); +#endif + if(reply->type == REDIS_REPLY_ERROR){ - mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Writing data(key = %s) to redis failed", host); + mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Writing data(key = %s) to redis failed", request->host); } + + kfree(request); return; } @@ -657,16 +683,42 @@ finish: return xret; } +static int fs_internal_operate(int id, int id2, int column_id, int column_id2, long long diffTime) +{ + int ret = -1, value = -1; + screen_stat_handle_t handle = SGstats.handle; + + FS_internal_operate(handle, id, column_id, FS_OP_ADD, 1); + + if (id2 < 0) + goto finish; + + FS_internal_operate(handle, id2, 0, FS_OP_ADD, 1); + + if (column_id2 < 0) + goto finish; + + value = FS_internal_operate(handle, id, column_id, FS_OP_GET, 0); + if (value < 0) + goto finish; + + ret = FS_internal_operate(handle, id, column_id2, FS_OP_SET, diffTime/value); +finish: + return ret; +} + static int -rd_decode_sendbuf(struct request_t *request, redisAsyncContext *c, char *sendbuf) +rd_encode_sendbuf(struct request_t *request, redisAsyncContext *c, char *sendbuf) { int xret = -1; + uint64_t startTime = 0, endTime = 0; libevent_thread *thread = threads + request->thread_id; struct config_bucket_t *rte = cert_default_config(); char cert[SG_DATA_SIZE] = {0}, pubkey[SG_DATA_SIZE] = {0}; + startTime = rt_time_ms(); x509_online_append(request->host, thread->key, thread->root, cert, pubkey); if (cert[0] == '\0' && pubkey[0] == '\0'){ mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to issue certificate"); @@ -674,36 +726,44 @@ rd_decode_sendbuf(struct request_t *request, redisAsyncContext *c, char *sendbuf goto finish; } - FS_internal_operate(SGstats.handle,thread->column_ids,thread->field_ids,SGstats.line_ids[2], FS_OP_ADD, 1); + endTime = rt_time_ms(); + thread->diffTime += (endTime - startTime); + //printf("%lu - %lu = %lu(%lu)\n", startTime, endTime, endTime - startTime, thread->diffTime); + fs_internal_operate(thread->column_ids, thread->field_ids, SGstats.line_ids[2], SGstats.line_ids[3], thread->diffTime); snprintf(sendbuf, SG_DATA_SIZE * 2, "%s%s", pubkey, cert); - xret = redisAsyncCommand(c, rd_set_callback, request->host, "SETEX %s %d %s", + xret = redisAsyncCommand(c, rd_set_callback, request, "SETEX %s %d %s", request->host, sizeof_seconds(rte->days), sendbuf); if (xret < 0){ mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to set information to redis server"); goto finish; } - xret = 0; finish: return xret; } static int -rd_encode_sendbuf(struct request_t *request, redisReply *reply, char *sendbuf) +rd_decode_sendbuf(struct request_t *request, redisReply *reply, char *sendbuf) { int xret = -1; libevent_thread *thread = threads + request->thread_id; +#ifdef RD_MUTEX_LOCK + rd_mutex_unlock(&request->mtx, thread->sync); +#endif if (reply && reply->str){ - FS_internal_operate(SGstats.handle,thread->column_ids,thread->field_ids,SGstats.line_ids[1],FS_OP_ADD,1); + fs_internal_operate(thread->column_ids,thread->field_ids, SGstats.line_ids[1], -1, 0); + snprintf(sendbuf, SG_DATA_SIZE * 2, "%s", reply->str); xret = 0; } else{ evhttp_send_error(request->evh_req, HTTP_BADREQUEST, 0); } + + kfree(request); return xret; } @@ -720,14 +780,14 @@ void rd_get_callback(redisAsyncContext *c, void *r, void *privdata) case REDIS_REPLY_STRING: mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Sends the certificate information to the requestor"); - xret = rd_encode_sendbuf(request, reply, sendbuf); + xret = rd_decode_sendbuf(request, reply, sendbuf); break; case REDIS_REPLY_NIL: /* Certificate information modification and Strategy to judge**/ mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Generating certificate information"); - xret = rd_decode_sendbuf(request, c, sendbuf); + xret = rd_encode_sendbuf(request, c, sendbuf); break; default: break; @@ -737,7 +797,7 @@ void rd_get_callback(redisAsyncContext *c, void *r, void *privdata) evhttp_socket_send(request->evh_req, sendbuf); finish: - kfree(request); + //kfree(request); return; } @@ -893,7 +953,7 @@ pthread_work_proc(struct evhttp_request *evh_req, void *arg) case EVHTTP_REQ_PATCH: cmdtype = "PATCH"; break; default: cmdtype = "unknown"; break; } - FS_internal_operate(SGstats.handle,thread_info->column_ids,-1,SGstats.line_ids[0], FS_OP_ADD, 1); + fs_internal_operate(thread_info->column_ids, -1, SGstats.line_ids[0], -1, 0); rt_decode_uri(uri, request->host, &request->flag, &request->valid); mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "[Thread %d]Received a %s request for %s, host:%s, flag:%d, valid:%d\nHeaders:", @@ -901,7 +961,9 @@ pthread_work_proc(struct evhttp_request *evh_req, void *arg) request->flag, request->valid); if (request->host[0] != '\0' && request->evh_req != NULL){ - +#ifdef RD_MUTEX_LOCK + rd_mutex_lock("key", 30, &request->mtx, thread_info->sync); +#endif xret = redisAsyncCommand(thread_info->cl_ctx, rd_get_callback, request, "GET %s", request->host); if (xret < 0) mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to get information from redis server"); @@ -927,11 +989,14 @@ cert_trapper_task_int(struct event_base *base, libevent_thread *me) int xret = -1; /* Initialize the redis connection*/ - xret = cert_redis_init(base, &me->cl_ctx); + xret = redis_rsync_init(base, &me->cl_ctx); if (xret < 0 || !me->cl_ctx){ mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Initialize the redis connection is failure\n"); goto finish; } + + xret = redis_sync_int(&me->sync); + /* Initialize the X509 CA*/ xret = x509_privatekey_init(&me->key, &me->root); if (xret < 0 || !me->key || !me->root){ @@ -1064,6 +1129,9 @@ libevent_socket_init() goto finish; } + /*mutex init **/ + rd_lock_init(); + threads = calloc(thread_nu, sizeof(libevent_thread)); if (! threads) { mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Can't allocate thread descriptors"); @@ -1148,6 +1216,9 @@ fs_screen_init() snprintf(buff,sizeof(buff),"%s", "sign"); SGstats.line_ids[2] = FS_internal_register(SGstats.handle, FS_STYLE_COLUMN, FS_CALC_CURRENT, buff); + snprintf(buff,sizeof(buff),"%s", "ssl(ms)"); + SGstats.line_ids[3] = FS_internal_register(SGstats.handle, FS_STYLE_COLUMN, FS_CALC_CURRENT, buff); + FS_internal_start(SGstats.handle); return 0; diff --git a/src/cert_session.h b/src/cert_session.h index 2512707..848c0b4 100644 --- a/src/cert_session.h +++ b/src/cert_session.h @@ -12,22 +12,6 @@ #include "MESA_list_queue.h" #include "rt_sync.h" -enum conn_states { - conn_listening, /**< the socket which listens for connections */ - conn_new_cmd, /**< Prepare connection for next command */ - conn_waiting, /**< waiting for a readable socket */ - conn_read, /**< reading in a command line */ - conn_parse_cmd, /**< try to parse a command from the input buffer */ - conn_write, /**< writing out a simple response */ - conn_nread, /**< reading in a fixed number of bytes */ - conn_swallow, /**< swallowing unnecessary bytes w/o storing */ - conn_closing, /**< closing this connection */ - conn_mwrite, /**< writing out many items sequentially */ - conn_closed, /**< connection is closed */ - conn_watch, /**< held by the logger thread as a watcher */ - conn_max_state /**< Max state value (used for assertion) */ -}; - typedef struct { int id; @@ -43,11 +27,16 @@ typedef struct { struct redisAsyncContext *cl_ctx; + struct redisContext *sync; + void * (*routine)(void *); /** Executive entry */ int field_ids; /* dispaly */ int column_ids; + + uint64_t diffTime; + } libevent_thread; extern int cert_session_init(); diff --git a/src/components/redis/rd_lock.c b/src/components/redis/rd_lock.c new file mode 100644 index 0000000..68587b2 --- /dev/null +++ b/src/components/redis/rd_lock.c @@ -0,0 +1,206 @@ +/************************************************************************* + > File Name: rd_lock.c + > Author: + > Mail: + > Created Time: 2018Äê07ÔÂ05ÈÕ ÐÇÆÚËÄ 11ʱ01·Ö39Ãë + ************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rd_lock.h" +#include "rt_string.h" + +struct rd_RedLock{ + float m_clockDriftFactor; + sds m_unlockScript; + int m_retryCount; + int m_retryDelay; + char *m_continueLockScript; +}; + +static struct rd_RedLock redlock = { + .m_clockDriftFactor = 0.01, + .m_unlockScript = NULL, + .m_retryCount = 0, + .m_retryDelay = 0, + .m_continueLockScript = NULL, +}; + +struct rd_RedLock *mutx_redlock() +{ + return &redlock; +} + +static char * +get_unique_lockid() +{ + int i = 0; + char *s = NULL; + char value[10] = "0123456789"; + unsigned char buffer[20]; + + struct timeval t1; + gettimeofday(&t1, NULL); + srand(t1.tv_usec * t1.tv_sec); + + for (int i = 0; i < 20; ++i) { + buffer[i] = value[rand() % 10]; + } + //»ñÈ¡20byteµÄËæ»úÊý¾Ý + s = sdsempty(); + for (i = 0; i < 20; i++) { + s = sdscatprintf(s, "%02X", buffer[i]); + } + + return s; +} + +static int +rd_lock_instance(redisContext *c, const char *resource, + const char *val, const int ttl) +{ + int xret = 0; + redisReply *reply; + + reply = (redisReply *)redisCommand(c, "set %s %s px %d nx", resource, val, ttl); + if (NULL == reply) + goto finish; + + //printf("Set return: %s [null == fail, OK == success]\n", reply->str); + + if (reply->str && STRCMP(reply->str, "OK") == 0) { + xret = 1; + } + freeReplyObject(reply); + +finish: + return xret; +} + +static char **convertToSds(int count, char** args) +{ + int j; + char **sds = (char**)malloc(sizeof(char*)*count); + for(j = 0; j < count; j++) + sds[j] = sdsnew(args[j]); + return sds; +} + +redisReply *rd_command_argv(redisContext *c, int argc, char **inargv) +{ + redisReply *reply = NULL; + + char **argv; + argv = convertToSds(argc, inargv); + + size_t *argvlen; + argvlen = (size_t *)malloc(argc * sizeof(size_t)); + + for (int j = 0; j < argc; j++) + argvlen[j] = sdslen(argv[j]); + + reply = (redisReply *)redisCommandArgv(c, argc, (const char **)argv, argvlen); + if (reply) { + //printf("RedisCommandArgv return: %lld\n", reply->integer); + } + free(argvlen); + sdsfreesplitres(argv, argc); + return reply; +} + +int rd_mutex_unlock(struct rd_lock_scb *mtx, struct redisContext *c) +{ + int argc = 5; + struct rd_RedLock *redlock = mutx_redlock(); + + char *unlockScriptArgv[] = {(char*)"EVAL", + redlock->m_unlockScript, + (char*)"1", + (char*)mtx->m_resource, + (char*)mtx->m_val}; + + redisReply *reply = rd_command_argv(c, argc, unlockScriptArgv); + if (reply) { + freeReplyObject(reply); + } + + if (reply->integer){ + sdsfree(mtx->m_resource); + sdsfree(mtx->m_val); + } + return 0; +} + +/* redis lock*/ +int rd_mutex_lock(const char *resource, const int ttl, + struct rd_lock_scb *mtx, struct redisContext *c) +{ + struct rd_RedLock *redlock = mutx_redlock(); + + char *val = NULL; + int retryCount =0, xret = 0; + + val = get_unique_lockid(); + if (!val) { + return xret; + } + mtx->m_resource = sdsnew(resource); + mtx->m_val = val; + retryCount = redlock->m_retryCount; + + do { + int n = 0; + int startTime = (int)time(NULL) * 1000; + + if (c == NULL || c->err) { + goto finish; + } + + if (rd_lock_instance(c, resource, val, ttl)) { + n++; + } + + int drift = (ttl * redlock->m_clockDriftFactor) + 2; + int validityTime = ttl - ((int)time(NULL) * 1000 - startTime) - drift; + //printf("The resource validty time is %d, n is %d\n", + // validityTime, n); + + if (n > 0 && validityTime > 0) { + mtx->m_validityTime = validityTime; + xret = 1; + goto finish; + } else { + printf("The resource validty time is %d, n is %d\n", + validityTime, n); + } + // Wait a random delay before to retry + int delay = rand() % redlock->m_retryDelay + floor(redlock->m_retryDelay / 2); + printf("[Test] delay = %d\n", delay); + usleep(delay * 1000); + retryCount--; + } while (retryCount > 0); + +finish: + return xret; +} + +void rd_lock_init() +{ + struct rd_RedLock *rdlock = mutx_redlock(); + + rdlock->m_continueLockScript = sdsnew("if redis.call('get', KEYS[1]) == ARGV[1] then redis.call('del', KEYS[1]) end return redis.call('set', KEYS[1], ARGV[2], 'px', ARGV[3], 'nx')"); + rdlock->m_unlockScript = sdsnew("if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"); + rdlock->m_retryCount = 8; + rdlock->m_retryDelay = 10; + rdlock->m_clockDriftFactor = 0.01; + + return; +} + diff --git a/src/components/redis/rd_lock.h b/src/components/redis/rd_lock.h new file mode 100644 index 0000000..a6a9b74 --- /dev/null +++ b/src/components/redis/rd_lock.h @@ -0,0 +1,26 @@ +/************************************************************************* + > File Name: rd_lock.h + > Author: + > Mail: + > Created Time: 2018å¹´07月05æ—¥ 星期四 11æ—¶02分03ç§’ + ************************************************************************/ + +#ifndef _RD_LOCK_H +#define _RD_LOCK_H + +#include "hiredis.h" + +struct rd_lock_scb{ + int m_validityTime; + sds m_resource; + sds m_val; +}; + +void rd_lock_init(); + +int rd_mutex_lock(const char *resource, const int ttl, + struct rd_lock_scb *mtx, struct redisContext *c); + +int rd_mutex_unlock(struct rd_lock_scb *mtx, struct redisContext *c); + +#endif diff --git a/src/components/redis/redis.mk b/src/components/redis/redis.mk new file mode 100644 index 0000000..5baf45d --- /dev/null +++ b/src/components/redis/redis.mk @@ -0,0 +1,40 @@ + + +# standard component Makefile header +sp := $(sp).x +dirstack_$(sp) := $(d) +d := $(dir) + +# component specification + +OBJS_$(d) :=\ + $(OBJ_DIR)/rd_lock.o\ + +CFLAGS_LOCAL += -I$(d) +$(OBJS_$(d)): CFLAGS_LOCAL := -std=gnu99 -W -Wall -Wunused-parameter -g -O3 \ + -I$(d)\ + -I$(d)/../../rt\ + -I$(d)/../../inc\ + + +# standard component Makefile rules + +DEPS_$(d) := $(OBJS_$(d):.o=.d) + +#LIBS_LIST := $(LIBS_LIST) $(LIBRARY) +LIBS_LIST := $(LIBS_LIST) + +CLEAN_LIST := $(CLEAN_LIST) $(OBJS_$(d)) $(DEPS_$(d)) + +-include $(DEPS_$(d)) + +#$(LIBRARY): $(OBJS) +# $(MYARCHIVE) + +$(OBJ_DIR)/%.o: $(d)/%.c + $(COMPILE) + +# standard component Makefile footer + +d := $(dirstack_$(sp)) +sp := $(basename $(sp)) diff --git a/src/inc/field_stat2.h b/src/inc/field_stat2.h index 6b7ca4a..d27c309 100644 --- a/src/inc/field_stat2.h +++ b/src/inc/field_stat2.h @@ -21,7 +21,8 @@ enum field_calc_algo enum field_op { FS_OP_ADD=1, - FS_OP_SET + FS_OP_SET, + FS_OP_GET, }; diff --git a/src/inc/moodycamel_field_stat2.cpp b/src/inc/moodycamel_field_stat2.cpp index d872083..a618b26 100644 --- a/src/inc/moodycamel_field_stat2.cpp +++ b/src/inc/moodycamel_field_stat2.cpp @@ -15,7 +15,7 @@ extern "C" int FS_internal_set_para(screen_stat_handle_t handle, enum FS_option extern "C" void FS_internal_start(screen_stat_handle_t handle); extern "C" int FS_internal_register(screen_stat_handle_t handle,enum field_dsp_style_t style, enum field_calc_algo calc_type,const char* name); -extern "C" int FS_internal_operate(screen_stat_handle_t handle,int id,int id2,int column_id,enum field_op op,long long value); +extern "C" int FS_internal_operate(screen_stat_handle_t handle,int id,int column_id,enum field_op op,long long value); screen_stat_handle_t FS_internal_create_handle(void) { @@ -38,19 +38,8 @@ int FS_internal_register(screen_stat_handle_t handle,enum field_dsp_style_t styl return FS_register(handle, style, calc_type, name); } -int FS_internal_operate(screen_stat_handle_t handle,int id,int id2,int column_id,enum field_op op,long long value) +int FS_internal_operate(screen_stat_handle_t handle,int id,int column_id,enum field_op op,long long value) { - int ret = -1; - - ret = FS_operate(handle, id, column_id, op, value); - if (ret < 0) - goto finish; - - if (id2 < 0) - goto finish; - - ret = FS_operate(handle, id2, 0, op, value); -finish: - return ret; + return FS_operate(handle, id, column_id, op, value); } diff --git a/src/inc/moodycamel_field_stat2.h b/src/inc/moodycamel_field_stat2.h index 31b4a10..64d8a52 100644 --- a/src/inc/moodycamel_field_stat2.h +++ b/src/inc/moodycamel_field_stat2.h @@ -23,7 +23,8 @@ enum field_calc_algo enum field_op { FS_OP_ADD=1, - FS_OP_SET + FS_OP_SET, + FS_OP_GET, }; typedef void* screen_stat_handle_t; @@ -53,6 +54,6 @@ void FS_internal_start(screen_stat_handle_t handle); int FS_internal_register(screen_stat_handle_t handle,enum field_dsp_style_t style, enum field_calc_algo calc_type,const char* name); -int FS_internal_operate(screen_stat_handle_t handle,int id,int id2,int column_id,enum field_op op,long long value); +int FS_internal_operate(screen_stat_handle_t handle,int id,int column_id,enum field_op op,long long value); #endif diff --git a/src/lib/libMESA_field_stat2.a b/src/lib/libMESA_field_stat2.a index bc1b2c2c87c6f5a0146258ac707a057ee1bfd393..7ba8281c5306be7075f782b21cd6c41f5fcac0cf 100644 GIT binary patch delta 14820 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 H*yR5K_`uu4 delta 14885 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

wI6v#&##4iWx4?_g!^GNZscdEjRV+=ouDJ z7!;m1ye7FT<8qn&h$me7k&tBDmCo>%gg?dfNdHDKycYGx+rOdZnNV{oVPY<_*_!Na z$T?$}^B-X8(PEcC{ux7ESF-ZVY8Ah*-0KI!lzVGkx~hv`;$J7oLsl;Bfs7pqML!sB zS)z*>dpiNn{-A3KNuZv41P&($K>Ks}UlbwdT&k+T{Bs?(HP+Xx;n#DC>KceR-%;HO z+4wUA=Ht)i@E!h)goq0rYj;Yq3|C4Z=R#`jj3sujITT(<)qd{{-(ToZ>%A-lLA@9b zNk1m4uR!*X9c%9q7`8r8_+u(g@f~7y`rFtC5PdOKT@Tq8J8CB;im!XaCl?d7a}(kF kiygF`Cqci|K`n*sOC8m>VE(0!{?0e-f&Z-qgU-eLKd`*U*Z=?k