SoW-2020-0002: Trace Hit Counters
[deliverable/lttng-ust.git] / liblttng-ust / lttng-ust-comm.c
index af8636a812eb438c34c48deb1e4349ca9dd17fc1..0cd0d178c624fdef3f058583295226d93cdc18df 100644 (file)
@@ -345,6 +345,7 @@ static const char *cmd_name_mapping[] = {
        /* Counter commands */
        [ LTTNG_UST_COUNTER_GLOBAL ] = "Create Counter Global",
        [ LTTNG_UST_COUNTER_CPU ] = "Create Counter CPU",
+       [ LTTNG_UST_COUNTER_EVENT ] = "Create Counter Event",
 };
 
 static const char *str_timeout;
@@ -1293,7 +1294,48 @@ int handle_message(struct sock_info *sock_info,
                        ret = -ENOSYS;
                break;
        }
+       case LTTNG_UST_COUNTER_EVENT:
+       {
+               /* Receive struct lttng_ust_counter_event */
+               struct lttng_ust_counter_event counter_event;
 
+               if (sizeof(counter_event) != lum->u.counter_event.len) {
+                       DBG("incorrect counter event data message size: %u", lum->u.counter_event.len);
+                       ret = -EINVAL;
+                       goto error;
+               }
+               len = ustcomm_recv_unix_sock(sock, &counter_event, sizeof(counter_event));
+               switch (len) {
+               case 0: /* orderly shutdown */
+                       ret = 0;
+                       goto error;
+               default:
+                       if (len == sizeof(counter_event)) {
+                               DBG("counter event data received");
+                               break;
+                       } else 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 data message size: %zd", len);
+                               ret = -EINVAL;
+                               goto error;
+                       }
+               }
+               if (ops->cmd)
+                       ret = ops->cmd(lum->handle, lum->cmd,
+                                       (unsigned long) &counter_event,
+                                       &args, sock_info);
+               else
+                       ret = -ENOSYS;
+               break;
+       }
        default:
                if (ops->cmd)
                        ret = ops->cmd(lum->handle, lum->cmd,
This page took 0.025317 seconds and 5 git commands to generate.