Clean-up: common: fix -Wshadow error in lttng_daemonize
[lttng-tools.git] / src / common / userspace-probe.c
index 79069513aca35f079314ac8e3ca15217d6b0a76a..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:
@@ -430,7 +472,7 @@ lttng_userspace_probe_location_function_create(const char *binary_path,
        struct lttng_userspace_probe_location *ret = NULL;
 
        if (!binary_path || !function_name) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                goto end;
        }
 
@@ -458,7 +500,7 @@ lttng_userspace_probe_location_tracepoint_create(const char *binary_path,
        struct lttng_userspace_probe_location *ret = NULL;
 
        if (!binary_path || !probe_name || !provider_name) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                goto end;
        }
 
@@ -693,7 +735,7 @@ const char *lttng_userspace_probe_location_function_get_binary_path(
 
        if (!location || lttng_userspace_probe_location_get_type(location) !=
                        LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                goto end;
        }
 
@@ -713,7 +755,7 @@ const char *lttng_userspace_probe_location_tracepoint_get_binary_path(
 
        if (!location || lttng_userspace_probe_location_get_type(location) !=
                        LTTNG_USERSPACE_PROBE_LOCATION_TYPE_TRACEPOINT) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                goto end;
        }
 
@@ -733,7 +775,7 @@ const char *lttng_userspace_probe_location_function_get_function_name(
 
        if (!location || lttng_userspace_probe_location_get_type(location) !=
                        LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                goto end;
        }
 
@@ -752,7 +794,7 @@ const char *lttng_userspace_probe_location_tracepoint_get_probe_name(
 
        if (!location || lttng_userspace_probe_location_get_type(location) !=
                        LTTNG_USERSPACE_PROBE_LOCATION_TYPE_TRACEPOINT) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                goto end;
        }
 
@@ -771,7 +813,7 @@ const char *lttng_userspace_probe_location_tracepoint_get_provider_name(
 
        if (!location || lttng_userspace_probe_location_get_type(location) !=
                        LTTNG_USERSPACE_PROBE_LOCATION_TYPE_TRACEPOINT) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                goto end;
        }
 
@@ -790,7 +832,7 @@ int lttng_userspace_probe_location_function_get_binary_fd(
 
        if (!location || lttng_userspace_probe_location_get_type(location) !=
                        LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                goto end;
        }
 
@@ -811,7 +853,7 @@ lttng_userspace_probe_location_function_get_instrumentation_type(
 
        if (!location || lttng_userspace_probe_location_get_type(location) !=
                        LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                type = LTTNG_USERSPACE_PROBE_LOCATION_FUNCTION_INSTRUMENTATION_TYPE_UNKNOWN;
                goto end;
        }
@@ -836,7 +878,7 @@ lttng_userspace_probe_location_function_set_instrumentation_type(
                        LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION ||
                        instrumentation_type !=
                        LTTNG_USERSPACE_PROBE_LOCATION_FUNCTION_INSTRUMENTATION_TYPE_ENTRY) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                status = LTTNG_USERSPACE_PROBE_LOCATION_STATUS_INVALID;
                goto end;
        }
@@ -856,7 +898,7 @@ int lttng_userspace_probe_location_tracepoint_get_binary_fd(
 
        if (!location || lttng_userspace_probe_location_get_type(location) !=
                        LTTNG_USERSPACE_PROBE_LOCATION_TYPE_TRACEPOINT) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                goto end;
        }
 
@@ -876,7 +918,7 @@ lttng_userspace_probe_location_function_get_lookup_method(
 
        if (!location || lttng_userspace_probe_location_get_type(location) !=
                        LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                goto end;
        }
 
@@ -893,7 +935,7 @@ lttng_userspace_probe_location_tracepoint_get_lookup_method(
 
        if (!location || lttng_userspace_probe_location_get_type(location) !=
                        LTTNG_USERSPACE_PROBE_LOCATION_TYPE_TRACEPOINT) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                goto end;
        }
 
@@ -1130,7 +1172,7 @@ int lttng_userspace_probe_location_serialize(
        struct lttng_userspace_probe_location_comm location_generic_comm;
 
        if (!location) {
-               ERR("Invalid argument(s)");
+               ERR("Invalid argument(s) passed to '%s'", __FUNCTION__);
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
@@ -1212,11 +1254,14 @@ int lttng_userspace_probe_location_function_create_from_payload(
        binary_path_src = function_name_src +
                        location_function_comm->function_name_len;
 
-       if (function_name_src[location_function_comm->function_name_len - 1] != '\0') {
+       if (!lttng_buffer_view_contains_string(&view->buffer, function_name_src,
+                           location_function_comm->function_name_len)) {
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
-       if (binary_path_src[location_function_comm->binary_path_len - 1] != '\0') {
+
+       if (!lttng_buffer_view_contains_string(&view->buffer, binary_path_src,
+                           location_function_comm->binary_path_len)) {
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
@@ -1300,17 +1345,20 @@ int lttng_userspace_probe_location_tracepoint_create_from_payload(
        binary_path_src = provider_name_src +
                        location_tracepoint_comm->provider_name_len;
 
-       if (probe_name_src[location_tracepoint_comm->probe_name_len - 1] != '\0') {
+       if (!lttng_buffer_view_contains_string(&view->buffer, probe_name_src,
+                           location_tracepoint_comm->probe_name_len)) {
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
 
-       if (provider_name_src[location_tracepoint_comm->provider_name_len - 1] != '\0') {
+       if (!lttng_buffer_view_contains_string(&view->buffer, provider_name_src,
+                           location_tracepoint_comm->provider_name_len)) {
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
 
-       if (binary_path_src[location_tracepoint_comm->binary_path_len - 1] != '\0') {
+       if (!lttng_buffer_view_contains_string(&view->buffer, binary_path_src,
+                           location_tracepoint_comm->binary_path_len)) {
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
@@ -1411,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);
 
@@ -1907,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.028304 seconds and 4 git commands to generate.