From f5c4069d81aae5695a26165c6ce872b5db1d443c Mon Sep 17 00:00:00 2001
From: Roman Tokarev <rtokarev@corp.mail.ru>
Date: Fri, 20 May 2011 13:57:28 +0400
Subject: [PATCH] Change location of fiber->name and palloc_pool->name fields
 from external (allocated outside a structure) to internal one (within a
 structure).

---
 core/fiber.c        | 38 ++++++++++++++++++++++++--------------
 core/palloc.c       | 15 +++++++--------
 core/tarantool.c    |  2 +-
 include/fiber.h     |  5 ++++-
 include/palloc.h    |  2 +-
 mod/feeder/feeder.c |  2 +-
 6 files changed, 38 insertions(+), 26 deletions(-)

diff --git a/core/fiber.c b/core/fiber.c
index 3d184addfa..80fbe6ca1b 100644
--- a/core/fiber.c
+++ b/core/fiber.c
@@ -280,7 +280,6 @@ void
 fiber_gc(void)
 {
 	struct palloc_pool *tmp;
-	const char *tmp_name;
 
 	fiber_cleanup();
 
@@ -290,9 +289,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);
@@ -326,7 +324,7 @@ static void
 fiber_zombificate()
 {
 	diag_clear();
-	fiber->name = NULL;
+	fiber_set_name(fiber, "zombie");
 	fiber->f = NULL;
 	fiber->data = NULL;
 	unregister_fid(fiber);
@@ -357,9 +355,20 @@ fiber_loop(void *data __unused__)
 #define MAP_ANONYMOUS MAP_ANON
 #endif
 
+/** 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)
@@ -377,7 +386,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;
@@ -391,13 +400,13 @@ 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_set_name(fiber, name);
+	palloc_set_name(fiber->pool, fiber->name);
 	register_fid(fiber);
 
 	return fiber;
@@ -844,7 +853,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;
 
@@ -876,11 +885,12 @@ spawn_child(const char *name, int inbox_size, struct tbuf *(*handler) (void *, s
 		c->out->reading_inbox = true;
 		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);
@@ -1116,7 +1126,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.c b/core/palloc.c
index b0209cbbd3..c1d3505d65 100644
--- a/core/palloc.c
+++ b/core/palloc.c
@@ -66,7 +66,7 @@ struct palloc_pool {
 	struct chunk_list_head chunks;
 	 SLIST_ENTRY(palloc_pool) link;
 	size_t allocated;
-	const char *name;
+	char name[16];
 };
 
 SLIST_HEAD(palloc_pool_head, palloc_pool) pools;
@@ -303,7 +303,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);
@@ -368,13 +368,12 @@ 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;
+	if (name == NULL)
+		name = "undefined";
+	snprintf(pool->name, sizeof(pool->name), "%s", name);
 }
 
 size_t
diff --git a/core/tarantool.c b/core/tarantool.c
index 4d7353a155..501bdee086 100644
--- a/core/tarantool.c
+++ b/core/tarantool.c
@@ -200,7 +200,7 @@ snapshot(void *ev, int events __unused__)
 		return WEXITSTATUS(fiber->cw.rstatus);
 	}
 
-	fiber->name = "dumper";
+	fiber_set_name(fiber, "dumper");
 	set_proc_title("dumper (%" PRIu32 ")", getppid());
 	close_all_xcpt(1, sayfd);
 	snapshot_save(recovery_state, mod_snapshot);
diff --git a/include/fiber.h b/include/fiber.h
index 6dd98cb70b..8e00965e25 100644
--- a/include/fiber.h
+++ b/include/fiber.h
@@ -41,6 +41,8 @@
 #include <coro.h>
 #include <util.h>
 
+#define FIBER_NAME_MAXLEN 16
+
 #define FIBER_EXIT -1
 
 struct msg {
@@ -79,7 +81,7 @@ struct fiber {
 	jmp_buf exc;
 	const char *errstr;
 
-	const char *name;
+	char name[FIBER_NAME_MAXLEN];
 	void (*f) (void *);
 	void *f_data;
 
@@ -112,6 +114,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 41a03ce679..1a51c8479a 100644
--- a/include/palloc.h
+++ b/include/palloc.h
@@ -45,7 +45,7 @@ void prelease(struct palloc_pool *pool);
 void prelease_after(struct palloc_pool *pool, size_t after);
 struct palloc_pool *palloc_create_pool(const char *name);
 void palloc_destroy(struct palloc_pool *);
-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.c b/mod/feeder/feeder.c
index 16d31d8335..a84512a894 100644
--- a/mod/feeder/feeder.c
+++ b/mod/feeder/feeder.c
@@ -65,7 +65,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);
-- 
GitLab