X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ustd%2Fustd.c;h=f3285f58ba534d8c82c7f80677f5eba5f32de85d;hb=d6322067aa791234d0d81e1a6b03b445635d5f65;hp=7882e34544278f4cd68a08303670e8b8d35d75ea;hpb=2ddb81a86943f0ca84b92ae4a1cf144098a9d8bd;p=ust.git diff --git a/ustd/ustd.c b/ustd/ustd.c index 7882e34..f3285f5 100644 --- a/ustd/ustd.c +++ b/ustd/ustd.c @@ -260,6 +260,9 @@ struct buffer_info *connect_buffer(pid_t pid, const char *bufname) ERR("problem in ustcomm_send_request(get_pidunique)"); return NULL; } + if(result == 0) { + goto error; + } result = sscanf(received_msg, "%lld", &buf->pidunique); if(result != 1) { @@ -277,6 +280,9 @@ struct buffer_info *connect_buffer(pid_t pid, const char *bufname) ERR("problem in ustcomm_send_request(get_shmid)"); return NULL; } + if(result == 0) { + goto error; + } result = sscanf(received_msg, "%d %d", &buf->shmid, &buf->bufstruct_shmid); if(result != 2) { @@ -294,6 +300,9 @@ struct buffer_info *connect_buffer(pid_t pid, const char *bufname) ERR("problem in ustcomm_send_request(g_n_subbufs)"); return NULL; } + if(result == 0) { + goto error; + } result = sscanf(received_msg, "%d", &buf->n_subbufs); if(result != 1) { @@ -305,8 +314,15 @@ struct buffer_info *connect_buffer(pid_t pid, const char *bufname) /* get subbuf size */ asprintf(&send_msg, "get_subbuf_size %s", buf->name); - ustcomm_send_request(&buf->conn, send_msg, &received_msg); + result = ustcomm_send_request(&buf->conn, send_msg, &received_msg); free(send_msg); + if(result == -1) { + ERR("problem in ustcomm_send_request(get_subbuf_size)"); + return NULL; + } + if(result == 0) { + goto error; + } result = sscanf(received_msg, "%d", &buf->subbuf_size); if(result != 1) { @@ -378,6 +394,29 @@ struct buffer_info *connect_buffer(pid_t pid, const char *bufname) pthread_mutex_unlock(&active_buffers_mutex); return buf; + +error: + free(buf); + return NULL; +} + +int unwrite_last_subbuffer(struct buffer_info *buf) +{ + int result; + + result = ftruncate(buf->file_fd, buf->previous_offset); + if(result == -1) { + PERROR("ftruncate"); + return -1; + } + + result = lseek(buf->file_fd, buf->previous_offset, SEEK_SET); + if(result == (int)(off_t)-1) { + PERROR("lseek"); + return -1; + } + + return 0; } int write_current_subbuffer(struct buffer_info *buf) @@ -388,11 +427,20 @@ int write_current_subbuffer(struct buffer_info *buf) size_t cur_sb_size = subbuffer_data_size(subbuf_mem); + off_t cur_offset = lseek(buf->file_fd, 0, SEEK_CUR); + if(cur_offset == (off_t)-1) { + PERROR("lseek"); + return -1; + } + + buf->previous_offset = cur_offset; + DBG("previous_offset: %ld", cur_offset); + result = patient_write(buf->file_fd, subbuf_mem, cur_sb_size); if(result == -1) { PERROR("write"); /* FIXME: maybe drop this trace */ - return 0; + return -1; } return 0; @@ -425,7 +473,6 @@ int consumer_loop(struct buffer_info *buf) /* FIXME: handle return value? */ /* put the subbuffer */ - /* FIXME: we actually should unput the buffer before consuming... */ result = put_subbuffer(buf); if(result == -1) { ERR("unknown error putting subbuffer (channel=%s)", buf->name); @@ -437,7 +484,10 @@ int consumer_loop(struct buffer_info *buf) } else if(result == PUT_SUBBUF_DIED) { WARN("application died while putting subbuffer"); - /* FIXME: probably need to skip the first subbuffer in finish_consuming_dead_subbuffer */ + /* Skip the first subbuffer. We are not sure it is trustable + * because the put_subbuffer() did not complete. + */ + unwrite_last_subbuffer(buf); finish_consuming_dead_subbuffer(buf); break; }