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);
}
/* 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.
/* 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.
/* 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.
/* 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.
/* 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.
/* 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.