X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ustd%2Flowlevel.c;fp=ustd%2Flowlevel.c;h=f386089e21b54f9c1a0b98cc351d26084deed454;hb=0b0cd93782698872ea4778d29cd68091663ca367;hp=0000000000000000000000000000000000000000;hpb=0ce2af7f6372336d520847b4745da781344ba743;p=ust.git diff --git a/ustd/lowlevel.c b/ustd/lowlevel.c new file mode 100644 index 0000000..f386089 --- /dev/null +++ b/ustd/lowlevel.c @@ -0,0 +1,50 @@ +#include "tracer.h" +#include "ustd.h" +#include "localerr.h" + +#define USTD_BUFFER_TRUNC(offset, bufinfo) \ + ((offset) & (~(((bufinfo)->subbuf_size*(bufinfo)->n_subbufs)-1))) + +void finish_consuming_dead_subbuffer(struct buffer_info *buf) +{ + struct ltt_channel_buf_struct *ltt_buf = buf->bufstruct_mem; + + long write_offset = local_read(<t_buf->offset); + long consumed_offset = atomic_long_read(<t_buf->consumed); + + long i_subbuf; + + DBG("processing died buffer"); + DBG("consumed offset is %ld", consumed_offset); + DBG("write offset is %ld", write_offset); + + long first_subbuf = write_offset / buf->subbuf_size; + long last_subbuf = consumed_offset / buf->subbuf_size; + + if(last_subbuf - first_subbuf > buf->n_subbufs) { + DBG("an overflow has occurred, nothing can be recovered"); + return; + } + + for(i_subbuf=first_subbuf; ; i_subbuf++, i_subbuf %= buf->n_subbufs) { + long commit_count = local_read(<t_buf->commit_count[i_subbuf]); + + unsigned long valid_length = buf->subbuf_size; + long n_subbufs_order = get_count_order(buf->n_subbufs); + long commit_count_mask = (~0UL >> n_subbufs_order); + + /* check if subbuf was fully written */ + if (((commit_count - buf->subbuf_size) & commit_count_mask) + - (USTD_BUFFER_TRUNC(consumed_offset, buf) >> n_subbufs_order) + != 0) { + struct ltt_subbuffer_header *header = (struct ltt_subbuffer_header *)((char *)buf->mem)+i_subbuf*buf->subbuf_size; + valid_length = buf->subbuf_size - header->lost_size; + } + + patient_write(buf->file_fd, buf->mem + i_subbuf * buf->subbuf_size, buf->subbuf_size); + + if(i_subbuf == last_subbuf) + break; + } +} +