Move to kernel style SPDX license identifiers
[lttng-ust.git] / liblttng-ust / lttng-ust-abi.c
index 0d2058a3f5947b24eb604c88a0f1c5a20e880a1b..62e1be74c1232ca31cee54c83f90df2b4bf51320 100644 (file)
@@ -1,24 +1,9 @@
 /*
- * lttng-ust-abi.c
- *
- * LTTng UST ABI
+ * SPDX-License-Identifier: LGPL-2.1-only
  *
  * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; only
- * version 2.1 of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ * LTTng UST ABI
  *
  * Mimic system calls for:
  * - session creation, returns an object descriptor or failure.
@@ -57,6 +42,7 @@
 #include "../libringbuffer/frontend_types.h"
 #include "../libringbuffer/shm.h"
 #include "../libcounter/counter.h"
+#include "tracepoint-internal.h"
 #include "lttng-tracer.h"
 #include "string-utils.h"
 #include "ust-events-internal.h"
@@ -345,10 +331,10 @@ long lttng_abi_tracer_version(int objd,
 }
 
 static
-int lttng_abi_event_notifier_send_fd(void *owner, int event_notifier_notif_fd)
+int lttng_abi_event_notifier_send_fd(void *owner, int *event_notifier_notif_fd)
 {
        struct lttng_event_notifier_group *event_notifier_group;
-       int event_notifier_group_objd, ret, fd_flag, close_ret;
+       int event_notifier_group_objd, ret, fd_flag;
 
        event_notifier_group = lttng_event_notifier_group_create();
        if (!event_notifier_group)
@@ -357,11 +343,11 @@ int lttng_abi_event_notifier_send_fd(void *owner, int event_notifier_notif_fd)
        /*
         * Set this file descriptor as NON-BLOCKING.
         */
-       fd_flag = fcntl(event_notifier_notif_fd, F_GETFL);
+       fd_flag = fcntl(*event_notifier_notif_fd, F_GETFL);
 
        fd_flag |= O_NONBLOCK;
 
-       ret = fcntl(event_notifier_notif_fd, F_SETFL, fd_flag);
+       ret = fcntl(*event_notifier_notif_fd, F_SETFL, fd_flag);
        if (ret) {
                ret = -errno;
                goto fd_error;
@@ -376,18 +362,15 @@ int lttng_abi_event_notifier_send_fd(void *owner, int event_notifier_notif_fd)
 
        event_notifier_group->objd = event_notifier_group_objd;
        event_notifier_group->owner = owner;
-       event_notifier_group->notification_fd = event_notifier_notif_fd;
+       event_notifier_group->notification_fd = *event_notifier_notif_fd;
+       /* Object descriptor takes ownership of notification fd. */
+       *event_notifier_notif_fd = -1;
 
        return event_notifier_group_objd;
 
 objd_error:
        lttng_event_notifier_group_destroy(event_notifier_group);
 fd_error:
-       close_ret = close(event_notifier_notif_fd);
-       if (close_ret) {
-               PERROR("close");
-       }
-
        return ret;
 }
 
@@ -438,11 +421,11 @@ long lttng_cmd(int objd, unsigned int cmd, unsigned long arg,
        case LTTNG_UST_TRACEPOINT_FIELD_LIST:
                return lttng_abi_tracepoint_field_list(owner);
        case LTTNG_UST_WAIT_QUIESCENT:
-               synchronize_trace();
+               lttng_ust_synchronize_trace();
                return 0;
        case LTTNG_UST_EVENT_NOTIFIER_GROUP_CREATE:
                return lttng_abi_event_notifier_send_fd(owner,
-                       uargs->event_notifier_handle.event_notifier_notif_fd);
+                       &uargs->event_notifier_handle.event_notifier_notif_fd);
        default:
                return -EINVAL;
        }
@@ -452,6 +435,7 @@ static const struct lttng_ust_objd_ops lttng_ops = {
        .cmd = lttng_cmd,
 };
 
+static
 int lttng_abi_map_channel(int session_objd,
                struct lttng_ust_channel *ust_chan,
                union ust_args *uargs,
@@ -496,6 +480,10 @@ int lttng_abi_map_channel(int session_objd,
                goto handle_error;
        }
 
+       /* Ownership of chan_data and wakeup_fd taken by channel handle. */
+       uargs->channel.chan_data = NULL;
+       uargs->channel.wakeup_fd = -1;
+
        chan = shmp(channel_handle, channel_handle->chan);
        assert(chan);
        chan->handle = channel_handle;
@@ -579,24 +567,9 @@ alloc_error:
        channel_destroy(chan, channel_handle, 0);
        return ret;
 
-       /*
-        * error path before channel creation (owning chan_data and
-        * wakeup_fd).
-        */
 handle_error:
 active:
 invalid:
-       {
-               int close_ret;
-
-               lttng_ust_lock_fd_tracker();
-               close_ret = close(wakeup_fd);
-               lttng_ust_unlock_fd_tracker();
-               if (close_ret) {
-                       PERROR("close");
-               }
-       }
-       free(chan_data);
        return ret;
 }
 
@@ -724,14 +697,14 @@ long lttng_event_notifier_enabler_cmd(int objd, unsigned int cmd, unsigned long
        case LTTNG_UST_FILTER:
                return lttng_event_notifier_enabler_attach_filter_bytecode(
                        event_notifier_enabler,
-                       (struct lttng_ust_bytecode_node *) arg);
+                       (struct lttng_ust_bytecode_node **) arg);
        case LTTNG_UST_EXCLUSION:
                return lttng_event_notifier_enabler_attach_exclusion(event_notifier_enabler,
-                       (struct lttng_ust_excluder_node *) arg);
+                       (struct lttng_ust_excluder_node **) arg);
        case LTTNG_UST_CAPTURE:
                return lttng_event_notifier_enabler_attach_capture_bytecode(
                        event_notifier_enabler,
-                       (struct lttng_ust_bytecode_node *) arg);
+                       (struct lttng_ust_bytecode_node **) arg);
        case LTTNG_UST_ENABLE:
                return lttng_event_notifier_enabler_enable(event_notifier_enabler);
        case LTTNG_UST_DISABLE:
@@ -777,6 +750,7 @@ long lttng_event_notifier_group_error_counter_cmd(int objd, unsigned int cmd, un
        }
 }
 
+LTTNG_HIDDEN
 int lttng_release_event_notifier_group_error_counter(int objd)
 {
        struct lttng_counter *counter = objd_private(objd);
@@ -815,10 +789,10 @@ int lttng_ust_event_notifier_group_create_error_counter(int event_notifier_group
                return -EINVAL;
 
        switch (error_counter_conf->bitness) {
-       case LTTNG_UST_COUNTER_BITNESS_64BITS:
+       case LTTNG_UST_COUNTER_BITNESS_64:
                counter_transport_name = "counter-per-cpu-64-modular";
                break;
-       case LTTNG_UST_COUNTER_BITNESS_32BITS:
+       case LTTNG_UST_COUNTER_BITNESS_32:
                counter_transport_name = "counter-per-cpu-32-modular";
                break;
        default:
@@ -845,8 +819,16 @@ int lttng_ust_event_notifier_group_create_error_counter(int event_notifier_group
                goto create_error;
        }
 
-       event_notifier_group->error_counter = counter;
        event_notifier_group->error_counter_len = counter_len;
+       /*
+        * store-release to publish error counter matches load-acquire
+        * in record_error. Ensures the counter is created and the
+        * error_counter_len is set before they are used.
+        * Currently a full memory barrier is used, which could be
+        * turned into acquire-release barriers.
+        */
+       cmm_smp_mb();
+       CMM_STORE_SHARED(event_notifier_group->error_counter, counter);
 
        counter->objd = counter_objd;
        counter->event_notifier_group = event_notifier_group;   /* owner */
@@ -1108,6 +1090,9 @@ int lttng_abi_map_stream(int channel_objd, struct lttng_ust_stream *info,
                info->stream_nr, info->len);
        if (ret)
                goto error_add_stream;
+       /* Take ownership of shm_fd and wakeup_fd. */
+       uargs->stream.shm_fd = -1;
+       uargs->stream.wakeup_fd = -1;
 
        return 0;
 
@@ -1292,7 +1277,7 @@ long lttng_event_enabler_cmd(int objd, unsigned int cmd, unsigned long arg,
                int ret;
 
                ret = lttng_event_enabler_attach_filter_bytecode(enabler,
-                               (struct lttng_ust_bytecode_node *) arg);
+                               (struct lttng_ust_bytecode_node **) arg);
                if (ret)
                        return ret;
                return 0;
@@ -1300,7 +1285,7 @@ long lttng_event_enabler_cmd(int objd, unsigned int cmd, unsigned long arg,
        case LTTNG_UST_EXCLUSION:
        {
                return lttng_event_enabler_attach_exclusion(enabler,
-                               (struct lttng_ust_excluder_node *) arg);
+                               (struct lttng_ust_excluder_node **) arg);
        }
        default:
                return -EINVAL;
This page took 0.027633 seconds and 4 git commands to generate.