Implement event notifier
[lttng-ust.git] / liblttng-ust / lttng-ust-comm.c
index 6258bfd2485691eae04411278f1bc2ed111d58c0..530102b54aee47864dc463d63ce9d3b6dc774453 100644 (file)
@@ -42,6 +42,7 @@
 #include <urcu/futex.h>
 #include <urcu/compiler.h>
 
+#include <lttng/align.h>
 #include <lttng/ust-events.h>
 #include <lttng/ust-abi.h>
 #include <lttng/ust.h>
@@ -60,6 +61,7 @@
 #include "clock.h"
 #include "../libringbuffer/getcpu.h"
 #include "getenv.h"
+#include "ust-events-internal.h"
 
 /* Concatenate lttng ust shared library name with its major version number. */
 #define LTTNG_UST_LIB_SO_NAME "liblttng-ust.so." __ust_stringify(CONFIG_LTTNG_UST_LIBRARY_VERSION_MAJOR)
@@ -265,7 +267,7 @@ struct sock_info {
        int statedump_pending;
        int initial_statedump_done;
        /* Keep procname for statedump */
-       char procname[LTTNG_UST_PROCNAME_LEN];
+       char procname[LTTNG_UST_ABI_PROCNAME_LEN];
 };
 
 /* Socket from app (connect) to session daemon (listen) for communication */
@@ -319,6 +321,8 @@ static const char *cmd_name_mapping[] = {
        [ LTTNG_UST_REGISTER_DONE ] = "Registration Done",
        [ LTTNG_UST_TRACEPOINT_FIELD_LIST ] = "Create Tracepoint Field List",
 
+       [ LTTNG_UST_EVENT_NOTIFIER_GROUP_CREATE ] = "Create event notifier group",
+
        /* Session FD commands */
        [ LTTNG_UST_CHANNEL ] = "Create Channel",
        [ LTTNG_UST_SESSION_START ] = "Start Session",
@@ -343,6 +347,9 @@ static const char *cmd_name_mapping[] = {
        /* Event FD commands */
        [ LTTNG_UST_FILTER ] = "Create Filter",
        [ LTTNG_UST_EXCLUSION ] = "Add exclusions to event",
+
+       /* Event notifier group commands */
+       [ LTTNG_UST_EVENT_NOTIFIER_CREATE ] = "Create event notifier",
 };
 
 static const char *str_timeout;
@@ -482,7 +489,7 @@ int setup_global_apps(void)
        }
 
        global_apps.allowed = 1;
-       lttng_ust_getprocname(global_apps.procname);
+       lttng_pthread_getname_np(global_apps.procname, LTTNG_UST_ABI_PROCNAME_LEN);
 error:
        return ret;
 }
@@ -528,7 +535,7 @@ int setup_local_apps(void)
                goto end;
        }
 
-       lttng_ust_getprocname(local_apps.procname);
+       lttng_pthread_getname_np(local_apps.procname, LTTNG_UST_ABI_PROCNAME_LEN);
 end:
        return ret;
 }
@@ -906,6 +913,47 @@ int handle_message(struct sock_info *sock_info,
                }
                break;
        }
+       case LTTNG_UST_EVENT_NOTIFIER_GROUP_CREATE:
+       {
+               int event_notifier_notif_fd;
+
+               len = ustcomm_recv_event_notifier_notif_fd_from_sessiond(sock,
+                       &event_notifier_notif_fd);
+               switch (len) {
+               case 0: /* orderly shutdown */
+                       ret = 0;
+                       goto error;
+               case 1:
+                       break;
+               default:
+                       if (len < 0) {
+                               DBG("Receive failed from lttng-sessiond with errno %d",
+                                               (int) -len);
+                               if (len == -ECONNRESET) {
+                                       ERR("%s remote end closed connection",
+                                                       sock_info->name);
+                                       ret = len;
+                                       goto error;
+                               }
+                               ret = len;
+                               goto error;
+                       } else {
+                               DBG("Incorrect event notifier fd message size: %zd",
+                                               len);
+                               ret = -EINVAL;
+                               goto error;
+                       }
+               }
+               args.event_notifier_handle.event_notifier_notif_fd =
+                               event_notifier_notif_fd;
+               if (ops->cmd)
+                       ret = ops->cmd(lum->handle, lum->cmd,
+                                       (unsigned long) &lum->u,
+                                       &args, sock_info);
+               else
+                       ret = -ENOSYS;
+               break;
+       }
        case LTTNG_UST_CHANNEL:
        {
                void *chan_data;
@@ -1173,7 +1221,7 @@ void cleanup_sock_info(struct sock_info *sock_info, int exiting)
        if (sock_info->wait_shm_mmap) {
                long page_size;
 
-               page_size = sysconf(_SC_PAGE_SIZE);
+               page_size = LTTNG_UST_PAGE_SIZE;
                if (page_size <= 0) {
                        if (!page_size) {
                                errno = EINVAL;
This page took 0.027681 seconds and 4 git commands to generate.