X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ustd%2Flowlevel.c;h=a10f9317c056abd0fb639728ad2addad7e0b5129;hb=a09dac63957396890b1085cac0fee92ecc5db87a;hp=d8d4cfa32c80cc83c1f11d456d24016ac6365289;hpb=02af3e607f471e9fcfe7ea6902cab56efb4c4516;p=ust.git diff --git a/ustd/lowlevel.c b/ustd/lowlevel.c index d8d4cfa..a10f931 100644 --- a/ustd/lowlevel.c +++ b/ustd/lowlevel.c @@ -15,6 +15,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include @@ -63,16 +64,18 @@ size_t subbuffer_data_size(void *subbuf) void finish_consuming_dead_subbuffer(struct buffer_info *buf) { + int result; + struct ust_buffer *ustbuf = buf->bufstruct_mem; - long write_offset = local_read(&ustbuf->offset); - long consumed_offset = atomic_long_read(&ustbuf->consumed); + long write_offset = uatomic_read(&ustbuf->offset); + long consumed_offset = uatomic_read(&ustbuf->consumed); long i_subbuf; - DBG("processing died buffer"); - DBG("consumed offset is %ld", consumed_offset); - DBG("write offset is %ld", write_offset); + DBG("processing dead buffer (%s)", buf->name); + DBG("consumed offset is %ld (%s)", consumed_offset, buf->name); + DBG("write offset is %ld (%s)", write_offset, buf->name); /* First subbuf that we need to consume now. It is not modulo'd. * Consumed_offset is the next byte to consume. */ @@ -91,11 +94,11 @@ void finish_consuming_dead_subbuffer(struct buffer_info *buf) } /* Iterate on subbuffers to recover. */ - for(i_subbuf=first_subbuf; ; i_subbuf++, i_subbuf %= buf->n_subbufs) { + for(i_subbuf = first_subbuf % buf->n_subbufs; ; i_subbuf++, i_subbuf %= buf->n_subbufs) { void *tmp; /* commit_seq is the offset in the buffer of the end of the last sequential commit. * Bytes beyond this limit cannot be recovered. This is a free-running counter. */ - long commit_seq = local_read(&ustbuf->commit_seq[i_subbuf]); + long commit_seq = uatomic_read(&ustbuf->commit_seq[i_subbuf]); unsigned long valid_length = buf->subbuf_size; long n_subbufs_order = get_count_order(buf->n_subbufs); @@ -112,12 +115,15 @@ void finish_consuming_dead_subbuffer(struct buffer_info *buf) } /* Check if subbuf was fully written. This is from Mathieu's algorithm/paper. */ + /* FIXME: not sure data_size = 0xffffffff when the buffer is not full. It might + * take the value of the header size initially */ if (((commit_seq - buf->subbuf_size) & commit_seq_mask) - (USTD_BUFFER_TRUNC(consumed_offset, buf) >> n_subbufs_order) == 0 && header->data_size != 0xffffffff && header->sb_size != 0xffffffff) { /* If it was, we only check the data_size. This is the amount of valid data at * the beginning of the subbuffer. */ valid_length = header->data_size; + DBG("writing full subbuffer (%d) with valid_length = %ld", i_subbuf, valid_length); } else { /* If the subbuffer was not fully written, then we don't check data_size because @@ -126,20 +132,29 @@ void finish_consuming_dead_subbuffer(struct buffer_info *buf) */ valid_length = commit_seq & (buf->subbuf_size-1); + DBG("writing unfull subbuffer (%d) with valid_length = %ld", i_subbuf, valid_length); header->data_size = valid_length; header->sb_size = PAGE_ALIGN(valid_length); assert(i_subbuf == (last_subbuf % buf->n_subbufs)); } - patient_write(buf->file_fd, buf->mem + i_subbuf * buf->subbuf_size, valid_length); + result = patient_write(buf->file_fd, buf->mem + i_subbuf * buf->subbuf_size, valid_length); + if(result == -1) { + ERR("Error writing to buffer file"); + return; + } /* pad with empty bytes */ pad_size = PAGE_ALIGN(valid_length)-valid_length; if(pad_size) { tmp = malloc(pad_size); memset(tmp, 0, pad_size); - patient_write(buf->file_fd, tmp, pad_size); + result = patient_write(buf->file_fd, tmp, pad_size); + if(result == -1) { + ERR("Error writing to buffer file"); + return; + } free(tmp); }