#include <sys/mman.h>
#include <sys/ipc.h>
#include <sys/shm.h>
+#include <fcntl.h>
//#include "list.h"
#include "relay.h"
#include "channels.h"
*size = PAGE_ALIGN(*size);
result = buf->shmid = shmget(getpid(), *size, IPC_CREAT | IPC_EXCL | 0700);
- if(buf->shmid == -1) {
+ if(result == -1 && errno == EINVAL) {
+ ERR("shmget() returned EINVAL; maybe /proc/sys/kernel/shmmax should be increased.");
+ return -1;
+ }
+ else if(result == -1) {
PERROR("shmget");
return -1;
}
ltt_buf->data_ready_fd_read = fds[0];
ltt_buf->data_ready_fd_write = fds[1];
+ /* FIXME: do we actually need this? */
+ result = fcntl(fds[0], F_SETFL, O_NONBLOCK);
+ if(result == -1) {
+ PERROR("fcntl");
+ }
+
//ust// ltt_buf->commit_seq = malloc(sizeof(ltt_buf->commit_seq) * n_subbufs);
//ust// if(!ltt_buf->commit_seq) {
//ust// return -1;
- (local_read(<t_buf->commit_count[subbuf_index])
& ltt_channel->commit_count_mask);
if (offsets->reserve_commit_diff == 0) {
+ long consumed;
+
+ consumed = atomic_long_read(<t_buf->consumed);
+
/* Next buffer not corrupted. */
if (!ltt_channel->overwrite &&
(SUBBUF_TRUNC(offsets->begin, buf->chan)
- - SUBBUF_TRUNC(atomic_long_read(
- <t_buf->consumed),
- buf->chan))
+ - SUBBUF_TRUNC(consumed, buf->chan))
>= rchan->alloc_size) {
+
+ long consumed_idx = SUBBUF_INDEX(consumed, buf->chan);
+ long commit_count = local_read(<t_buf->commit_count[consumed_idx]);
+ if(((commit_count - buf->chan->subbuf_size) & ltt_channel->commit_count_mask) - (BUFFER_TRUNC(consumed, buf->chan) >> ltt_channel->n_subbufs_order) != 0) {
+ WARN("Event dropped. Caused by non-committed event.");
+ }
+ else {
+ WARN("Event dropped. Caused by non-consumed buffer.");
+ }
/*
* We do not overwrite non consumed buffers
* and we are full : event is lost.
*/
ltt_write_commit_counter(buf, ltt_buf, endidx,
buf_offset, commit_count, data_size);
-
- DBG("commited slot. now commit count is %ld", commit_count);
}