From b7fc068d873bcfc93761f418bfefe8c928c33a59 Mon Sep 17 00:00:00 2001 From: Francis Deslauriers Date: Thu, 8 Oct 2020 16:59:57 -0400 Subject: [PATCH] Cleanup: Move `create_posix_shm()` to common/shm.c MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * This function will be used for trigger error accounting. * This function is renamed to `shm_create_anonymous()` and now takes one parameter for the owner of the shared memory area. Again this is code reuse. * Remove erroneous comment about the `name` parameter for the `shm_open()` function. It's the absence (and not its presence) of the '/' at the beginning of the name that makes the behaviour implementation defined. * Move the bin/lttng-sessiond/shm.c to common/shm.c so that all shm related functions are in one location. Signed-off-by: Francis Deslauriers Signed-off-by: Jérémie Galarneau Change-Id: I690b38801ffb4772e7c5069c4cccf470b0671f63 --- src/bin/lttng-sessiond/Makefile.am | 1 - src/bin/lttng-sessiond/main.c | 1 - src/bin/lttng-sessiond/register.c | 2 +- src/common/Makefile.am | 1 + src/{bin/lttng-sessiond => common}/shm.c | 38 ++++++++++++++++++++ src/{bin/lttng-sessiond => common}/shm.h | 2 ++ src/common/ust-consumer/ust-consumer.c | 45 ++---------------------- tests/unit/Makefile.am | 1 - 8 files changed, 44 insertions(+), 47 deletions(-) rename src/{bin/lttng-sessiond => common}/shm.c (86%) rename src/{bin/lttng-sessiond => common}/shm.h (85%) diff --git a/src/bin/lttng-sessiond/Makefile.am b/src/bin/lttng-sessiond/Makefile.am index 1d3741c61..e71c10814 100644 --- a/src/bin/lttng-sessiond/Makefile.am +++ b/src/bin/lttng-sessiond/Makefile.am @@ -20,7 +20,6 @@ lttng_sessiond_SOURCES = utils.c utils.h \ context.c context.h \ channel.c channel.h \ event.c event.h \ - shm.c shm.h \ consumer.c consumer.h \ session.c session.h \ modprobe.c modprobe.h kern-modules.h \ diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index a344cd476..40a418d0c 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -51,7 +51,6 @@ #include "event.h" #include "kernel.h" #include "kernel-consumer.h" -#include "shm.h" #include "lttng-ust-ctl.h" #include "ust-consumer.h" #include "utils.h" diff --git a/src/bin/lttng-sessiond/register.c b/src/bin/lttng-sessiond/register.c index 6381c1179..ac1583dc2 100644 --- a/src/bin/lttng-sessiond/register.c +++ b/src/bin/lttng-sessiond/register.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -20,7 +21,6 @@ #include "testpoint.h" #include "health-sessiond.h" #include "fd-limit.h" -#include "shm.h" #include "utils.h" #include "thread.h" diff --git a/src/common/Makefile.am b/src/common/Makefile.am index a56775e31..2dca5a4a3 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -82,6 +82,7 @@ libcommon_la_SOURCES = \ pipe.c pipe.h \ readwrite.c readwrite.h \ runas.c runas.h \ + shm.c shm.h \ session-descriptor.c \ snapshot.c snapshot.h \ spawn-viewer.c spawn-viewer.h \ diff --git a/src/bin/lttng-sessiond/shm.c b/src/common/shm.c similarity index 86% rename from src/bin/lttng-sessiond/shm.c rename to src/common/shm.c index 8b7744221..737f73e08 100644 --- a/src/bin/lttng-sessiond/shm.c +++ b/src/common/shm.c @@ -189,3 +189,41 @@ char *shm_ust_get_mmap(char *shm_path, int global) error: return NULL; } + +/* + * shm_create_anonymous is never called concurrently within a process. + */ +int shm_create_anonymous(const char *owner_name) +{ + char tmp_name[NAME_MAX]; + int shmfd, ret; + + ret = snprintf(tmp_name, NAME_MAX, "/shm-%s-%d", owner_name, getpid()); + if (ret < 0) { + PERROR("snprintf"); + return -1; + } + /* + * Allocate shm, and immediately unlink its shm oject, keeping only the + * file descriptor as a reference to the object. + */ + shmfd = shm_open(tmp_name, O_CREAT | O_EXCL | O_RDWR, 0700); + if (shmfd < 0) { + PERROR("shm_open"); + goto error_shm_open; + } + ret = shm_unlink(tmp_name); + if (ret < 0 && errno != ENOENT) { + PERROR("shm_unlink"); + goto error_shm_release; + } + return shmfd; + +error_shm_release: + ret = close(shmfd); + if (ret) { + PERROR("close"); + } +error_shm_open: + return -1; +} diff --git a/src/bin/lttng-sessiond/shm.h b/src/common/shm.h similarity index 85% rename from src/bin/lttng-sessiond/shm.h rename to src/common/shm.h index 94d2b72a1..d714506b8 100644 --- a/src/bin/lttng-sessiond/shm.h +++ b/src/common/shm.h @@ -11,4 +11,6 @@ char *shm_ust_get_mmap(char *shm_path, int global); +int shm_create_anonymous(const char *owner_name); + #endif /* _LTT_SHM_H */ diff --git a/src/common/ust-consumer/ust-consumer.c b/src/common/ust-consumer/ust-consumer.c index 68b6cac6c..aede53658 100644 --- a/src/common/ust-consumer/ust-consumer.c +++ b/src/common/ust-consumer/ust-consumer.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include "ust-consumer.h" @@ -352,48 +353,6 @@ error_alloc: return ret; } -/* - * create_posix_shm is never called concurrently within a process. - */ -static -int create_posix_shm(void) -{ - char tmp_name[NAME_MAX]; - int shmfd, ret; - - ret = snprintf(tmp_name, NAME_MAX, "/ust-shm-consumer-%d", getpid()); - if (ret < 0) { - PERROR("snprintf"); - return -1; - } - /* - * Allocate shm, and immediately unlink its shm oject, keeping - * only the file descriptor as a reference to the object. - * We specifically do _not_ use the / at the beginning of the - * pathname so that some OS implementations can keep it local to - * the process (POSIX leaves this implementation-defined). - */ - shmfd = shm_open(tmp_name, O_CREAT | O_EXCL | O_RDWR, 0700); - if (shmfd < 0) { - PERROR("shm_open"); - goto error_shm_open; - } - ret = shm_unlink(tmp_name); - if (ret < 0 && errno != ENOENT) { - PERROR("shm_unlink"); - goto error_shm_release; - } - return shmfd; - -error_shm_release: - ret = close(shmfd); - if (ret) { - PERROR("close"); - } -error_shm_open: - return -1; -} - static int open_ust_stream_fd(struct lttng_consumer_channel *channel, int cpu, const struct lttng_credentials *session_credentials) { @@ -401,7 +360,7 @@ static int open_ust_stream_fd(struct lttng_consumer_channel *channel, int cpu, int ret; if (!channel->shm_path[0]) { - return create_posix_shm(); + return shm_create_anonymous("ust-consumer"); } ret = get_stream_shm_path(shm_path, channel->shm_path, cpu); if (ret) { diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am index e9142b337..01e7e82c0 100644 --- a/tests/unit/Makefile.am +++ b/tests/unit/Makefile.am @@ -82,7 +82,6 @@ SESSIOND_OBJS = $(top_builddir)/src/bin/lttng-sessiond/buffer-registry.$(OBJEXT) $(top_builddir)/src/bin/lttng-sessiond/condition-internal.$(OBJEXT) \ $(top_builddir)/src/bin/lttng-sessiond/save.$(OBJEXT) \ $(top_builddir)/src/bin/lttng-sessiond/notification-thread-commands.$(OBJEXT) \ - $(top_builddir)/src/bin/lttng-sessiond/shm.$(OBJEXT) \ $(top_builddir)/src/bin/lttng-sessiond/kernel.$(OBJEXT) \ $(top_builddir)/src/bin/lttng-sessiond/ht-cleanup.$(OBJEXT) \ $(top_builddir)/src/bin/lttng-sessiond/notification-thread.$(OBJEXT) \ -- 2.34.1