Fix: change health poll update to entry/exit calls
authorDavid Goulet <dgoulet@efficios.com>
Wed, 30 Jan 2013 16:08:54 +0000 (11:08 -0500)
committerDavid Goulet <dgoulet@ev0ke.net>
Wed, 30 Jan 2013 21:22:01 +0000 (16:22 -0500)
It adds a better semantic to the code flow. Furthermore, the current
counter of the health state is now validated raising an assert() if the
value is unexepected.

Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
src/bin/lttng-sessiond/health.h
src/bin/lttng-sessiond/main.c

index 34d2052e5249f8ce145005cfb3dafe5275b67bf6..28d7dc64959387703dcb10e001b945cb1f6e5995 100644 (file)
@@ -74,11 +74,30 @@ struct health_state {
 extern DECLARE_URCU_TLS(struct health_state, health_state);
 
 /*
- * Update current counter by 1 to indicate that the thread entered or
- * left a blocking state caused by a poll().
+ * Update current counter by 1 to indicate that the thread entered or left a
+ * blocking state caused by a poll(). If the counter's value is not an even
+ * number (meaning a code execution flow), an assert() is raised.
  */
-static inline void health_poll_update(void)
+static inline void health_poll_entry(void)
 {
+       /* Code MUST be in code execution state which is an even number. */
+       assert(!(uatomic_read(&URCU_TLS(health_state).current)
+                               & HEALTH_POLL_VALUE));
+
+       uatomic_add(&URCU_TLS(health_state).current, HEALTH_POLL_VALUE);
+}
+
+/*
+ * Update current counter by 1 indicating the exit of a poll or blocking call.
+ * If the counter's value is not an odd number (a poll execution), an assert()
+ * is raised.
+ */
+static inline void health_poll_exit(void)
+{
+       /* Code MUST be in poll execution state which is an odd number. */
+       assert(uatomic_read(&URCU_TLS(health_state).current)
+                               & HEALTH_POLL_VALUE);
+
        uatomic_add(&URCU_TLS(health_state).current, HEALTH_POLL_VALUE);
 }
 
index 157ad1591d631dfcbae14841fbf38610cbd137a2..461394e44e36fa9613d36318d93ad396447e3965 100644 (file)
@@ -734,9 +734,9 @@ static void *thread_manage_kernel(void *data)
 
                /* Poll infinite value of time */
        restart:
-               health_poll_update();
+               health_poll_entry();
                ret = lttng_poll_wait(&events, -1);
-               health_poll_update();
+               health_poll_exit();
                if (ret < 0) {
                        /*
                         * Restart interrupted system call.
@@ -880,14 +880,14 @@ static void *thread_manage_consumer(void *data)
 
        /* Inifinite blocking call, waiting for transmission */
 restart:
-       health_poll_update();
+       health_poll_entry();
 
        if (testpoint(thread_manage_consumer)) {
                goto error;
        }
 
        ret = lttng_poll_wait(&events, -1);
-       health_poll_update();
+       health_poll_exit();
        if (ret < 0) {
                /*
                 * Restart interrupted system call.
@@ -979,9 +979,9 @@ restart:
 
        /* Inifinite blocking call, waiting for transmission */
 restart_poll:
-       health_poll_update();
+       health_poll_entry();
        ret = lttng_poll_wait(&events, -1);
-       health_poll_update();
+       health_poll_exit();
        if (ret < 0) {
                /*
                 * Restart interrupted system call.
@@ -1121,9 +1121,9 @@ static void *thread_manage_apps(void *data)
 
                /* Inifinite blocking call, waiting for transmission */
        restart:
-               health_poll_update();
+               health_poll_entry();
                ret = lttng_poll_wait(&events, -1);
-               health_poll_update();
+               health_poll_exit();
                if (ret < 0) {
                        /*
                         * Restart interrupted system call.
@@ -1401,9 +1401,9 @@ static void *thread_registration_apps(void *data)
 
                /* Inifinite blocking call, waiting for transmission */
        restart:
-               health_poll_update();
+               health_poll_entry();
                ret = lttng_poll_wait(&events, -1);
-               health_poll_update();
+               health_poll_exit();
                if (ret < 0) {
                        /*
                         * Restart interrupted system call.
@@ -3179,9 +3179,9 @@ static void *thread_manage_clients(void *data)
 
                /* Inifinite blocking call, waiting for transmission */
        restart:
-               health_poll_update();
+               health_poll_entry();
                ret = lttng_poll_wait(&events, -1);
-               health_poll_update();
+               health_poll_exit();
                if (ret < 0) {
                        /*
                         * Restart interrupted system call.
This page took 0.030645 seconds and 4 git commands to generate.