X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttd%2Flttd.c;h=3a2fdd3f5bec004318a651d2941d3c91f490ac67;hb=db9d75c08a1d635cac6520252ce86047f815c98b;hp=e090729c369aa0feb24a19b96d76c536f96f18e0;hpb=af4061b2195b49f3620754d1ace960374935a816;p=lttv.git diff --git a/ltt/branches/poly/lttd/lttd.c b/ltt/branches/poly/lttd/lttd.c index e090729c..3a2fdd3f 100644 --- a/ltt/branches/poly/lttd/lttd.c +++ b/ltt/branches/poly/lttd/lttd.c @@ -10,6 +10,10 @@ * Mathieu Desnoyers */ +#ifdef HAVE_CONFIG_H +#include +#endif + #define _GNU_SOURCE #include #include @@ -31,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. */ @@ -71,6 +75,7 @@ volatile static int quit_program = 0; /* For signal handler */ * -c directory Root directory of the relayfs trace channels. * -d Run in background (daemon). * -a Trace append mode. + * -s Send SIGUSR1 to parent when ready for IO. */ void show_arguments(void) { @@ -188,22 +193,21 @@ int open_channel_trace_pairs(char *subchannel_name, char *subtrace_name, char path_trace[PATH_MAX]; int path_trace_len; char *path_trace_ptr; + int open_ret = 0; if(channel_dir == NULL) { perror(subchannel_name); - return ENOENT; + open_ret = ENOENT; + goto end; } - //FIXME : check if the directory already exist, and ask the user if he wants - //to append to the traces. printf("Creating trace subdirectory %s\n", subtrace_name); ret = mkdir(subtrace_name, S_IRWXU|S_IRWXG|S_IRWXO); if(ret == -1) { - if(errno == EEXIST && append_mode) { - printf("Appending to directory %s as resquested\n", subtrace_name); - } else { + if(errno != EEXIST) { perror(subtrace_name); - return -1; + open_ret = -1; + goto end; } } @@ -250,12 +254,14 @@ int open_channel_trace_pairs(char *subchannel_name, char *subtrace_name, open(path_channel, O_RDONLY | O_NONBLOCK); if(fd_pairs->pair[fd_pairs->num_pairs-1].channel == -1) { perror(path_channel); + fd_pairs->num_pairs--; + continue; } /* Open the trace in write mode, only append if append_mode */ ret = stat(path_trace, &stat_buf); if(ret == 0) { if(append_mode) { - printf("Appending to file %s as resquested\n", path_trace); + printf("Appending to file %s as requested\n", path_trace); fd_pairs->pair[fd_pairs->num_pairs-1].trace = open(path_trace, O_WRONLY|O_APPEND, @@ -266,7 +272,8 @@ int open_channel_trace_pairs(char *subchannel_name, char *subtrace_name, } } else { printf("File %s exists, cannot open. Try append mode.\n", path_trace); - return -1; + open_ret = -1; + goto end; } } else { if(errno == ENOENT) { @@ -281,44 +288,55 @@ int open_channel_trace_pairs(char *subchannel_name, char *subtrace_name, } } +end: closedir(channel_dir); - return 0; + return open_ret; } int read_subbuffer(struct fd_pair *pair) { - unsigned int subbuf_index; - int ret; + unsigned int consumed_old; + int err, ret; - ret = ioctl(pair->channel, RELAYFS_GET_SUBBUF, - &subbuf_index); - if(ret != 0) { + err = ioctl(pair->channel, RELAYFS_GET_SUBBUF, + &consumed_old); + printf("cookie : %u\n", consumed_old); + if(err != 0) { perror("Error in reserving sub buffer"); - goto error; + ret = -EPERM; + goto get_error; } - - ret = TEMP_FAILURE_RETRY(write(pair->trace, - pair->mmap + (subbuf_index * pair->subbuf_size), - pair->subbuf_size)); - if(ret != 0) { + err = TEMP_FAILURE_RETRY(write(pair->trace, + pair->mmap + (consumed_old & (~(pair->subbuf_size-1))), + pair->subbuf_size)); + + if(err < 0) { perror("Error in writing to file"); - goto error; + ret = err; + goto write_error; } - ret = ioctl(pair->channel, RELAYFS_PUT_SUBBUF); - if(ret != 0) { - perror("Error in unreserving sub buffer"); - goto error; +write_error: + err = ioctl(pair->channel, RELAYFS_PUT_SUBBUF, &consumed_old); + if(err != 0) { + 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."); + /* FIXME : we may delete the last written buffer if we wish. */ + ret = -EIO; + } + goto get_error; } - return 0; -error: - return -1; +get_error: + return ret; } @@ -346,6 +364,11 @@ int read_channels(struct channel_trace_fd *fd_pairs) int high_prio; int ret; + if(fd_pairs->num_pairs <= 0) { + printf("No channel to read\n"); + goto end; + } + /* Get the subbuf sizes and number */ for(i=0;inum_pairs;i++) { @@ -395,7 +418,7 @@ int read_channels(struct channel_trace_fd *fd_pairs) printf("Press a key for next poll...\n"); char buf[1]; read(STDIN_FILENO, &buf, 1); - printf("Next poll :\n"); + printf("Next poll (polling %d fd) :\n", fd_pairs->num_pairs); #endif //DEBUG /* Have we received a signal ? */ @@ -488,7 +511,6 @@ void close_channel_trace_pairs(struct channel_trace_fd *fd_pairs) int main(int argc, char ** argv) { int ret; - pid_t pid; struct channel_trace_fd fd_pairs = { NULL, 0 }; struct sigaction act; @@ -501,18 +523,13 @@ int main(int argc, char ** argv) show_info(); if(daemon_mode) { - pid = fork(); - - if(pid > 0) { - /* parent */ - return 0; - } else if(pid < 0) { - /* error */ - printf("An error occured while forking.\n"); - return -1; - } - /* else, we are the child, continue... */ - } + ret = daemon(0, 0); + + if(ret == -1) { + perror("An error occured while daemonizing."); + exit(-1); + } + } /* Connect the signal handlers */ act.sa_handler = handler;