这篇教程C++ ustime函数代码示例写得很实用,希望能帮到您。
本文整理汇总了C++中ustime函数的典型用法代码示例。如果您正苦于以下问题:C++ ustime函数的具体用法?C++ ustime怎么用?C++ ustime使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。 在下文中一共展示了ustime函数的26个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。 示例1: _timer_instancestatic void* _timer_instance(void *arg){ int fatal; static int fatal_count = 0; struct timeval timeout; kv_timer_event_t *ev; kv_timer_t *timer = (kv_timer_t*)arg; assert(timer->state == KV_TIMER_STATE_LOADING); timer->state = KV_TIMER_STATE_RUNNING; for (;;) { timeout.tv_sec = 0; timeout.tv_usec = timer->interval; /** interval is very short, ignore signal interrupt */ fatal = select(0, NULL, NULL, NULL, &timeout); if (fatal == -1) { fatal_count++; if (fatal_count >= 3) abort(); continue; } fatal_count = 0; ev = timer->list; while(ev) { if (ustime() - ev->elapse_base >= ev->timeout) { ev->elapse_base = ustime(); /** restart */ ev->proc(); } ev = ev->next; } }}
开发者ID:jianzi123,项目名称:my_libucmq,代码行数:32,
示例2: busysleepvoid busysleep(int usec) { int64_t t = ustime() + usec; while (t > ustime()) { ; // Nothing. }}
开发者ID:erikdubbelboer,项目名称:erik-misc-code,代码行数:7,
示例3: do_delete_eventint do_delete_event(struct redisClient *c,sds funcname){ redisSrand48(0); server.lua_random_dirty = 0; server.lua_write_dirty = 0; lua_getglobal(server.lua,(char *)funcname); if (lua_isnil(server.lua,1)) { addReplyError(c,"no funcname triggle_scipts in lua"); return 0; } luaTriggleSetGlobalArray(server.lua,"KEYS",c->argv+1,c->argc-1); redisLog(REDIS_NOTICE,"stack: %d",lua_gettop(server.lua));#ifdef BRIDGE_DEBUG for(int i=0;i<c->argc-1;i++){ redisLog(REDIS_NOTICE,"%s",(c->argv+1)[i]->ptr); }#endif selectDb(server.lua_client,c->db->id); server.lua_time_start = ustime()/1000; server.lua_kill = 0; if (server.lua_time_limit > 0) { lua_sethook(server.lua,luaMaskCountHook,LUA_MASKCOUNT,100000); server.lua_time_start = ustime()/1000; } else { lua_sethook(server.lua,luaMaskCountHook,0,0); } if (lua_pcall(server.lua,0,1,0)) { selectDb(c,server.lua_client->db->id); addReplyErrorFormat(c,"Error running script (call to %s): %s/n", (char*)funcname, lua_tostring(server.lua,-1)); lua_pop(server.lua,1); lua_gc(server.lua,LUA_GCCOLLECT,0); return -1; } selectDb(c,server.lua_client->db->id); // luaReplyToRedisReply(c,server.lua); server.lua_timedout = 0; server.lua_caller = NULL; lua_gc(server.lua,LUA_GCSTEP,1); //for slaves // return 0; }
开发者ID:crestxu,项目名称:redis-triggle,代码行数:58,
示例4: pagerank_redis// get web from redis and calculate pagerankvoid pagerank_redis(redisContext **conts, float v_quadratic_error, web* w) { redisContext *c = conts[0]; redisReply *reply; long long t_start; long long t_end; unsigned int i; float q = 1; printf("Start PageRank from redis: /n"); printf("Damping factor: %f/n", g_damping_factor); printf("Quadratic error range: %f/n", v_quadratic_error); printf("----------------------------------/n"); reply = redisCommand(c, "GET next.uid"); if (reply->str == NULL) die("Cannot not find data in redis!"); unsigned long user_num = atol(reply->str) + 1; printf("user num: %ld/n", user_num); freeReplyObject(reply); t_start = ustime(); if (w->size == 0) { for (i = 0; i < g_n_sharded; ++i) { reply = redisCommand(conts[i], "DEL newly.edited.linkto"); freeReplyObject(reply); reply = redisCommand(conts[i], "DEL newly.edited.linkfrom"); freeReplyObject(reply); } web_init(w, user_num); gen_web_sharded_redis(conts, w, 0); } else { size_t origin_size = w->size; web_init_from_oldweb(w, user_num); printf("web expansion fin..."); update_web_sharded_redis(conts, w); printf("web update fin.../n"); //printf("origin dangpage size: %zd/n", w->dangling_pages->size); update_dangling_pages(w, origin_size); //printf("updated dangpage size: %zd/n", w->dangling_pages->size); } printf("dangling user size: %zd/n", w->dangling_pages->size); t_end = ustime(); printf("init: %lf seconds/n", getruntime(t_end, t_start)); t_start = ustime(); for (i = 1; q > v_quadratic_error; ++i) { q = calculate_pagerank_parallel(w); //printf("iteration %d deviate value: %f/n", i, q); //web_display_pagerank(w); } t_end = ustime(); printf("calculate: %lf seconds(%d iterations)/n", getruntime(t_end, t_start), i - 1);}
开发者ID:markzhai,项目名称:PageRank-on-weibo-user-connection,代码行数:55,
示例5: call/* Call() is the core of execution of a command */static void call(ugClient *c, int flags) { long long start = ustime(), duration; /* Call the command. */ c->cmd->proc(c); duration = ustime()-start; c->cmd->microseconds += duration; c->cmd->calls++;}
开发者ID:cinience,项目名称:saker,代码行数:12,
示例6: rewriteAppendOnlyFileBackground/* This is how rewriting of the append only file in background works: * * 1) The user calls BGREWRITEAOF * 2) Redis calls this function, that forks(): * 2a) the child rewrite the append only file in a temp file. * 2b) the parent accumulates differences in server.aof_rewrite_buf. * 3) When the child finished '2a' exists. * 4) The parent will trap the exit code, if it's OK, will append the * data accumulated into server.aof_rewrite_buf into the temp file, and * finally will rename(2) the temp file in the actual file name. * The the new file is reopened as the new append only file. Profit! */int rewriteAppendOnlyFileBackground(void) { pid_t childpid; long long start; if (server.aof_child_pid != -1) return REDIS_ERR; start = ustime(); if ((childpid = fork()) == 0) { char tmpfile[256]; /* Child */ closeListeningSockets(0); redisSetProcTitle("redis-aof-rewrite"); snprintf(tmpfile,256,"temp-rewriteaof-bg-%d.aof", (int) getpid()); if (rewriteAppendOnlyFile(tmpfile) == REDIS_OK) { size_t private_dirty = zmalloc_get_private_dirty(); if (private_dirty) { redisLog(REDIS_NOTICE, "AOF rewrite: %zu MB of memory used by copy-on-write", private_dirty/(1024*1024)); } exitFromChild(0); } else { exitFromChild(1); } } else { /* Parent */ server.stat_fork_time = ustime()-start; server.stat_fork_rate = (double) zmalloc_used_memory() * 1000000 / server.stat_fork_time / (1024*1024*1024); /* GB per second. */ latencyAddSampleIfNeeded("fork",server.stat_fork_time/1000); if (childpid == -1) { redisLog(REDIS_WARNING, "Can't rewrite append only file in background: fork: %s", strerror(errno)); return REDIS_ERR; } redisLog(REDIS_NOTICE, "Background append only file rewriting started by pid %d",childpid); server.aof_rewrite_scheduled = 0; server.aof_rewrite_time_start = time(NULL); server.aof_child_pid = childpid; updateDictResizePolicy(); /* We set appendseldb to -1 in order to force the next call to the * feedAppendOnlyFile() to issue a SELECT command, so the differences * accumulated by the parent into server.aof_rewrite_buf will start * with a SELECT statement and it will be safe to merge. */ server.aof_selected_db = -1; replicationScriptCacheFlush(); return REDIS_OK; } return REDIS_OK; /* unreached */}
开发者ID:kamparo,项目名称:tweet,代码行数:64,
示例7: luaMaskCountHook/* * 脚本超时钩子 */void luaMaskCountHook(lua_State *lua, lua_Debug *ar){ long long elapsed; REDIS_NOTUSED(ar); REDIS_NOTUSED(lua); // 计算已执行时间 elapsed = (ustime()/1000) - server.lua_time_start; if (elapsed >= server.lua_time_limit && server.lua_timedout == 0) { redisLog(REDIS_WARNING,"Lua slow script detected: still in execution after %lld milliseconds. You can try killing the script using the SCRIPT KILL command.",elapsed); // 已超时 server.lua_timedout = 1; /* Once the script timeouts we reenter the event loop to permit others * to call SCRIPT KILL or SHUTDOWN NOSAVE if needed. For this reason * we need to mask the client executing the script from the event loop. * If we don't do that the client may disconnect and could no longer be * here when the EVAL command will return. */ // 当脚本运行超时时,将正在执行的客户端从读事件中移除 // 并允许其他客户端执行 SCRIPT KILL 或者 SHUTDOWN NOSAVE aeDeleteFileEvent(server.el, server.lua_caller->fd, AE_READABLE); } if (server.lua_timedout) // 在脚本上下文中,启动文件事件处理(等待 SCRIPT KILL 或 SHUTDOWN NOSAVE) aeProcessEvents(server.el, AE_FILE_EVENTS|AE_DONT_WAIT); if (server.lua_kill) { // 杀死脚本 redisLog(REDIS_WARNING,"Lua script killed by user with SCRIPT KILL."); lua_pushstring(lua,"Script killed by user with SCRIPT KILL..."); lua_error(lua); }}
开发者ID:jiangguang5201314,项目名称:ZNginx,代码行数:36,
示例8: write_handlerstatic void write_handler(ae_event_loop *el, int fd, void *priv, int mask) { client *c = (client *)priv; /* Initialize request when nothing was written. */ if (c->written == 0) { if (conf.requests_issued++ >= conf.requests) { free_client(c); return; } c->start = ustime(); c->latency = -1; } if (sdslen(c->obuf) > c->written) { char *ptr = c->obuf + c->written; int nwritten = write(c->fd, ptr, sdslen(c->obuf) - c->written); if (nwritten == -1) { if (errno != EPIPE) { fprintf(stderr, "write failed:%s/n", strerror(errno)); } free_client(c); return; } c->written += nwritten; if (sdslen(c->obuf) == c->written) { ae_delete_file_event(conf.el, c->fd, AE_WRITABLE); ae_create_file_event(conf.el, c->fd, AE_READABLE, read_handler, c); } }}
开发者ID:flygoast,项目名称:verben,代码行数:34,
示例9: luaMaskCountHook// 判断超时,并作超时的处理void luaMaskCountHook(lua_State *lua, lua_Debug *ar) { long long elapsed; REDIS_NOTUSED(ar); REDIS_NOTUSED(lua); // 计算已经超时的时间 elapsed = (ustime()/1000) - server.lua_time_start; if (elapsed >= server.lua_time_limit && server.lua_timedout == 0) { redisLog(REDIS_WARNING,"Lua slow script detected: still in execution after %lld milliseconds. You can try killing the script using the SCRIPT KILL command.",elapsed); server.lua_timedout = 1; // 超时了,关闭监听发送 lua 脚本命令的客户端 /* Once the script timeouts we reenter the event loop to permit others * to call SCRIPT KILL or SHUTDOWN NOSAVE if needed. For this reason * we need to mask the client executing the script from the event loop. * If we don't do that the client may disconnect and could no longer be * here when the EVAL command will return. */ aeDeleteFileEvent(server.el, server.lua_caller->fd, AE_READABLE); } // lua 脚本执行超时,redis 会检测对否有其他客户端会发送 SCRIPT KILL 命令 // 尝试终结这个脚本的执行 if (server.lua_timedout) aeProcessEvents(server.el, AE_FILE_EVENTS|AE_DONT_WAIT); // 如果 lua 脚本被停止了,强制产生错误,结束 lua if (server.lua_kill) { redisLog(REDIS_WARNING,"Lua script killed by user with SCRIPT KILL."); lua_pushstring(lua,"Script killed by user with SCRIPT KILL..."); lua_error(lua); }}
开发者ID:daoluan,项目名称:decode-redis-2.8,代码行数:33,
示例10: readHandlerstatic void readHandler(aeEventLoop *el, int fd, void *privdata, int mask) { client c = privdata; void *reply = NULL; REDIS_NOTUSED(el); REDIS_NOTUSED(fd); REDIS_NOTUSED(mask); /* Calculate latency only for the first read event. This means that the * server already sent the reply and we need to parse it. Parsing overhead * is not part of the latency, so calculate it only once, here. */ if (c->latency < 0) c->latency = ustime()-(c->start); if (redisBufferRead(c->context) != REDIS_OK) { fprintf(stderr,"Error: %s/n",c->context->errstr); exit(1); } else { if (redisGetReply(c->context,&reply) != REDIS_OK) { fprintf(stderr,"Error: %s/n",c->context->errstr); exit(1); } if (reply != NULL) { if (reply == (void*)REDIS_REPLY_ERROR) { fprintf(stderr,"Unexpected error reply, exiting.../n"); exit(1); } if (config.requests_finished < config.requests) config.latency[config.requests_finished++] = c->latency; clientDone(c); } }}
开发者ID:ambakshi,项目名称:redis,代码行数:32,
示例11: ustime/* convert a linked list encoding to a list array encoding */robj *cowListCopy(robj *val) { long long sttime; robj *newval; sttime = ustime(); if (val->encoding == REDIS_ENCODING_ZIPLIST) { size_t bytes; redisLog(REDIS_NOTICE, "cowListCopy REDIS_ENCODING_ZIPLIST"); newval = createZiplistObject(); /* do raw memory copy */ bytes = ziplistBlobLen(val->ptr); newval->ptr = zrealloc(newval->ptr, bytes); memcpy(newval->ptr, val->ptr, bytes); return newval; } else if (val->encoding == REDIS_ENCODING_LINKEDLIST) { list *list = val->ptr; cowListArray *lar; redisLog(REDIS_NOTICE, "cowListCopy REDIS_ENCODING_LINKEDLIST"); lar = cowConvertListToArray(list); newval = createObject(REDIS_LIST, lar); newval->encoding = REDIS_ENCODING_LINKEDLISTARRAY; return newval; } else { /* error. unexpected encoding */ return NULL; }}
开发者ID:lrascao,项目名称:redis,代码行数:30,
示例12: cowEnsureExpiresCopy/* if copy on write active, then ensure there is a copy of the value that is safe to modify or delete, and update DB dict entry to refer to this value*/void cowEnsureExpiresCopy(redisDb *db) { long long sttime; if (server.isBackgroundSaving == 0 || server.cowDictCopied == NULL || server.cowSaveDb[db->id].expires == NULL) { /* no copy needed */ return; } else { /* ensure DB expires is copied */ if (server.cowSaveDb[db->id].expires == server.db[db->id].expires) { sttime = ustime(); server.db[db->id].expires = copyonwrite_dictobj(server.cowSaveDb[db->id].expires, NULL); redisLog(REDIS_NOTICE, "elapsed COW DB expires time %d", (unsigned int)(ustime() - sttime)); } }}
开发者ID:lrascao,项目名称:redis,代码行数:20,
示例13: readHandlerstatic void readHandler(aeEventLoop *el, int fd, void *privdata, int mask) { client c = privdata; void *reply = NULL; REDIS_NOTUSED(el); REDIS_NOTUSED(fd); REDIS_NOTUSED(mask); /* Calculate latency only for the first read event. This means that the * server already sent the reply and we need to parse it. Parsing overhead * is not part of the latency, so calculate it only once, here. */ if (c->latency < 0) c->latency = ustime()-(c->start); if (redisBufferRead(c->context) != REDIS_OK) { fprintf(stderr,"Error: %s/n",c->context->errstr); exit(1); } else { while(c->pending) { if (redisGetReply(c->context,&reply) != REDIS_OK) { fprintf(stderr,"Error: %s/n",c->context->errstr); exit(1); } if (reply != NULL) { if (reply == (void*)REDIS_REPLY_ERROR) { fprintf(stderr,"Unexpected error reply, exiting.../n"); exit(1); } freeReplyObject(reply); /* This is an OK for prefix commands such as auth and select.*/ if (c->prefix_pending > 0) { c->prefix_pending--; c->pending--; /* Discard prefix commands on first response.*/ if (c->prefixlen > 0) { size_t j; sdsrange(c->obuf, c->prefixlen, -1); /* We also need to fix the pointers to the strings * we need to randomize. */ for (j = 0; j < c->randlen; j++) c->randptr[j] -= c->prefixlen; c->prefixlen = 0; } continue; } if (config.requests_finished < config.requests) config.latency[config.requests_finished++] = c->latency; c->pending--; if (c->pending == 0) { clientDone(c); break; } } else { break; } } }}
开发者ID:0x-Jin,项目名称:toolforspider,代码行数:58,
示例14: init_per_lcorestatic voidinit_per_lcore() { lcore_conf_t *qconf; unsigned lcore_id = rte_lcore_id(); qconf = &sk.lcore_conf[lcore_id]; qconf->tsc_hz = rte_get_tsc_hz(); qconf->start_us = (uint64_t )ustime(); qconf->start_tsc = rte_rdtsc();}
开发者ID:liweiwei05,项目名称:shuke,代码行数:9,
示例15: rewriteAppendOnlyFileBackground/* This is how rewriting of the append only file in background works: * * 1) The user calls BGREWRITEAOF * 2) Redis calls this function, that forks(): * 2a) the child rewrite the append only file in a temp file. * 2b) the parent accumulates differences in server.bgrewritebuf. * 3) When the child finished '2a' exists. * 4) The parent will trap the exit code, if it's OK, will append the * data accumulated into server.bgrewritebuf into the temp file, and * finally will rename(2) the temp file in the actual file name. * The the new file is reopened as the new append only file. Profit! */int rewriteAppendOnlyFileBackground(void) { pid_t childpid; long long start; if (server.bgrewritechildpid != -1) return REDIS_ERR; if (server.vm_enabled) waitEmptyIOJobsQueue(); start = ustime(); if ((childpid = fork()) == 0) { char tmpfile[256]; /* Child */ if (server.vm_enabled) vmReopenSwapFile(); if (server.ipfd > 0) close(server.ipfd); if (server.sofd > 0) close(server.sofd); snprintf(tmpfile,256,"temp-rewriteaof-bg-%d.aof", (int) getpid()); if (rewriteAppendOnlyFile(tmpfile) == REDIS_OK) { _exit(0); } else { _exit(1); } } else { /* Parent */ server.stat_fork_time = ustime()-start; if (childpid == -1) { redisLog(REDIS_WARNING, "Can't rewrite append only file in background: fork: %s", strerror(errno)); return REDIS_ERR; } redisLog(REDIS_NOTICE, "Background append only file rewriting started by pid %d",childpid); server.aofrewrite_scheduled = 0; server.bgrewritechildpid = childpid; updateDictResizePolicy(); /* We set appendseldb to -1 in order to force the next call to the * feedAppendOnlyFile() to issue a SELECT command, so the differences * accumulated by the parent into server.bgrewritebuf will start * with a SELECT statement and it will be safe to merge. */ server.appendseldb = -1; return REDIS_OK; } return REDIS_OK; /* unreached */}
开发者ID:BoTreeConsulting,项目名称:multiple_login,代码行数:55,
示例16: kv_timer_addvoid kv_timer_add(kv_timer_t *timer, long long usec, timer_proc proc){ kv_timer_event_t *te; te = zmalloc(sizeof(*te)); te->timeout = usec < 0 ? -usec : usec; te->elapse_base = ustime(); te->proc = proc; te->next = 0; if (!timer->list) { timer->list = te; } else { te->next = timer->list; timer->list = te; }}
开发者ID:jianzi123,项目名称:my_libucmq,代码行数:17,
示例17: writeHandlerstatic void writeHandler(aeEventLoop *el, int fd, void *privdata, int mask) { client c = privdata; REDIS_NOTUSED(el); REDIS_NOTUSED(fd); REDIS_NOTUSED(mask); /* Initialize request when nothing was written. */ if (c->written == 0) { /* Enforce upper bound to number of requests. */ if (config.requests_issued++ >= config.requests) { freeClient(c); return; } /* Really initialize: randomize keys and set start time. */ if (config.randomkeys) randomizeClientKey(c); c->start = ustime(); c->latency = -1; } if (sdslen(c->obuf) > c->written) { void *ptr = c->obuf+c->written;#ifdef _WIN32 int nwritten = send(c->context->fd,ptr,sdslen(c->obuf)-c->written, 0);#else int nwritten = write(c->context->fd,ptr,sdslen(c->obuf)-c->written);#endif if (nwritten == -1) { if (errno != EPIPE) fprintf(stderr, "Writing to socket: %s/n", strerror(errno)); freeClient(c); return; } c->written += nwritten; if (sdslen(c->obuf) == c->written) { aeDeleteFileEvent(config.el,c->context->fd,AE_WRITABLE); aeCreateFileEvent(config.el,c->context->fd,AE_READABLE,readHandler,c); } }}
开发者ID:ambakshi,项目名称:redis,代码行数:40,
示例18: read_handlerstatic void read_handler(ae_event_loop *el, int fd, void *priv, int mask) { client *c = (client *)priv; int nread; char buffer[4096]; nread = read(fd, buffer, 4096); if (nread == -1) { if (errno == EAGAIN) { return; } fprintf(stderr, "Error: %s/n", strerror(errno)); exit(1); } else if (nread == 0) { fprintf(stderr, "Error: %s/n", "Server close connection."); exit(1); } c->read += nread; if (c->read == sdslen(c->obuf)) { c->latency = ustime() - c->start; ++conf.requests_finished; client_done(c); }}
开发者ID:flygoast,项目名称:verben,代码行数:24,
示例19: test_splinlock_speedstatic void test_splinlock_speed() { spinlock_init(&simple_spin); ticketlock_init(&simple_ticket); pthread_t threads[10]; printf("spinlock speed test (lock):/n"); for (int num = 1; num <= 16; num *= 2) { printf("%2d threads: ", num); fflush(stdout); spinlock_lock(&simple_spin); for (int t = 0; t < num; ++t) { pthread_create(&threads[t], 0, simple_spinlock, 0); } int64_t start = ustime(); spinlock_unlock(&simple_spin); for (int t = 0; t < num; ++t) { pthread_join(threads[t], 0); } int64_t end = ustime(); printf("%6ld milliseconds/n", (end - start) / 1000); } printf("spinlock speed test (yieldock):/n"); for (int num = 1; num <= 16; num *= 2) { printf("%2d threads: ", num); fflush(stdout); spinlock_lock(&simple_spin); for (int t = 0; t < num; ++t) { pthread_create(&threads[t], 0, simple_spinlock_yield, 0); } int64_t start = ustime(); spinlock_unlock(&simple_spin); for (int t = 0; t < num; ++t) { pthread_join(threads[t], 0); } int64_t end = ustime(); printf("%6ld milliseconds/n", (end - start) / 1000); } printf("ticketlock speed test (lock):/n"); for (int num = 1; num <= 8; num *= 2) { printf("%2d threads: ", num); fflush(stdout); ticketlock_lock(&simple_ticket); for (int t = 0; t < num; ++t) { pthread_create(&threads[t], 0, simple_ticketlock, 0); } int64_t start = ustime(); ticketlock_unlock(&simple_ticket); for (int t = 0; t < num; ++t) { pthread_join(threads[t], 0); } int64_t end = ustime(); printf("%6ld milliseconds/n", (end - start) / 1000); } printf("ticketlock speed test (yieldlock):/n"); for (int num = 1; num <= 8; num *= 2) { printf("%2d threads: ", num); fflush(stdout); ticketlock_lock(&simple_ticket); for (int t = 0; t < num; ++t) { pthread_create(&threads[t], 0, simple_ticketlock_yield, 0); } int64_t start = ustime(); ticketlock_unlock(&simple_ticket); for (int t = 0; t < num; ++t) { pthread_join(threads[t], 0); }//.........这里部分代码省略.........
开发者ID:erikdubbelboer,项目名称:erik-misc-code,代码行数:101,
示例20: triggle_eventint triggle_event(struct redisClient *c,sds funcname){ redisSrand48(0); server.lua_random_dirty = 0; server.lua_write_dirty = 0; //redisLog(REDIS_NOTICE,"step into stack: %d",lua_gettop(server.lua)); lua_getglobal(server.lua,funcname); if (lua_isnil(server.lua,1)) { lua_pop(server.lua,1); /* remove the nil from the stack */ redisLog(REDIS_NOTICE,"no funcname triggle_scipts in lua"); struct dictEntry *de = dictFind(server.bridge_db.triggle_scipts[c->db->id],funcname); if(de) { struct bridge_db_triggle_t * tmptrg=dictGetVal(de); if (luatriggleCreateFunction(server.lua,funcname,tmptrg->lua_scripts) == REDIS_ERR) return -1; /* Now the following is guaranteed to return non nil */ lua_getglobal(server.lua, funcname); redisAssert(!lua_isnil(server.lua,1)); } else { redisLog(REDIS_WARNING,"triggle not found"); return -1; } } luaTriggleSetGlobalArray(server.lua,"KEYS",c->argv,c->argc); // redisLog(REDIS_NOTICE,"stack: %d",lua_gettop(server.lua));/* for(int i=0;i<c->argc;i++){ redisLog(REDIS_NOTICE,"%s",c->argv[i]->ptr); }*/ /* Select the right DB in the context of the Lua client */ selectDb(server.lua_client,c->db->id); server.lua_time_start = ustime()/1000; server.lua_kill = 0; if (server.lua_time_limit > 0) { lua_sethook(server.lua,luaMaskCountHook,LUA_MASKCOUNT,100000); server.lua_time_start = ustime()/1000; } else { lua_sethook(server.lua,luaMaskCountHook,0,0); } /* At this point whatever this script was never seen before or if it was * already defined, we can call it. We have zero arguments and expect * a single return value. */ if (lua_pcall(server.lua,0,1,0)) { selectDb(c,server.lua_client->db->id); /* set DB ID from Lua client */ redisLog(REDIS_WARNING,"Error running script (call to %s): %s/n", (char*)funcname, lua_tostring(server.lua,-1)); lua_pop(server.lua,1); lua_gc(server.lua,LUA_GCCOLLECT,0); return -1; } selectDb(c,server.lua_client->db->id); /* set DB ID from Lua client */ // luaReplyToRedisReply(c,server.lua); lua_pop(server.lua,1); server.lua_timedout = 0; server.lua_caller = NULL; lua_gc(server.lua,LUA_GCSTEP,1); // redisLog(REDIS_NOTICE,"after stack: %d",lua_gettop(server.lua)); //for slaves // return 0; }
开发者ID:crestxu,项目名称:redis-triggle,代码行数:85,
示例21: triggle_expire_eventint triggle_expire_event(redisDb *db,sds funcname,robj *key){ redisSrand48(0); server.lua_random_dirty = 0; server.lua_write_dirty = 0; lua_getglobal(server.lua,funcname); if (lua_isnil(server.lua,1)) { lua_pop(server.lua,1); /* remove the nil from the stack */ redisLog(REDIS_NOTICE,"no funcname triggle_scipts in lua"); struct dictEntry *de = dictFind(server.bridge_db.triggle_scipts[db->id],funcname); if(de) { struct bridge_db_triggle_t * tmptrg=dictGetVal(de); if (luatriggleCreateFunction(server.lua,funcname,tmptrg->lua_scripts) == REDIS_ERR) return -1; /* Now the following is guaranteed to return non nil */ lua_getglobal(server.lua, funcname); redisAssert(!lua_isnil(server.lua,1)); } else { redisLog(REDIS_WARNING,"triggle not found"); return -1; } } luaTriggleSetGlobalArray(server.lua,"KEYS",&key,1); server.lua_time_start = ustime()/1000; server.lua_kill = 0; if (server.lua_time_limit > 0) { lua_sethook(server.lua,luaMaskCountHook,LUA_MASKCOUNT,100000); server.lua_time_start = ustime()/1000; } else { lua_sethook(server.lua,luaMaskCountHook,0,0); } /* At this point whatever this script was never seen before or if it was * already defined, we can call it. We have zero arguments and expect * a single return value. */ if (lua_pcall(server.lua,0,1,0)) { //selectDb(c,server.lua_client->db->id); /* set DB ID from Lua client */ redisLog(REDIS_WARNING,"exec the script error:%s",lua_tostring(server.lua,-1)); lua_pop(server.lua,1); lua_gc(server.lua,LUA_GCCOLLECT,0); return -1; } //selectDb(c,server.lua_client->db->id); /* set DB ID from Lua client */ server.lua_timedout = 0; server.lua_caller = NULL; lua_pop(server.lua,1); lua_gc(server.lua,LUA_GCSTEP,1); return 0; }
开发者ID:crestxu,项目名称:redis-triggle,代码行数:70,
示例22: evalGenericCommand//.........这里部分代码省略......... addReply(c, shared.noscripterr); return; } // 如果执行的是 EVAL ,那么创建并执行新函数,然后将代码添加到脚本字典中 if (luaCreateFunction(c,lua,funcname,c->argv[1]) == REDIS_ERR) return; /* Now the following is guaranteed to return non nil */ lua_getglobal(lua, funcname); redisAssert(!lua_isnil(lua,1)); } /* Populate the argv and keys table accordingly to the arguments that * EVAL received. */ // 设置 KEYS 和 ARGV 全局变量到 Lua 环境 luaSetGlobalArray(lua,"KEYS",c->argv+3,numkeys); luaSetGlobalArray(lua,"ARGV",c->argv+3+numkeys,c->argc-3-numkeys); /* Select the right DB in the context of the Lua client */ // 为 Lua 所属的(伪)客户端设置数据库 selectDb(server.lua_client,c->db->id); /* Set an hook in order to be able to stop the script execution if it * is running for too much time. * * 设置一个钩子,用于在运行时间过长时停止脚本的运作。 * * We set the hook only if the time limit is enabled as the hook will * make the Lua script execution slower. * * 只在开启了时间限制选项时使用钩子,因为它会拖慢脚本的运行速度。 */ // 调用客户端 server.lua_caller = c; // 脚本开始时间 server.lua_time_start = ustime()/1000; // 是否杀死脚本 server.lua_kill = 0; // 只在开启时间限制时使用钩子 if (server.lua_time_limit > 0 && server.masterhost == NULL) { lua_sethook(lua,luaMaskCountHook,LUA_MASKCOUNT,100000); delhook = 1; } /* At this point whatever this script was never seen before or if it was * already defined, we can call it. We have zero arguments and expect * a single return value. */ // 执行脚本(所属的函数) if (lua_pcall(lua,0,1,0)) { // 以下是脚本执行出错的代码。。。 // 删除钩子 if (delhook) lua_sethook(lua,luaMaskCountHook,0,0); /* Disable hook */ // 脚本执行已超时 if (server.lua_timedout) { // 清除超时 FLAG server.lua_timedout = 0; /* Restore the readable handler that was unregistered when the * script timeout was detected. */ // 将超时钩子里删除的读事件重新加上 aeCreateFileEvent(server.el,c->fd,AE_READABLE, readQueryFromClient,c); }
开发者ID:jiangguang5201314,项目名称:ZNginx,代码行数:67,
示例23: evalGenericCommandvoid evalGenericCommand(redisClient *c, int evalsha) { lua_State *lua = server.lua; char funcname[43]; long long numkeys; int delhook = 0, err; /* We want the same PRNG sequence at every call so that our PRNG is * not affected by external state. */ redisSrand48(0); /* We set this flag to zero to remember that so far no random command * was called. This way we can allow the user to call commands like * SRANDMEMBER or RANDOMKEY from Lua scripts as far as no write command * is called (otherwise the replication and AOF would end with non * deterministic sequences). * * Thanks to this flag we'll raise an error every time a write command * is called after a random command was used. */ server.lua_random_dirty = 0; server.lua_write_dirty = 0; /* Get the number of arguments that are keys */ if (getLongLongFromObjectOrReply(c,c->argv[2],&numkeys,NULL) != REDIS_OK) return; if (numkeys > (c->argc - 3)) { addReplyError(c,"Number of keys can't be greater than number of args"); return; } /* We obtain the script SHA1, then check if this function is already * defined into the Lua state */ funcname[0] = 'f'; funcname[1] = '_'; if (!evalsha) { /* Hash the code if this is an EVAL call */ sha1hex(funcname+2,c->argv[1]->ptr,sdslen(c->argv[1]->ptr)); } else { /* We already have the SHA if it is a EVALSHA */ int j; char *sha = c->argv[1]->ptr; for (j = 0; j < 40; j++) funcname[j+2] = tolower(sha[j]); funcname[42] = '/0'; } /* Push the pcall error handler function on the stack. */ lua_getglobal(lua, "__redis__err__handler"); /* Try to lookup the Lua function */ lua_getglobal(lua, funcname); if (lua_isnil(lua,-1)) { lua_pop(lua,1); /* remove the nil from the stack */ /* Function not defined... let's define it if we have the * body of the function. If this is an EVALSHA call we can just * return an error. */ if (evalsha) { lua_pop(lua,1); /* remove the error handler from the stack. */ addReply(c, shared.noscripterr); return; } if (luaCreateFunction(c,lua,funcname,c->argv[1]) == REDIS_ERR) return; /* Now the following is guaranteed to return non nil */ lua_getglobal(lua, funcname); redisAssert(!lua_isnil(lua,-1)); } /* Populate the argv and keys table accordingly to the arguments that * EVAL received. */ luaSetGlobalArray(lua,"KEYS",c->argv+3,numkeys); luaSetGlobalArray(lua,"ARGV",c->argv+3+numkeys,c->argc-3-numkeys); /* Select the right DB in the context of the Lua client */ selectDb(server.lua_client,c->db->id); /* Set an hook in order to be able to stop the script execution if it * is running for too much time. * We set the hook only if the time limit is enabled as the hook will * make the Lua script execution slower. */ server.lua_caller = c; server.lua_time_start = ustime()/1000; server.lua_kill = 0; if (server.lua_time_limit > 0 && server.masterhost == NULL) { lua_sethook(lua,luaMaskCountHook,LUA_MASKCOUNT,100000); delhook = 1; } /* At this point whether this script was never seen before or if it was * already defined, we can call it. We have zero arguments and expect * a single return value. */ err = lua_pcall(lua,0,1,-2); /* Perform some cleanup that we need to do both on error and success. */ if (delhook) lua_sethook(lua,luaMaskCountHook,0,0); /* Disable hook */ if (server.lua_timedout) { server.lua_timedout = 0; /* Restore the readable handler that was unregistered when the * script timeout was detected. */ aeCreateFileEvent(server.el,c->fd,AE_READABLE,//.........这里部分代码省略.........
开发者ID:Whitespace,项目名称:redis,代码行数:101,
示例24: mstime/* Return the UNIX time in milliseconds */long long mstime(void) { return ustime()/1000;}
开发者ID:r043v,项目名称:load81,代码行数:4,
示例25: mainint main(int argc, char *argv[]) { printf("Second:%d, Millisecond:%lld, Microsecond:%lld/n", time(NULL), mstime(), ustime()); exit(0);}
开发者ID:flygoast,项目名称:fnsproxy,代码行数:5,
示例26: evalGenericCommand//.........这里部分代码省略......... // 创建 lua 函数 funcname // c->argv[1] 指向用户指定的 lua 脚本 if (luaCreateFunction(c,lua,funcname,c->argv[1]) == REDIS_ERR) { lua_pop(lua,1); /* remove the error handler from the stack. */ /* The error is sent to the client by luaCreateFunction() * itself when it returns REDIS_ERR. */ return; } // 现在 lua 中已经有 funcname 这个全局变量了,将其读取并入栈, // 准备调用 /* Now the following is guaranteed to return non nil */ lua_getglobal(lua, funcname); redisAssert(!lua_isnil(lua,-1)); } // 设置参数,包括键和值 /* Populate the argv and keys table accordingly to the arguments that * EVAL received. */ luaSetGlobalArray(lua,"KEYS",c->argv+3,numkeys); luaSetGlobalArray(lua,"ARGV",c->argv+3+numkeys,c->argc-3-numkeys); // 选择数据集,lua_client 有专用的数据集 /* Select the right DB in the context of the Lua client */ selectDb(server.lua_client,c->db->id); // 设置超时回调函数,以在 lua 脚本执行过长时间的时候停止脚本的运行 /* Set a hook in order to be able to stop the script execution if it * is running for too much time. * We set the hook only if the time limit is enabled as the hook will * make the Lua script execution slower. */ server.lua_caller = c; server.lua_time_start = ustime()/1000; server.lua_kill = 0; if (server.lua_time_limit > 0 && server.masterhost == NULL) { // 当 lua 解释器执行了 100000,luaMaskCountHook() 会被调用 lua_sethook(lua,luaMaskCountHook,LUA_MASKCOUNT,100000); delhook = 1; } // 现在,我们确定函数已经注册成功了.可以直接调用 lua 脚本 /* At this point whether this script was never seen before or if it was * already defined, we can call it. We have zero arguments and expect * a single return value. */ err = lua_pcall(lua,0,1,-2); // 删除超时回调函数 /* Perform some cleanup that we need to do both on error and success. */ if (delhook) lua_sethook(lua,luaMaskCountHook,0,0); /* Disable hook */ // 如果已经超时了,说明 lua 脚本已在超时后背 SCRPIT KILL 终结了 // 恢复监听发送 lua 脚本命令的客户端 if (server.lua_timedout) { server.lua_timedout = 0; /* Restore the readable handler that was unregistered when the * script timeout was detected. */ aeCreateFileEvent(server.el,c->fd,AE_READABLE, readQueryFromClient,c); } // lua_caller 置空 server.lua_caller = NULL; // 执行 lua 脚本用的是 lua 脚本执行专用的数据集。现在恢复原有的数据集 selectDb(c,server.lua_client->db->id); /* set DB ID from Lua client */
开发者ID:daoluan,项目名称:decode-redis-2.8,代码行数:66,
注:本文中的ustime函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 C++ ustrcpy函数代码示例 C++ usnprintf函数代码示例 |