void dispatch_conn_exist(client *c, int tid) { struct connswapunit *su = csui_new(); char buf[1]; vr_worker *worker; if (su == NULL) { freeClient(c); /* given that malloc failed this may also fail, but let's try */ log_error("Failed to allocate memory for connection swap object\n"); return ; } su->num = tid; su->data = c; unlinkClientFromEventloop(c); cbsul_push(su); worker = darray_get(&workers, (uint32_t)c->curidx); /* Back to master */ buf[0] = 'b'; if (vr_write(worker->socketpairs[1], buf, 1) != 1) { log_error("Notice the worker failed."); } }
void _log_stderr_safe(const char *fmt, ...) { struct logger *l = &logger; int len, size, errno_save; char buf[LOG_MAX_LEN]; va_list args; ssize_t n; errno_save = errno; len = 0; /* length of output buffer */ size = LOG_MAX_LEN; /* size of output buffer */ len += vr_safe_snprintf(buf + len, size - len, "[.......................] "); va_start(args, fmt); len += vr_safe_vsnprintf(buf + len, size - len, fmt, args); va_end(args); buf[len++] = '\n'; n = vr_write(STDERR_FILENO, buf, len); if (n < 0) { l->nerror++; } errno = errno_save; }
void write_to_log(char * str, size_t len) { struct logger *l = &logger; int errno_save; ssize_t n; if (l->fd < 0) { return; } errno_save = errno; n = vr_write(l->fd, str, len); if (n < 0) { l->nerror++; } errno = errno_save; }
static void thread_event_process(aeEventLoop *el, int fd, void *privdata, int mask) { rstatus_t status; vr_worker *worker = privdata; char buf[1]; int idx; client *c; struct connswapunit *su; ASSERT(el == master.vel.el); ASSERT(fd == worker->socketpairs[0]); if (vr_read(fd, buf, 1) != 1) { log_warn("Can't read for worker(id:%d) socketpairs[1](%d)", worker->vel.thread.id, fd); buf[0] = 'b'; } switch (buf[0]) { case 'b': su = cbsul_pop(); if (su == NULL) { log_warn("Pop from connection back swap list is null"); return; } idx = su->num; su->num = worker->id; worker = darray_get(&workers, (uint32_t)idx); csul_push(worker, su); /* Jump to the target worker. */ buf[0] = 'j'; if (vr_write(worker->socketpairs[0], buf, 1) != 1) { log_error("Notice the worker failed."); } break; default: log_error("read error char '%c' for worker(id:%d) socketpairs[0](%d)", buf[0], worker->vel.thread.id, worker->socketpairs[1]); break; } }
void _log(const char *file, int line, int panic, const char *fmt, ...) { struct logger *l = &logger; int len, size, errno_save; char buf[LOG_MAX_LEN]; va_list args; ssize_t n; struct timeval tv; if (l->fd < 0) { return; } errno_save = errno; len = 0; /* length of output buffer */ size = LOG_MAX_LEN; /* size of output buffer */ gettimeofday(&tv, NULL); buf[len++] = '['; len += vr_strftime(buf + len, size - len, "%Y-%m-%d %H:%M:%S.", localtime(&tv.tv_sec)); len += vr_scnprintf(buf + len, size - len, "%03ld", tv.tv_usec/1000); len += vr_scnprintf(buf + len, size - len, "] %s:%d ", file, line); va_start(args, fmt); len += vr_vscnprintf(buf + len, size - len, fmt, args); va_end(args); buf[len++] = '\n'; n = vr_write(l->fd, buf, len); if (n < 0) { l->nerror++; } errno = errno_save; if (panic) { abort(); } }
/* * Hexadecimal dump in the canonical hex + ascii display * See -C option in man hexdump */ void _log_hexdump(const char *file, int line, char *data, int datalen, const char *fmt, ...) { struct logger *l = &logger; char buf[8 * LOG_MAX_LEN]; int i, off, len, size, errno_save; ssize_t n; if (l->fd < 0) { return; } /* log hexdump */ errno_save = errno; off = 0; /* data offset */ len = 0; /* length of output buffer */ size = 8 * LOG_MAX_LEN; /* size of output buffer */ while (datalen != 0 && (len < size - 1)) { char *save, *str; unsigned char c; int savelen; len += vr_scnprintf(buf + len, size - len, "%08x ", off); save = data; savelen = datalen; for (i = 0; datalen != 0 && i < 16; data++, datalen--, i++) { c = (unsigned char)(*data); str = (i == 7) ? " " : " "; len += vr_scnprintf(buf + len, size - len, "%02x%s", c, str); } for ( ; i < 16; i++) { str = (i == 7) ? " " : " "; len += vr_scnprintf(buf + len, size - len, " %s", str); } data = save; datalen = savelen; len += vr_scnprintf(buf + len, size - len, " |"); for (i = 0; datalen != 0 && i < 16; data++, datalen--, i++) { c = (unsigned char)(isprint(*data) ? *data : '.'); len += vr_scnprintf(buf + len, size - len, "%c", c); } len += vr_scnprintf(buf + len, size - len, "|\n"); off += 16; } n = vr_write(l->fd, buf, len); if (n < 0) { l->nerror++; } if (len >= size - 1) { n = vr_write(l->fd, "\n", 1); if (n < 0) { l->nerror++; } } errno = errno_save; }