summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
753e1b5)
When doing this, it is likely the listener thread will still
be running and printing errors because its fd's have been closed.
Instead, do the destruction in the listener app and cleanly
shut it down with pthread_cancel().
+static void listener_cleanup(void *ptr)
+{
+ ustcomm_fini_app(&ustcomm_app, 0);
+}
+
void *listener_main(void *p)
{
int result;
DBG("LISTENER");
void *listener_main(void *p)
{
int result;
DBG("LISTENER");
+ pthread_cleanup_push(listener_cleanup, NULL);
+
for(;;) {
char trace_name[] = "auto";
char trace_type[] = "ustrelay";
for(;;) {
char trace_name[] = "auto";
char trace_type[] = "ustrelay";
next_cmd:
free(recvbuf);
}
next_cmd:
free(recvbuf);
}
+
+ pthread_cleanup_pop(1);
}
volatile sig_atomic_t have_listener = 0;
}
volatile sig_atomic_t have_listener = 0;
+#ifndef USE_CLONE
+static pthread_t listener_thread;
+#endif
void create_listener(void)
{
#ifdef USE_CLONE
static char listener_stack[16384];
int result;
void create_listener(void)
{
#ifdef USE_CLONE
static char listener_stack[16384];
int result;
-#else
- pthread_t thread;
#endif
if(have_listener) {
#endif
if(have_listener) {
- pthread_create(&thread, NULL, listener_main, NULL);
+ pthread_create(&listener_thread, NULL, listener_main, NULL);
#endif
have_listener = 1;
#endif
have_listener = 1;
+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
/* 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
- ustcomm_fini_app(&ustcomm_app, 0);
+ /* Ask the listener to stop and clean up. */
+ stop_listener();
}
void ust_potential_exec(void)
}
void ust_potential_exec(void)