* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+/* This file contains the implementation of the UST listener thread, which
+ * receives trace control commands. It also coordinates the initialization of
+ * libust.
+ */
+
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
static unsigned int pow2_higher_or_eq(unsigned int v)
{
int hb = fls(v);
- int hbm1 = hb-1;
int retval = 1<<(hb-1);
if(v-retval == 0)
ustcomm_fini_app(&ustcomm_app, 0);
}
+static void do_cmd_force_switch()
+{
+ struct blocked_consumer *bc;
+
+ list_for_each_entry(bc, &blocked_consumers, list) {
+ ltt_force_switch(bc->buf, FORCE_FLUSH);
+ }
+}
+
int process_client_cmd(char *recvbuf, struct ustcomm_source *src)
{
int result;
free(reply);
}
+ else if(nth_token_is(recvbuf, "get_sock_path", 0) == 1) {
+ char *reply = getenv("UST_DAEMON_SOCKET");
+ if(!reply) {
+ asprintf(&reply, "%s/%s", SOCK_DIR, "ustd");
+ result = ustcomm_send_reply(&ustcomm_app.server, reply, src);
+ free(reply);
+ }
+ else {
+ result = ustcomm_send_reply(&ustcomm_app.server, reply, src);
+ }
+ if(result)
+ ERR("ustcomm_send_reply failed");
+ }
+ else if(nth_token_is(recvbuf, "set_sock_path", 0) == 1) {
+ char *sock_path = nth_token(recvbuf, 1);
+ result = setenv("UST_DAEMON_SOCKET", sock_path, 1);
+ if(result)
+ ERR("cannot set UST_DAEMON_SOCKET environment variable");
+ }
+ else if(nth_token_is(recvbuf, "force_switch", 0) == 1) {
+ do_cmd_force_switch();
+ }
else {
ERR("unable to parse message: %s", recvbuf);
}
if(result) {
PERROR("pthread_sigmask: %s", strerror(result));
}
-
- have_listener = 1;
+ else {
+ have_listener = 1;
+ }
}
static int init_socket(void)
return result;
}
-static void stop_listener()
+static void stop_listener(void)
{
int result;
+ if(!have_listener)
+ return;
+
result = pthread_cancel(listener_thread);
if(result != 0) {
ERR("pthread_cancel: %s", strerror(result));