lttd changes for lockless lttng
[ltt-control.git] / ltt / branches / poly / lttd / lttd.c
index 02724ce5285f6d10bdedfff992510f2a6b0dd93b..6da2924292581e44a66b37f1e870f6f09caba348 100644 (file)
@@ -35,7 +35,7 @@
 /* Get the next sub buffer that can be read. */
 #define RELAYFS_GET_SUBBUF        _IOR(0xF4, 0x00,__u32)
 /* Release the oldest reserved (by "get") sub buffer. */
-#define RELAYFS_PUT_SUBBUF        _IO(0xF4, 0x01)
+#define RELAYFS_PUT_SUBBUF        _IOW(0xF4, 0x01,__u32)
 /* returns the number of sub buffers in the per cpu channel. */
 #define RELAYFS_GET_N_SUBBUFS     _IOR(0xF4, 0x02,__u32)
 /* returns the size of the sub buffers. */
@@ -297,13 +297,13 @@ end:
 
 int read_subbuffer(struct fd_pair *pair)
 {
-       unsigned int    subbuf_index;
+       unsigned int    consumed_old;
        int err, ret;
 
 
        err = ioctl(pair->channel, RELAYFS_GET_SUBBUF, 
-                                                               &subbuf_index);
-       printf("index : %u\n", subbuf_index);
+                                                               &consumed_old);
+       printf("cookie : %u\n", consumed_old);
        if(err != 0) {
                perror("Error in reserving sub buffer");
                ret = -EPERM;
@@ -311,7 +311,7 @@ int read_subbuffer(struct fd_pair *pair)
        }
        
        err = TEMP_FAILURE_RETRY(write(pair->trace,
-                               pair->mmap + (subbuf_index * pair->subbuf_size),
+                               pair->mmap + (consumed_old & (~(pair->subbuf_size-1))),
                                pair->subbuf_size));
 
        if(err < 0) {
@@ -322,10 +322,15 @@ int read_subbuffer(struct fd_pair *pair)
 
 
 write_error:
-       err = ioctl(pair->channel, RELAYFS_PUT_SUBBUF);
+       err = ioctl(pair->channel, RELAYFS_PUT_SUBBUF, &consumed_old);
        if(err != 0) {
-               perror("Error in unreserving sub buffer");
-               ret = -EPERM;
+               if(errno == -EFAULT) {
+                       perror("Error in unreserving sub buffer");
+                       ret = -EFAULT;
+               } else if(errno == -EIO) {
+                       perror("Reader has been pushed by the writer, last subbuffer corrupted.");
+                       ret = -EIO;
+               }
                goto get_error;
        }
 
This page took 0.024144 seconds and 4 git commands to generate.