[tarantool-patches] [PATCH 2/3] Use static_alloc() instead of 'static char[]' where possible

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Sun Apr 28 19:56:26 MSK 2019


This patch harnesses freshly introduced static memory allocator
to eliminate wasteful usage of BSS memory. This commit frees
11Kb per each thread.
---
 src/box/iproto.cc      |  2 +-
 src/box/memtx_engine.c |  8 ++++----
 src/box/xlog.c         | 24 ++++++++++--------------
 src/box/xlog.h         |  2 +-
 src/cfg.c              | 15 +++++----------
 src/httpc.c            |  7 +++++--
 src/lib/core/sio.c     | 10 +++++-----
 7 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/src/box/iproto.cc b/src/box/iproto.cc
index b9d2004f0..873548e09 100644
--- a/src/box/iproto.cc
+++ b/src/box/iproto.cc
@@ -1810,7 +1810,7 @@ tx_process_connect(struct cmsg *m)
 			diag_raise();
 		con->session->meta.connection = con;
 		tx_fiber_init(con->session, 0);
-		static __thread char greeting[IPROTO_GREETING_SIZE];
+		char *greeting = static_alloc(IPROTO_GREETING_SIZE);
 		/* TODO: dirty read from tx thread */
 		struct tt_uuid uuid = INSTANCE_UUID;
 		random_bytes(con->salt, IPROTO_SALT_SIZE);
diff --git a/src/box/memtx_engine.c b/src/box/memtx_engine.c
index 4d99910cb..64a311b64 100644
--- a/src/box/memtx_engine.c
+++ b/src/box/memtx_engine.c
@@ -771,7 +771,7 @@ memtx_engine_commit_checkpoint(struct engine *engine,
 		char to[PATH_MAX];
 		snprintf(to, sizeof(to), "%s",
 			 xdir_format_filename(dir, lsn, NONE));
-		char *from = xdir_format_filename(dir, lsn, INPROGRESS);
+		const char *from = xdir_format_filename(dir, lsn, INPROGRESS);
 #ifndef NDEBUG
 		struct errinj *delay = errinj(ERRINJ_SNAP_COMMIT_DELAY,
 					       ERRINJ_BOOL);
@@ -814,7 +814,7 @@ memtx_engine_abort_checkpoint(struct engine *engine)
 	small_alloc_setopt(&memtx->alloc, SMALL_DELAYED_FREE_MODE, false);
 
 	/** Remove garbage .inprogress file. */
-	char *filename =
+	const char *filename =
 		xdir_format_filename(&memtx->checkpoint->dir,
 				     vclock_sum(&memtx->checkpoint->vclock),
 				     INPROGRESS);
@@ -837,8 +837,8 @@ memtx_engine_backup(struct engine *engine, const struct vclock *vclock,
 		    engine_backup_cb cb, void *cb_arg)
 {
 	struct memtx_engine *memtx = (struct memtx_engine *)engine;
-	char *filename = xdir_format_filename(&memtx->snap_dir,
-					      vclock_sum(vclock), NONE);
+	const char *filename = xdir_format_filename(&memtx->snap_dir,
+						    vclock_sum(vclock), NONE);
 	return cb(filename, cb_arg);
 }
 
diff --git a/src/box/xlog.c b/src/box/xlog.c
index b70e8e25f..8254cce20 100644
--- a/src/box/xlog.c
+++ b/src/box/xlog.c
@@ -41,7 +41,7 @@
 #include <msgpuck.h>
 
 #include "coio_file.h"
-
+#include "tt_static.h"
 #include "error.h"
 #include "xrow.h"
 #include "iproto_constants.h"
@@ -646,17 +646,14 @@ xdir_check(struct xdir *dir)
 	return 0;
 }
 
-char *
+const char *
 xdir_format_filename(struct xdir *dir, int64_t signature,
 		enum log_suffix suffix)
 {
-	static __thread char filename[PATH_MAX + 1];
-	const char *suffix_str = (suffix == INPROGRESS ?
-				  inprogress_suffix : "");
-	snprintf(filename, PATH_MAX, "%s/%020lld%s%s",
-		 dir->dirname, (long long) signature,
-		 dir->filename_ext, suffix_str);
-	return filename;
+	return tt_snprintf(PATH_MAX + 1, "%s/%020lld%s%s",
+			   dir->dirname, (long long) signature,
+			   dir->filename_ext, suffix == INPROGRESS ?
+					      inprogress_suffix : "");
 }
 
 static void
@@ -683,8 +680,8 @@ xdir_collect_garbage(struct xdir *dir, int64_t signature, unsigned flags)
 	struct vclock *vclock;
 	while ((vclock = vclockset_first(&dir->index)) != NULL &&
 	       vclock_sum(vclock) < signature) {
-		char *filename = xdir_format_filename(dir, vclock_sum(vclock),
-						      NONE);
+		const char *filename =
+			xdir_format_filename(dir, vclock_sum(vclock), NONE);
 		if (flags & XDIR_GC_ASYNC)
 			eio_unlink(filename, 0, xdir_complete_gc, NULL);
 		else
@@ -946,9 +943,8 @@ err:
 int
 xdir_touch_xlog(struct xdir *dir, const struct vclock *vclock)
 {
-	char *filename;
 	int64_t signature = vclock_sum(vclock);
-	filename = xdir_format_filename(dir, signature, NONE);
+	const char *filename = xdir_format_filename(dir, signature, NONE);
 
 	if (dir->type != SNAP) {
 		assert(false);
@@ -987,7 +983,7 @@ xdir_create_xlog(struct xdir *dir, struct xlog *xlog,
 	xlog_meta_create(&meta, dir->filetype, dir->instance_uuid,
 			 vclock, prev_vclock);
 
-	char *filename = xdir_format_filename(dir, signature, NONE);
+	const char *filename = xdir_format_filename(dir, signature, NONE);
 	if (xlog_create(xlog, filename, dir->open_wflags, &meta,
 			&dir->opts) != 0)
 		return -1;
diff --git a/src/box/xlog.h b/src/box/xlog.h
index 6539d1b0b..a48b05fc4 100644
--- a/src/box/xlog.h
+++ b/src/box/xlog.h
@@ -199,7 +199,7 @@ xdir_check(struct xdir *dir);
  * Return a file name based on directory type, vector clock
  * sum, and a suffix (.inprogress or not).
  */
-char *
+const char *
 xdir_format_filename(struct xdir *dir, int64_t signature,
 		     enum log_suffix suffix);
 
diff --git a/src/cfg.c b/src/cfg.c
index 78654be62..46cff1999 100644
--- a/src/cfg.c
+++ b/src/cfg.c
@@ -31,14 +31,15 @@
 #include "say.h"
 #include "cfg.h"
 #include "lua/utils.h"
+#include "tt_static.h"
 
-enum { MAX_OPT_NAME_LEN = 256, MAX_OPT_VAL_LEN = 256, MAX_STR_OPTS = 8 };
+enum { MAX_OPT_NAME_LEN = 256, MAX_OPT_VAL_LEN = 256 };
 
 static void
 cfg_get(const char *param)
 {
-	char buf[MAX_OPT_NAME_LEN];
-	snprintf(buf, sizeof(buf), "return box.cfg.%s", param);
+	const char *buf =
+		tt_snprintf(MAX_OPT_NAME_LEN, "return box.cfg.%s", param);
 	if (luaL_dostring(tarantool_L, buf) != 0)
 		panic("cfg_get('%s')", param);
 }
@@ -90,15 +91,9 @@ cfg_geti64(const char *param)
 static const char *
 cfg_tostring(struct lua_State *L)
 {
-	static __thread char values[MAX_STR_OPTS][MAX_OPT_VAL_LEN];
-	static __thread int i = 0;
 	if (lua_isnil(L, -1))
 		return NULL;
-	else {
-		snprintf(values[i % MAX_STR_OPTS], MAX_OPT_VAL_LEN,
-			 "%s", lua_tostring(L, -1));
-		return values[i++ % MAX_STR_OPTS];
-	}
+	return tt_snprintf(MAX_OPT_VAL_LEN, "%s", lua_tostring(L, -1));
 }
 
 const char *
diff --git a/src/httpc.c b/src/httpc.c
index 65eeaa743..80dabd59c 100644
--- a/src/httpc.c
+++ b/src/httpc.c
@@ -33,12 +33,15 @@
 
 #include <assert.h>
 #include <curl/curl.h>
-
+#include "tt_static.h"
 #include "fiber.h"
 #include "errinj.h"
 
 #define MAX_HEADER_LEN 8192
 
+static_assert(MAX_HEADER_LEN < SMALL_STATIC_SIZE,
+	      "HTTP header fits into the static buffer");
+
 /** The HTTP headers that may be set automatically. */
 #define HTTP_ACCEPT_HEADER	"Accept:"
 #define HTTP_CONNECTION_HEADER	"Connection:"
@@ -178,7 +181,7 @@ httpc_request_delete(struct httpc_request *req)
 int
 httpc_set_header(struct httpc_request *req, const char *fmt, ...)
 {
-	static __thread char header[MAX_HEADER_LEN + 1];
+	char *header = static_alloc(MAX_HEADER_LEN + 1);
 	va_list ap;
 	va_start(ap, fmt);
 	int rc = vsnprintf(header, MAX_HEADER_LEN + 1, fmt, ap);
diff --git a/src/lib/core/sio.c b/src/lib/core/sio.c
index 64aae97bc..996b7faad 100644
--- a/src/lib/core/sio.c
+++ b/src/lib/core/sio.c
@@ -51,22 +51,22 @@ sio_socketname(int fd)
 {
 	/* Preserve errno */
 	int save_errno = errno;
-	static __thread char name[2 * SERVICE_NAME_MAXLEN];
-	int n = snprintf(name, sizeof(name), "fd %d", fd);
+	int name_size = 2 * SERVICE_NAME_MAXLEN;
+	char *name = static_alloc(name_size);
+	int n = snprintf(name, name_size, "fd %d", fd);
 	if (fd >= 0) {
 		struct sockaddr_storage addr;
 		socklen_t addrlen = sizeof(addr);
 		int rc = getsockname(fd, (struct sockaddr *) &addr, &addrlen);
 		if (rc == 0) {
-			n += snprintf(name + n,
-				sizeof(name) - n, ", aka %s",
+			n += snprintf(name + n, name_size - n, ", aka %s",
 				sio_strfaddr((struct sockaddr *)&addr,
 								addrlen));
 		}
 		addrlen = sizeof(addr);
 		rc = getpeername(fd, (struct sockaddr *) &addr, &addrlen);
 		if (rc == 0) {
-			n += snprintf(name + n, sizeof(name) - n,
+			n += snprintf(name + n, name_size - n,
 				      ", peer of %s",
 				      sio_strfaddr((struct sockaddr *)&addr,
 								addrlen));
-- 
2.20.1 (Apple Git-117)





More information about the Tarantool-patches mailing list