[lttng-dev] [PATCH lttng-tools 09/14] Added ashmem framework support for ust apps and sessiond
Charles Briere
charlesbriere.flatzo at gmail.com
Mon May 6 14:18:46 EDT 2013
From: Pierre-Luc St-Charles <pierre-luc.st-charles at polymtl.ca>
Signed-off-by: Pierre-Luc St-Charles <pierre-luc.st-charles at polymtl.ca>
---
src/bin/lttng-consumerd/lttng-consumerd.c | 6 +++
src/bin/lttng-sessiond/shm.c | 75 +++++++++++++++++++++++++++++++
src/bin/lttng-sessiond/shm.h | 16 +++++++
3 files changed, 97 insertions(+)
diff --git a/src/bin/lttng-consumerd/lttng-consumerd.c b/src/bin/lttng-consumerd/lttng-consumerd.c
index edf1f15..cbd610c 100644
--- a/src/bin/lttng-consumerd/lttng-consumerd.c
+++ b/src/bin/lttng-consumerd/lttng-consumerd.c
@@ -28,7 +28,11 @@
#include <string.h>
#include <sys/ipc.h>
#include <sys/resource.h>
+#ifdef __ANDROID__
+#include <linux/shm.h>
+#else
#include <sys/shm.h>
+#endif
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -39,7 +43,9 @@
#include <assert.h>
#include <config.h>
#include <urcu/compiler.h>
+#ifndef __ANDROID__
#include <ulimit.h>
+#endif
#include <common/defaults.h>
#include <common/common.h>
diff --git a/src/bin/lttng-sessiond/shm.c b/src/bin/lttng-sessiond/shm.c
index b94f4eb..80c7b6f 100644
--- a/src/bin/lttng-sessiond/shm.c
+++ b/src/bin/lttng-sessiond/shm.c
@@ -41,6 +41,8 @@
static int get_wait_shm(char *shm_path, size_t mmap_size, int global)
{
int wait_shm_fd, ret;
+
+#ifndef __ANDROID__
mode_t mode;
assert(shm_path);
@@ -114,6 +116,23 @@ static int get_wait_shm(char *shm_path, size_t mmap_size, int global)
}
#else
#warning "FreeBSD does not support setting file mode on shm FD. Remember that for secure use, lttng-sessiond should be started before applications linked on lttng-ust."
+#endif // !__ANDROID__
+#else
+ /*
+ * For ashmem, we must directly specify the ammount of mem we will need;
+ * also, once the memory region is opened, nobody can directly reopen or
+ * refer to it via its path (only via its fd).
+ */
+ wait_shm_fd = ashmem_create_region(shm_path, mmap_size);
+ if (wait_shm_fd < 0) {
+ PERROR("shm_open wait shm [ashmem_create_region]");
+ goto error;
+ }
+ ret = ashmem_set_prot_region(wait_shm_fd, PROT_READ | PROT_WRITE);
+ if (ret < 0) {
+ PERROR("shm_open wait shm [ashmem_create_region, ASHMEM_SET_NAME]");
+ goto error;
+ }
#endif
DBG("Got the wait shm fd %d", wait_shm_fd);
@@ -166,3 +185,59 @@ char *shm_ust_get_mmap(char *shm_path, int global)
error:
return NULL;
}
+
+#ifdef __ANDROID__
+#ifdef _CUTILS_ASHMEM_NO_NDK_H
+#include <linux/ashmem.h>
+#define ASHMEM_DEVICE "/dev/ashmem"
+int ashmem_create_region(const char *name, size_t size)
+{
+ int fd, ret;
+
+ fd = open(ASHMEM_DEVICE, O_RDWR);
+ if (fd < 0)
+ return fd;
+
+ if (name) {
+ char buf[ASHMEM_NAME_LEN];
+
+ strlcpy(buf, name, sizeof(buf));
+ ret = ioctl(fd, ASHMEM_SET_NAME, buf);
+ if (ret < 0)
+ goto error;
+ }
+
+ ret = ioctl(fd, ASHMEM_SET_SIZE, size);
+ if (ret < 0)
+ goto error;
+
+ return fd;
+
+error:
+ close(fd);
+ return ret;
+}
+
+int ashmem_set_prot_region(int fd, int prot)
+{
+ return ioctl(fd, ASHMEM_SET_PROT_MASK, prot);
+}
+
+int ashmem_pin_region(int fd, size_t offset, size_t len)
+{
+ struct ashmem_pin pin = { offset, len };
+ return ioctl(fd, ASHMEM_PIN, &pin);
+}
+
+int ashmem_unpin_region(int fd, size_t offset, size_t len)
+{
+ struct ashmem_pin pin = { offset, len };
+ return ioctl(fd, ASHMEM_UNPIN, &pin);
+}
+
+int ashmem_get_size_region(int fd)
+{
+ return ioctl(fd, ASHMEM_GET_SIZE, NULL);
+}
+#endif //_CUTILS_ASHMEM_NO_NDK_H
+#endif //__ANDROID__
diff --git a/src/bin/lttng-sessiond/shm.h b/src/bin/lttng-sessiond/shm.h
index bcce28b..abe965e 100644
--- a/src/bin/lttng-sessiond/shm.h
+++ b/src/bin/lttng-sessiond/shm.h
@@ -21,4 +21,20 @@
char *shm_ust_get_mmap(char *shm_path, int global);
+#ifdef __ANDROID__
+/*
+ * Temporary fix for missing ashmem references when compiling with the NDK
+ * (instead of trying to port via Android makefiles)
+ */
+#ifndef _CUTILS_ASHMEM_H
+#define _CUTILS_ASHMEM_H
+#define _CUTILS_ASHMEM_NO_NDK_H
+int ashmem_create_region(const char *name, size_t size);
+int ashmem_set_prot_region(int fd, int prot);
+int ashmem_pin_region(int fd, size_t offset, size_t len);
+int ashmem_unpin_region(int fd, size_t offset, size_t len);
+int ashmem_get_size_region(int fd);
+#endif //_CUTILS_ASHMEM_H
+#endif //__ANDROID__
+
#endif /* _LTT_SHM_H */
--
1.8.1.msysgit.1
More information about the lttng-dev
mailing list