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>
extern DECLARE_URCU_TLS(struct health_state, 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);
}
uatomic_add(&URCU_TLS(health_state).current, HEALTH_POLL_VALUE);
}
/* Poll infinite value of time */
restart:
/* Poll infinite value of time */
restart:
ret = lttng_poll_wait(&events, -1);
ret = lttng_poll_wait(&events, -1);
if (ret < 0) {
/*
* Restart interrupted system call.
if (ret < 0) {
/*
* Restart interrupted system call.
/* Inifinite blocking call, waiting for transmission */
restart:
/* Inifinite blocking call, waiting for transmission */
restart:
if (testpoint(thread_manage_consumer)) {
goto error;
}
ret = lttng_poll_wait(&events, -1);
if (testpoint(thread_manage_consumer)) {
goto error;
}
ret = lttng_poll_wait(&events, -1);
if (ret < 0) {
/*
* Restart interrupted system call.
if (ret < 0) {
/*
* Restart interrupted system call.
/* Inifinite blocking call, waiting for transmission */
restart_poll:
/* Inifinite blocking call, waiting for transmission */
restart_poll:
ret = lttng_poll_wait(&events, -1);
ret = lttng_poll_wait(&events, -1);
if (ret < 0) {
/*
* Restart interrupted system call.
if (ret < 0) {
/*
* Restart interrupted system call.
/* Inifinite blocking call, waiting for transmission */
restart:
/* Inifinite blocking call, waiting for transmission */
restart:
ret = lttng_poll_wait(&events, -1);
ret = lttng_poll_wait(&events, -1);
if (ret < 0) {
/*
* Restart interrupted system call.
if (ret < 0) {
/*
* Restart interrupted system call.
/* Inifinite blocking call, waiting for transmission */
restart:
/* Inifinite blocking call, waiting for transmission */
restart:
ret = lttng_poll_wait(&events, -1);
ret = lttng_poll_wait(&events, -1);
if (ret < 0) {
/*
* Restart interrupted system call.
if (ret < 0) {
/*
* Restart interrupted system call.
/* Inifinite blocking call, waiting for transmission */
restart:
/* Inifinite blocking call, waiting for transmission */
restart:
ret = lttng_poll_wait(&events, -1);
ret = lttng_poll_wait(&events, -1);
if (ret < 0) {
/*
* Restart interrupted system call.
if (ret < 0) {
/*
* Restart interrupted system call.