/* 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. */
static char *channel_name = NULL;
static int daemon_mode = 0;
static int append_mode = 0;
-static int sig_parent = 0;
volatile static int quit_program = 0; /* For signal handler */
/* Args :
* -c directory Root directory of the relayfs trace channels.
* -d Run in background (daemon).
* -a Trace append mode.
- * -s Send SIGIO to parent when ready for IO.
+ * -s Send SIGUSR1 to parent when ready for IO.
*/
void show_arguments(void)
{
printf("-c directory Root directory of the relayfs trace channels.\n");
printf("-d Run in background (daemon).\n");
printf("-a Append to an possibly existing trace.\n");
- printf("-s Send SIGIO to parent when ready for IO.\n");
printf("\n");
}
case 'a':
append_mode = 1;
break;
- case 's':
- sig_parent = 1;
- break;
default:
printf("Invalid argument '%s'.\n", argv[argn]);
printf("\n");
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;
}
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) {
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;
}
pollfd[i].events = POLLIN|POLLPRI;
}
- /* Signal the parent that ready for IO */
- if(sig_parent) kill(getppid(), SIGIO);
-
while(1) {
high_prio = 0;
num_hup = 0;