X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ustd%2Fustd.c;h=aae4b0248ba0a9a689ecb9f4de8f969c64e6d5f3;hb=463011e4be98c30caf7be5185463c732563a860f;hp=f3285f58ba534d8c82c7f80677f5eba5f32de85d;hpb=9be57e249a31b51a471b4d0aaa43c917cec5e97a;p=ust.git diff --git a/ustd/ustd.c b/ustd/ustd.c index f3285f5..aae4b02 100644 --- a/ustd/ustd.c +++ b/ustd/ustd.c @@ -59,7 +59,7 @@ char *pidfile = NULL; int active_buffers = 0; pthread_mutex_t active_buffers_mutex = PTHREAD_MUTEX_INITIALIZER; /* Whether a request to end the program was received. */ -sig_atomic_t terminate_req = 0; +volatile sig_atomic_t terminate_req = 0; int get_subbuffer(struct buffer_info *buf) { @@ -71,7 +71,7 @@ int get_subbuffer(struct buffer_info *buf) asprintf(&send_msg, "get_subbuffer %s", buf->name); result = ustcomm_send_request(&buf->conn, send_msg, &received_msg); - if((result == -1 && errno == EPIPE) || result == 0) { + if((result == -1 && (errno == ECONNRESET || errno == EPIPE)) || result == 0) { DBG("app died while being traced"); retval = GET_SUBBUF_DIED; goto end; @@ -86,11 +86,10 @@ int get_subbuffer(struct buffer_info *buf) if(result != 2 && result != 1) { ERR("unable to parse response to get_subbuffer"); retval = -1; + free(received_msg); goto end_rep; } - DBG("received msg is %s", received_msg); - if(!strcmp(rep_code, "OK")) { DBG("got subbuffer %s", buf->name); retval = GET_SUBBUF_OK; @@ -100,8 +99,8 @@ int get_subbuffer(struct buffer_info *buf) goto end_rep; } else if(!strcmp(received_msg, "NOTFOUND")) { - WARN("For buffer %s, the trace was not found. This likely means it was destroyed by the user.", buf->name); - retval = GET_SUBBUF_DONE; + DBG("For buffer %s, the trace was not found. This likely means it was destroyed by the user.", buf->name); + retval = GET_SUBBUF_DIED; goto end_rep; } else { @@ -132,7 +131,7 @@ int put_subbuffer(struct buffer_info *buf) asprintf(&send_msg, "put_subbuffer %s %ld", buf->name, buf->consumed_old); result = ustcomm_send_request(&buf->conn, send_msg, &received_msg); - if(result < 0 && errno == ECONNRESET) { + if(result < 0 && (errno == ECONNRESET || errno == EPIPE)) { retval = PUT_SUBBUF_DIED; goto end; } @@ -161,7 +160,7 @@ int put_subbuffer(struct buffer_info *buf) retval = PUT_SUBBUF_OK; } else if(!strcmp(received_msg, "NOTFOUND")) { - WARN("For buffer %s, the trace was not found. This likely means it was destroyed by the user.", buf->name); + DBG("For buffer %s, the trace was not found. This likely means it was destroyed by the user.", buf->name); /* However, maybe this was not the last subbuffer. So * we return the program died. */ @@ -400,6 +399,33 @@ error: return NULL; } +static void destroy_buffer(struct buffer_info *buf) +{ + int result; + + result = ustcomm_close_app(&buf->conn); + if(result == -1) { + WARN("problem calling ustcomm_close_app"); + } + + result = shmdt(buf->mem); + if(result == -1) { + PERROR("shmdt"); + } + + result = shmdt(buf->bufstruct_mem); + if(result == -1) { + PERROR("shmdt"); + } + + result = close(buf->file_fd); + if(result == -1) { + PERROR("close"); + } + + free(buf); +} + int unwrite_last_subbuffer(struct buffer_info *buf) { int result; @@ -483,7 +509,7 @@ int consumer_loop(struct buffer_info *buf) break; } else if(result == PUT_SUBBUF_DIED) { - WARN("application died while putting subbuffer"); + DBG("application died while putting subbuffer"); /* Skip the first subbuffer. We are not sure it is trustable * because the put_subbuffer() did not complete. */ @@ -513,10 +539,6 @@ int consumer_loop(struct buffer_info *buf) return 0; } -void free_buffer(struct buffer_info *buf) -{ -} - struct consumer_thread_args { pid_t pid; const char *bufname; @@ -537,10 +559,10 @@ void *consumer_thread(void *arg) consumer_loop(buf); - free_buffer(buf); + free((void *)args->bufname); + destroy_buffer(buf); end: - /* bufname is free'd in free_buffer() */ free(args); return NULL; } @@ -549,6 +571,7 @@ int start_consuming_buffer(pid_t pid, const char *bufname) { pthread_t thr; struct consumer_thread_args *args; + int result; DBG("beginning of start_consuming_buffer: args: pid %d bufname %s", pid, bufname); @@ -558,7 +581,16 @@ int start_consuming_buffer(pid_t pid, const char *bufname) args->bufname = strdup(bufname); DBG("beginning2 of start_consuming_buffer: args: pid %d bufname %s", args->pid, args->bufname); - pthread_create(&thr, NULL, consumer_thread, args); + result = pthread_create(&thr, NULL, consumer_thread, args); + if(result == -1) { + ERR("pthread_create failed"); + return -1; + } + result = pthread_detach(thr); + if(result == -1) { + ERR("pthread_detach failed"); + return -1; + } DBG("end of start_consuming_buffer: args: pid %d bufname %s", args->pid, args->bufname); return 0; @@ -674,6 +706,11 @@ int start_ustd(int fd) PERROR("sigaction"); return 1; } + result = sigaction(SIGINT, &sa, NULL); + if(result == -1) { + PERROR("sigaction"); + return 1; + } result = ustcomm_init_ustd(&ustd, sock_path); if(result == -1) { @@ -756,6 +793,9 @@ int start_ustd(int fd) free_bufname: free(bufname); } + else { + WARN("unknown command: %s", recvbuf); + } free(recvbuf); } @@ -772,6 +812,8 @@ int start_ustd(int fd) } } + ustcomm_fini_ustd(&ustd); + return 0; }