Lockstep with lttng-ust.
Part of the fix for issue #692
Signed-off-by: David Goulet <dgoulet@efficios.com>
/*
* Handle a new JUL registration using the reg socket. After that, a new JUL
* application is added to the global hash table and attach to an UST app
- * object.
+ * object. If r_app is not NULL, the created app is set to the pointer.
*
* Return the new FD created upon accept() on success or else a negative errno
* value.
*/
-static int handle_registration(struct lttcomm_sock *reg_sock)
+static int handle_registration(struct lttcomm_sock *reg_sock,
+ struct jul_app **r_app)
{
int ret;
pid_t pid;
* app and app before JUL.
*/
+ if (r_app) {
+ *r_app = app;
+ }
+
return new_sock->fd;
error_socket:
destroy_jul_app(pollfd);
} else if (revents & (LPOLLIN)) {
int new_fd;
+ struct jul_app *app = NULL;
/* Pollin event of JUL app socket should NEVER happen. */
assert(pollfd == reg_sock->fd);
- new_fd = handle_registration(reg_sock);
+ new_fd = handle_registration(reg_sock, &app);
if (new_fd < 0) {
WARN("[jul-thread] JUL registration failed. Ignoring.");
/* Somehow the communication failed. Just continue. */
continue;
}
+ /* Should not have a NULL app on success. */
+ assert(app);
/* Only add poll error event to only detect shutdown. */
ret = lttng_poll_add(&events, new_fd,
/* Update newly registered app. */
update_jul_app(new_fd);
+
+ /* On failure, the poll will detect it and clean it up. */
+ (void) jul_send_registration_done(app);
} else {
ERR("Unknown poll events %u for sock %d", revents, pollfd);
continue;
return ret;
}
+/*
+ * Send back the registration DONE command to a given JUL application.
+ *
+ * Return 0 on success or else a negative value.
+ */
+int jul_send_registration_done(struct jul_app *app)
+{
+ assert(app);
+ assert(app->sock);
+
+ DBG("JUL sending registration done to app socket %d", app->sock->fd);
+
+ return send_header(app->sock, 0, JUL_CMD_REG_DONE, 0);
+}
+
/*
* Enable JUL event on every JUL applications registered with the session
* daemon.
void jul_delete_app(struct jul_app *app);
struct jul_app *jul_find_app_by_sock(int sock);
void jul_destroy_app(struct jul_app *app);
+int jul_send_registration_done(struct jul_app *app);
/* JUL action API */
int jul_enable_event(struct jul_event *event);
JUL_CMD_LIST = 1,
JUL_CMD_ENABLE = 2,
JUL_CMD_DISABLE = 3,
+ JUL_CMD_REG_DONE = 4, /* End registration process. */
};
/*
destroy_lttng_session $SESSION_NAME
# Validate test. Expecting all events.
- trace_matches $EVENT_NAME $(($NR_ITER - 1)) $TRACE_PATH
+ trace_matches $EVENT_NAME $NR_ITER $TRACE_PATH
if [ $? -ne 0 ]; then
return $?
fi
destroy_lttng_session $SESSION_NAME
# Validate test. Expecting all events.
- trace_matches $EVENT_NAME $(($NR_ITER - 1)) $TRACE_PATH
+ trace_matches $EVENT_NAME $NR_ITER $TRACE_PATH
if [ $? -ne 0 ]; then
return $?
fi
destroy_lttng_session $SESSION_NAME
# Validate test. Expecting all events.
- trace_matches $EVENT_NAME $(($NR_ITER - 1)) $TRACE_PATH
+ trace_matches $EVENT_NAME $NR_ITER $TRACE_PATH
if [ $? -ne 0 ]; then
return $?
fi
destroy_lttng_session $SESSION_NAME
# Validate test. Expecting all events.
- trace_matches $EVENT_NAME $(($NR_ITER - 1)) $TRACE_PATH
+ trace_matches $EVENT_NAME $NR_ITER $TRACE_PATH
return $?
}