#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
-#include <sched.h>
#include <fcntl.h>
#include <poll.h>
#include <regex.h>
#include "buffers.h"
#include "marker-control.h"
-//#define USE_CLONE
-
#define USTSIGNAL SIGIO
#define MAX_MSG_SIZE (100)
return retval;
}
+static void listener_cleanup(void *ptr)
+{
+ ustcomm_fini_app(&ustcomm_app, 0);
+}
+
void *listener_main(void *p)
{
int result;
DBG("LISTENER");
+ pthread_cleanup_push(listener_cleanup, NULL);
+
for(;;) {
char trace_name[] = "auto";
char trace_type[] = "ustrelay";
next_cmd:
free(recvbuf);
}
+
+ pthread_cleanup_pop(1);
}
volatile sig_atomic_t have_listener = 0;
+/* These should only be accessed in the parent thread,
+ * not the listener.
+ */
+static pthread_t listener_thread;
void create_listener(void)
{
-#ifdef USE_CLONE
- static char listener_stack[16384];
int result;
-#else
- pthread_t thread;
-#endif
if(have_listener) {
WARN("not creating listener because we already had one");
return;
}
-#ifdef USE_CLONE
- result = clone((int (*)(void *)) listener_main, listener_stack+sizeof(listener_stack)-1, CLONE_FS | CLONE_FILES | CLONE_VM | CLONE_SIGHAND | CLONE_THREAD, NULL);
+ result = pthread_create(&listener_thread, NULL, listener_main, NULL);
if(result == -1) {
- perror("clone");
- return;
+ PERROR("pthread_create");
}
-#else
-
- pthread_create(&thread, NULL, listener_main, NULL);
-#endif
have_listener = 1;
}
return result;
}
+static void stop_listener()
+{
+ int result;
+
+ result = pthread_cancel(listener_thread);
+ if(result == -1) {
+ PERROR("pthread_cancel");
+ }
+ result = pthread_join(listener_thread, NULL);
+ if(result == -1) {
+ PERROR("pthread_join");
+ }
+}
+
/* This destructor keeps the process alive for a few seconds in order
* to leave time to ustd to connect to its buffers. This is necessary
* for programs whose execution is very short. It is also useful in all
destroy_traces();
- ustcomm_fini_app(&ustcomm_app, 0);
+ /* Ask the listener to stop and clean up. */
+ stop_listener();
}
void ust_potential_exec(void)
/* Delete all blocked consumers */
list_for_each_entry(bc, &blocked_consumers, list) {
- close(bc->fd_producer);
- close(bc->fd_consumer);
+ result = close(bc->fd_producer);
+ if(result == -1) {
+ PERROR("close");
+ }
free(deletable_bc);
deletable_bc = bc;
list_del(&bc->list);