diff --git a/core/fiber.m b/core/fiber.m index 9d23203c8ab58a7b861f3ab61cedb4d35cb55ecd..1e86df88ced53a4ae06d267b1ab04ba77fed5dc0 100644 --- a/core/fiber.m +++ b/core/fiber.m @@ -281,7 +281,6 @@ void fiber_gc(void) { struct palloc_pool *tmp; - const char *tmp_name; fiber_cleanup(); @@ -291,9 +290,8 @@ fiber_gc(void) tmp = fiber->pool; fiber->pool = ex_pool; ex_pool = tmp; - tmp_name = palloc_name(fiber->pool, NULL); - palloc_name(fiber->pool, palloc_name(ex_pool, NULL)); - palloc_name(ex_pool, tmp_name); + palloc_set_name(fiber->pool, fiber->name); + palloc_set_name(ex_pool, "ex_pool"); fiber->rbuf = tbuf_clone(fiber->pool, fiber->rbuf); fiber->cleanup = tbuf_clone(fiber->pool, fiber->cleanup); @@ -327,7 +325,7 @@ static void fiber_zombificate() { diag_clear(); - fiber->name = NULL; + fiber_set_name(fiber, "zombie"); fiber->f = NULL; fiber->data = NULL; unregister_fid(fiber); @@ -367,9 +365,20 @@ fiber_loop(void *data __attribute__((unused))) } +/** Set fiber name. +* @Param[in] name the new name of the fiber. Truncated to FIBER_NAME_MAXLEN. +*/ + +void +fiber_set_name(struct fiber *fiber, const char *name) +{ + assert(name != NULL); + snprintf(fiber->name, sizeof(fiber->name), "%s", name); +} + /* fiber never dies, just become zombie */ struct fiber * -fiber_create(const char *restrict name, int fd, int inbox_size, void (*f) (void *), void *f_data) +fiber_create(const char *name, int fd, int inbox_size, void (*f) (void *), void *f_data) { struct fiber *fiber = NULL; if (inbox_size <= 0) @@ -387,7 +396,7 @@ fiber_create(const char *restrict name, int fd, int inbox_size, void (*f) (void if (tarantool_coro_create(&fiber->coro, fiber_loop, NULL) == NULL) return NULL; - fiber->pool = palloc_create_pool(fiber->name); + fiber->pool = palloc_create_pool(name); fiber->inbox = palloc(eter_pool, (sizeof(*fiber->inbox) + inbox_size * sizeof(struct tbuf *))); fiber->inbox->size = inbox_size; @@ -401,14 +410,14 @@ fiber_create(const char *restrict name, int fd, int inbox_size, void (*f) (void SLIST_INSERT_HEAD(&fibers, fiber, link); } - fiber->name = name; - palloc_name(fiber->pool, name); fiber->fd = fd; fiber->f = f; fiber->f_data = f_data; while (++last_used_fid <= 100) ; /* fids from 0 to 100 are reserved */ fiber->fid = last_used_fid; fiber->flags = 0; + fiber_set_name(fiber, name); + palloc_set_name(fiber->pool, fiber->name); register_fid(fiber); return fiber; @@ -881,7 +890,7 @@ struct child * spawn_child(const char *name, int inbox_size, struct tbuf *(*handler) (void *, struct tbuf *), void *state) { - char *proxy_name, *child_name; + char *proxy_name; int socks[2]; int pid; @@ -913,11 +922,12 @@ spawn_child(const char *name, int inbox_size, struct tbuf *(*handler) (void *, s c->out->flags |= FIBER_READING_INBOX; return c; } else { + char child_name[sizeof(fiber->name)]; + salloc_destroy(); close_all_xcpt(2, socks[0], sayfd); - child_name = palloc(eter_pool, 64); - snprintf(child_name, 64, "%s/child", name); - sched.name = child_name; + snprintf(child_name, sizeof(child_name), "%s/child", name); + fiber_set_name(&sched, child_name); set_proc_title(name); say_crit("%s initialized", name); blocking_loop(socks[0], handler, state); @@ -1150,7 +1160,7 @@ fiber_init(void) memset(&sched, 0, sizeof(sched)); sched.fid = 1; - sched.name = "sched"; + fiber_set_name(&sched, "sched"); sched.pool = palloc_create_pool(sched.name); sp = call_stack; diff --git a/core/palloc.m b/core/palloc.m index b1b0e1ea9b6c076fa22479efcbb77784eac5ebe2..a8f7eb4409ab8c2f52c2ad8cf475819090b21f12 100644 --- a/core/palloc.m +++ b/core/palloc.m @@ -39,6 +39,8 @@ #include <third_party/queue.h> #include <tbuf.h> +#define PALLOC_POOL_NAME_MAXLEN 16 + struct chunk { uint32_t magic; void *brk; @@ -66,7 +68,7 @@ struct palloc_pool { struct chunk_list_head chunks; SLIST_ENTRY(palloc_pool) link; size_t allocated; - const char *name; + char name[PALLOC_POOL_NAME_MAXLEN]; }; SLIST_HEAD(palloc_pool_head, palloc_pool) pools; @@ -312,7 +314,7 @@ palloc_create_pool(const char *name) struct palloc_pool *pool = malloc(sizeof(struct palloc_pool)); assert(pool != NULL); memset(pool, 0, sizeof(*pool)); - pool->name = name; + palloc_set_name(pool, name); SLIST_INIT(&pool->chunks); SLIST_INSERT_HEAD(&pools, pool, link); VALGRIND_CREATE_MEMPOOL(pool, PALLOC_REDZONE, 0); @@ -390,13 +392,11 @@ palloc_stat(struct tbuf *buf) } } -const char * -palloc_name(struct palloc_pool *pool, const char *new_name) +void +palloc_set_name(struct palloc_pool *pool, const char *name) { - const char *old_name = pool->name; - if (new_name != NULL) - pool->name = new_name; - return old_name; + assert(name != NULL); + snprintf(pool->name, sizeof(pool->name), "%s", name); } size_t diff --git a/core/tarantool.m b/core/tarantool.m index 1bf7b7ff4f73e50aca9e70e898ac2e4181307021..918fb6103fa633cece4a705f1c5ea08df1a4b993 100644 --- a/core/tarantool.m +++ b/core/tarantool.m @@ -199,7 +199,7 @@ snapshot(void *ev, int events __attribute__((unused))) return WEXITSTATUS(fiber->cw.rstatus); } - fiber->name = "dumper"; + fiber_set_name(fiber, "dumper"); set_proc_title("dumper (%" PRIu32 ")", getppid()); fiber_destroy_all(); palloc_free_unused(); diff --git a/include/fiber.h b/include/fiber.h index a23821234173a5228b530bc902ac45a9ed33d278..5ab9e751cea45b8d95ea3d47974f94874e9513b3 100644 --- a/include/fiber.h +++ b/include/fiber.h @@ -42,6 +42,8 @@ #include <exceptions.h> +#define FIBER_NAME_MAXLEN 16 + #define FIBER_READING_INBOX 0x1 #define FIBER_RAISE 0x2 @@ -81,7 +83,7 @@ struct fiber { struct ring *inbox; - const char *name; + char name[FIBER_NAME_MAXLEN]; void (*f) (void *); void *f_data; @@ -115,6 +117,7 @@ extern struct fiber *fiber; void fiber_init(void); struct fiber *fiber_create(const char *name, int fd, int inbox_size, void (*f) (void *), void *); +void fiber_set_name(struct fiber *fiber, const char *name); void wait_for(int events); void wait_for_child(pid_t pid); void unwait(int events); diff --git a/include/palloc.h b/include/palloc.h index 81b1b74e53aa973c90c3c0a0436c13872d9ce6c0..370f86ece8584f6923cd49cf5fd72816376039fd 100644 --- a/include/palloc.h +++ b/include/palloc.h @@ -43,7 +43,7 @@ void prelease_after(struct palloc_pool *pool, size_t after); struct palloc_pool *palloc_create_pool(const char *name); void palloc_destroy_pool(struct palloc_pool *); void palloc_free_unused(void); -const char *palloc_name(struct palloc_pool *, const char *); +void palloc_set_name(struct palloc_pool *, const char *); size_t palloc_allocated(struct palloc_pool *); void palloc_stat(struct tbuf *buf); diff --git a/mod/feeder/feeder.m b/mod/feeder/feeder.m index 3afd4479363d2a6d584a6c41c6a39d67daddd451..b6ba93da1fd23380e07d305b9f468a488cb49f1d 100644 --- a/mod/feeder/feeder.m +++ b/mod/feeder/feeder.m @@ -70,7 +70,7 @@ recover_feed_slave(int sock) fiber->has_peer = true; fiber->fd = sock; - fiber->name = "feeder"; + fiber_set_name(fiber, "feeder"); set_proc_title("feeder:client_handler%s %s", custom_proc_title, fiber_peer_name(fiber)); ev_default_loop(0);