/*
* Stop tracing for *all* registered traces (kernel and user-space).
+ *
+ * This call will wait for data availability for each domain of the session so
+ * this can take an abritrary amount of time. However, when returning you have
+ * the guarantee that the data is ready to be read and analyse. Use the
+ * _no_wait call below to avoid this behavior.
*/
extern int lttng_stop_tracing(const char *session_name);
+/*
+ * Behave exactly like lttng_stop_tracing but does not wait for data
+ * availability.
+ */
+extern int lttng_stop_tracing_no_wait(const char *session_name);
+
/*
* Add context to event(s) for a specific channel (or for all).
*
#include <common/sessiond-comm/sessiond-comm.h>
static char *opt_session_name;
+static int opt_no_wait;
enum {
OPT_HELP = 1,
/* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
{"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0},
{"list-options", 0, POPT_ARG_NONE, NULL, OPT_LIST_OPTIONS, NULL, NULL},
+ {"no-wait", 'n', POPT_ARG_VAL, &opt_no_wait, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0}
};
fprintf(ofp, "Options:\n");
fprintf(ofp, " -h, --help Show this help\n");
fprintf(ofp, " --list-options Simple listing of options\n");
+ fprintf(ofp, " -n, --no-wait Don't wait for data availability\n");
fprintf(ofp, "\n");
}
session_name = opt_session_name;
}
- ret = lttng_stop_tracing(session_name);
+ if (opt_no_wait) {
+ ret = lttng_stop_tracing_no_wait(session_name);
+ } else {
+ ret = lttng_stop_tracing(session_name);
+ }
if (ret < 0) {
switch (-ret) {
case LTTNG_ERR_TRACE_ALREADY_STOPPED:
#define DEFAULT_HEALTH_CHECK_DELTA_S 20
#define DEFAULT_HEALTH_CHECK_DELTA_NS 0
+/*
+ * Wait period before retrying the lttng_data_available command in the lttng
+ * stop command of liblttng-ctl.
+ */
+#define DEFAULT_DATA_AVAILABILITY_WAIT_TIME 200000 /* usec */
+
#endif /* _DEFAULTS_H */
* Those two variables are used by error.h to silent or control the verbosity of
* error message. They are global to the library so application linking with it
* are able to compile correctly and also control verbosity of the library.
- *
- * Note that it is *not* possible to silent ERR() and PERROR() macros.
*/
int lttng_opt_quiet;
int lttng_opt_verbose;
}
/*
- * Stop tracing for all traces of the session.
- * Returns size of returned session payload data or a negative error code.
+ * Stop tracing for all traces of the session.
*/
-int lttng_stop_tracing(const char *session_name)
+static int _lttng_stop_tracing(const char *session_name, int wait)
{
+ int ret, data_ret;
struct lttcomm_session_msg lsm;
if (session_name == NULL) {
copy_string(lsm.session.name, session_name, sizeof(lsm.session.name));
- return ask_sessiond(&lsm, NULL);
+ ret = ask_sessiond(&lsm, NULL);
+ if (ret < 0 && ret != -LTTNG_ERR_TRACE_ALREADY_STOPPED) {
+ goto error;
+ }
+
+ if (!wait) {
+ goto end;
+ }
+
+ _MSG("Waiting for data availability");
+
+ /* Check for data availability */
+ do {
+ data_ret = lttng_data_available(session_name);
+ if (data_ret < 0) {
+ /* Return the data available call error. */
+ ret = data_ret;
+ goto error;
+ }
+
+ /*
+ * Data sleep time before retrying (in usec). Don't sleep if the call
+ * returned value indicates availability.
+ */
+ if (!data_ret) {
+ usleep(DEFAULT_DATA_AVAILABILITY_WAIT_TIME);
+ _MSG(".");
+ }
+ } while (data_ret != 1);
+
+ MSG("");
+
+end:
+error:
+ return ret;
+}
+
+/*
+ * Stop tracing and wait for data availability.
+ */
+int lttng_stop_tracing(const char *session_name)
+{
+ return _lttng_stop_tracing(session_name, 1);
+}
+
+/*
+ * Stop tracing but _don't_ wait for data availability.
+ */
+int lttng_stop_tracing_no_wait(const char *session_name)
+{
+ return _lttng_stop_tracing(session_name, 0);
}
/*