Clean-up: common: fix -Wshadow error in lttng_daemonize
[lttng-tools.git] / src / common / userspace-probe.c
index 49cc835750366166070c72c3bac21ef8ca0c50cf..a1a4d1fb3f3f14a82fefee7c4746773339397be4 100644 (file)
@@ -12,6 +12,8 @@
 #include <common/macros.h>
 #include <common/payload.h>
 #include <common/payload-view.h>
+#include <common/hashtable/hashtable.h>
+#include <common/hashtable/utils.h>
 #include <fcntl.h>
 #include <lttng/constant.h>
 #include <lttng/userspace-probe-internal.h>
@@ -199,6 +201,25 @@ end:
        return is_equal;
 }
 
+static unsigned long lttng_userspace_probe_location_function_hash(
+               const struct lttng_userspace_probe_location *location)
+{
+       unsigned long hash = hash_key_ulong(
+                       (void *) LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION,
+                       lttng_ht_seed);
+       struct lttng_userspace_probe_location_function *function_location =
+                       container_of(location, typeof(*function_location),
+                                       parent);
+
+       hash ^= hash_key_str(function_location->function_name, lttng_ht_seed);
+       hash ^= hash_key_str(function_location->binary_path, lttng_ht_seed);
+       /*
+        * No need to hash on the fd. Worst comes to worse,
+        * the equal function will discriminate.
+        */
+       return hash;
+}
+
 static bool lttng_userspace_probe_location_function_is_equal(
                const struct lttng_userspace_probe_location *_a,
                const struct lttng_userspace_probe_location *_b)
@@ -290,6 +311,7 @@ lttng_userspace_probe_location_function_create_no_check(const char *binary_path,
        ret->lookup_method = lookup_method;
        ret->type = LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION;
        ret->equal = lttng_userspace_probe_location_function_is_equal;
+       ret->hash = lttng_userspace_probe_location_function_hash;
        goto end;
 
 error:
@@ -305,6 +327,25 @@ end:
        return ret;
 }
 
+static unsigned long lttng_userspace_probe_location_tracepoint_hash(
+               const struct lttng_userspace_probe_location *location)
+{
+       unsigned long hash = hash_key_ulong(
+                       (void *) LTTNG_USERSPACE_PROBE_LOCATION_TYPE_TRACEPOINT,
+                       lttng_ht_seed);
+       struct lttng_userspace_probe_location_tracepoint *tp_location =
+                       container_of(location, typeof(*tp_location), parent);
+
+       hash ^= hash_key_str(tp_location->probe_name, lttng_ht_seed);
+       hash ^= hash_key_str(tp_location->provider_name, lttng_ht_seed);
+       hash ^= hash_key_str(tp_location->binary_path, lttng_ht_seed);
+       /*
+        * No need to hash on the fd. Worst comes to worse,
+        * the equal function will discriminate.
+        */
+       return hash;
+}
+
 static bool lttng_userspace_probe_location_tracepoint_is_equal(
                const struct lttng_userspace_probe_location *_a,
                const struct lttng_userspace_probe_location *_b)
@@ -406,6 +447,7 @@ lttng_userspace_probe_location_tracepoint_create_no_check(const char *binary_pat
        ret->lookup_method = lookup_method;
        ret->type = LTTNG_USERSPACE_PROBE_LOCATION_TYPE_TRACEPOINT;
        ret->equal = lttng_userspace_probe_location_tracepoint_is_equal;
+       ret->hash = lttng_userspace_probe_location_tracepoint_hash;
        goto end;
 
 error:
@@ -1212,13 +1254,13 @@ int lttng_userspace_probe_location_function_create_from_payload(
        binary_path_src = function_name_src +
                        location_function_comm->function_name_len;
 
-       if (lttng_buffer_view_contains_string(&view->buffer, function_name_src,
+       if (!lttng_buffer_view_contains_string(&view->buffer, function_name_src,
                            location_function_comm->function_name_len)) {
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
 
-       if (lttng_buffer_view_contains_string(&view->buffer, binary_path_src,
+       if (!lttng_buffer_view_contains_string(&view->buffer, binary_path_src,
                            location_function_comm->binary_path_len)) {
                ret = -LTTNG_ERR_INVALID;
                goto end;
@@ -1303,19 +1345,19 @@ int lttng_userspace_probe_location_tracepoint_create_from_payload(
        binary_path_src = provider_name_src +
                        location_tracepoint_comm->provider_name_len;
 
-       if (lttng_buffer_view_contains_string(&view->buffer, probe_name_src,
+       if (!lttng_buffer_view_contains_string(&view->buffer, probe_name_src,
                            location_tracepoint_comm->probe_name_len)) {
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
 
-       if (lttng_buffer_view_contains_string(&view->buffer, provider_name_src,
+       if (!lttng_buffer_view_contains_string(&view->buffer, provider_name_src,
                            location_tracepoint_comm->provider_name_len)) {
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
 
-       if (lttng_buffer_view_contains_string(&view->buffer, binary_path_src,
+       if (!lttng_buffer_view_contains_string(&view->buffer, binary_path_src,
                            location_tracepoint_comm->binary_path_len)) {
                ret = -LTTNG_ERR_INVALID;
                goto end;
@@ -1417,22 +1459,25 @@ int lttng_userspace_probe_location_create_from_payload(
                struct lttng_userspace_probe_location **location)
 {
        struct lttng_userspace_probe_location_lookup_method *lookup_method;
-       struct lttng_userspace_probe_location_comm *probe_location_comm;
        enum lttng_userspace_probe_location_type type;
        int consumed = 0;
        int ret;
+       struct lttng_userspace_probe_location_comm *probe_location_comm;
+       struct lttng_payload_view probe_location_comm_view =
+                       lttng_payload_view_from_view(
+                                       view, 0, sizeof(*probe_location_comm));
 
        assert(view);
        assert(location);
 
        lookup_method = NULL;
 
-       if (view->buffer.size <= sizeof(*probe_location_comm)) {
+       if (!lttng_payload_view_is_valid(&probe_location_comm_view)) {
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
 
-       probe_location_comm = (typeof(probe_location_comm)) view->buffer.data;
+       probe_location_comm = (typeof(probe_location_comm)) probe_location_comm_view.buffer.data;
        type = (enum lttng_userspace_probe_location_type) probe_location_comm->type;
        consumed += sizeof(*probe_location_comm);
 
@@ -1913,3 +1958,10 @@ bool lttng_userspace_probe_location_is_equal(
 end:
        return is_equal;
 }
+
+LTTNG_HIDDEN
+unsigned long lttng_userspace_probe_location_hash(
+               const struct lttng_userspace_probe_location *location)
+{
+       return location->hash(location);
+}
This page took 0.024648 seconds and 4 git commands to generate.