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)
{
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;
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 {
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;
}
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.
*/
result = patient_write(buf->file_fd, subbuf_mem, cur_sb_size);
if(result == -1) {
PERROR("write");
- /* FIXME: maybe drop this trace */
return -1;
}
}
/* write data to file */
- write_current_subbuffer(buf);
- /* FIXME: handle return value? */
+ result = write_current_subbuffer(buf);
+ if(result == -1) {
+ ERR("Failed writing a subbuffer to file (channel=%s). Dropping this buffer.", buf->name);
+ }
/* put the subbuffer */
result = put_subbuffer(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.
*/
consumer_loop(buf);
- free(args->bufname);
+ free((void *)args->bufname);
destroy_buffer(buf);
end:
- /* bufname is free'd in free_buffer() */
free(args);
return NULL;
}