diff options
author | Christian Pointner <equinox@helsinki.at> | 2014-02-04 13:25:05 (GMT) |
---|---|---|
committer | Christian Pointner <equinox@helsinki.at> | 2014-02-04 13:25:05 (GMT) |
commit | 5f4fceff0f892bf19a8f6176b17ea1ad2569bdf0 (patch) | |
tree | 3ba0bdfe667ffbf157a016745f7ae1aef0bd5bf8 | |
parent | bfca54665d2fa4e72997ab9816b35011d756694e (diff) |
added new option --nocache which controls the usage of O_DIRECT
-rw-r--r-- | doc/rharchive.8 | 12 | ||||
-rw-r--r-- | doc/rharchive.8.txt | 4 | ||||
-rw-r--r-- | src/file_list.c | 8 | ||||
-rw-r--r-- | src/file_list.h | 3 | ||||
-rw-r--r-- | src/options.c | 4 | ||||
-rw-r--r-- | src/options.h | 1 | ||||
-rw-r--r-- | src/rharchive.c | 2 | ||||
-rw-r--r-- | src/writer.c | 9 | ||||
-rw-r--r-- | src/writer.h | 3 |
9 files changed, 35 insertions, 11 deletions
diff --git a/doc/rharchive.8 b/doc/rharchive.8 index e54fc51..5e577df 100644 --- a/doc/rharchive.8 +++ b/doc/rharchive.8 @@ -2,12 +2,12 @@ .\" Title: rharchive .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/> -.\" Date: 12/27/2013 +.\" Date: 02/04/2014 .\" Manual: \ \& .\" Source: \ \& .\" Language: English .\" -.TH "RHARCHIVE" "8" "12/27/2013" "\ \&" "\ \&" +.TH "RHARCHIVE" "8" "02/04/2014" "\ \&" "\ \&" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -45,6 +45,7 @@ rharchive \- Radio Helsinki Archive Daemon [ \fB\-d|\-\-output\-dir\fR <path> ] [ \fB\-f|\-\-name\-format\fR <format> ] [ \fB\-m|\-\-mode\fR <value> ] + [ \fB\-n|\-\-nocache\fR ] [ \fB\-i|\-\-interval\fR <value> ] [ \fB\-o|\-\-offset\fR <value> ] [ \fB\-x|\-\-post\-process\fR <script> ] @@ -152,6 +153,13 @@ a format string for the filenames\&. The actual name is generated using strftime the octet string for the file permission bits\&. .RE .PP +\fB\-n, \-\-nocache\fR +.RS 4 +When this option is given +\fBrharchive\fR +will use the O_DIRECT flag when opening files\&. +.RE +.PP \fB\-i, \-\-interval <value>\fR .RS 4 the interval in ms between the boundary checks\&. The default is to check every 50ms\&. diff --git a/doc/rharchive.8.txt b/doc/rharchive.8.txt index ed63374..3c5d3f9 100644 --- a/doc/rharchive.8.txt +++ b/doc/rharchive.8.txt @@ -24,6 +24,7 @@ rharchive [ -d|--output-dir <path> ] [ -f|--name-format <format> ] [ -m|--mode <value> ] + [ -n|--nocache ] [ -i|--interval <value> ] [ -o|--offset <value> ] [ -x|--post-process <script> ] @@ -99,6 +100,9 @@ The following options can be passed to the *rharchive* daemon: *-m, --mode <value>*:: the octet string for the file permission bits. +*-n, --nocache*:: + When this option is given *rharchive* will use the O_DIRECT flag when opening files. + *-i, --interval <value>*:: the interval in ms between the boundary checks. The default is to check every 50ms. diff --git a/src/file_list.c b/src/file_list.c index deb6337..cd7e697 100644 --- a/src/file_list.c +++ b/src/file_list.c @@ -63,7 +63,7 @@ void file_list_clear(file_list_t* list) g_mutex_unlock(&(list->mutex_)); } -file_t* file_list_add(file_list_t* list, struct tm* time, const char* type, const char* format, const char* dir, mode_t mode) +file_t* file_list_add(file_list_t* list, struct tm* time, const char* type, const char* format, const char* dir, mode_t mode, int nocache) { if(!list || !(&(list->mutex_))) return NULL; @@ -85,6 +85,7 @@ file_t* file_list_add(file_list_t* list, struct tm* time, const char* type, cons log_printf(INFO, "%s filename is: %s(.?)", type, tmp->path_); tmp->fd_ = FILE_CLOSED; tmp->mode_ = mode; + tmp->nocache_ = nocache; tmp->pp_child_ = NULL; g_mutex_lock(&(list->mutex_)); @@ -177,7 +178,10 @@ int open_file(file_t* file) char* orig_path = file->path_; int cnt = 0; do { - file->fd_ = open(file->path_, O_WRONLY | O_CREAT | O_EXCL, file->mode_); + int flags = O_WRONLY | O_CREAT | O_EXCL; + if(file->nocache_) + flags |= O_DIRECT; + file->fd_ = open(file->path_, flags, file->mode_); if(file->fd_ < 0) { if(errno != EEXIST) { // TODO: thread safe strerror diff --git a/src/file_list.h b/src/file_list.h index 82931a9..45be1cf 100644 --- a/src/file_list.h +++ b/src/file_list.h @@ -40,6 +40,7 @@ struct file_struct { int fd_; char* path_; mode_t mode_; + int nocache_; child_t* pp_child_; }; typedef struct file_struct file_t; @@ -52,7 +53,7 @@ typedef struct file_list_struct file_list_t; int file_list_init(file_list_t* list); void file_list_clear(file_list_t* list); -file_t* file_list_add(file_list_t* list, struct tm* time, const char* type, const char* format, const char* dir, mode_t mode); +file_t* file_list_add(file_list_t* list, struct tm* time, const char* type, const char* format, const char* dir, mode_t mode, int nocache); int file_list_remove(file_list_t* list, int fd); int file_list_call_post_process(file_list_t* list, int fd, char* script); int file_list_waitpid(file_list_t* list); diff --git a/src/options.c b/src/options.c index f8a42d8..71015f8 100644 --- a/src/options.c +++ b/src/options.c @@ -197,6 +197,7 @@ int options_parse(options_t* opt, int argc, char* argv[]) PARSE_STRING_PARAM("-d","--output-dir", opt->output_dir_) PARSE_STRING_PARAM("-f","--name-format", opt->name_format_) PARSE_INT_PARAM("-m","--mode", opt->mode_, 8) + PARSE_BOOL_PARAM("-n", "--nocache", opt->nocache_) PARSE_INT_PARAM("-i","--interval", opt->interval_, 10) PARSE_INT_PARAM("-o","--offset", opt->offset_, 10) PARSE_STRING_PARAM("-x","--post-process", opt->post_process_) @@ -244,6 +245,7 @@ void options_default(options_t* opt) opt->output_dir_ = strdup("/srv/archiv"); opt->name_format_ = strdup("%Y-%m-%d-%H00.ogg"); opt->mode_ = 0644; + opt->nocache_ = 0; opt->interval_ = 50; opt->offset_ = 0; opt->post_process_ = NULL; @@ -293,6 +295,7 @@ void options_print_usage() printf(" [-d|--output-dir] <path> path to the output directory\n"); printf(" [-f|--name-format] <format> the file name format, see manpage of strftime for the syntax\n"); printf(" [-m|--mode] <value> octal representation of the file permission mode\n"); + printf(" [-n|--nocache] Use O_DIRECT for recorded files\n"); printf(" [-i|--interval] <value> interval for time checks in ms\n"); printf(" [-o|--offset] <value> time offset for recordings in ms\n"); printf(" [-x|--post-process] <script> call script when file is finished\n"); @@ -322,6 +325,7 @@ void options_print(options_t* opt) printf("output_dir: '%s'\n", opt->output_dir_); printf("name_format: '%s'\n", opt->name_format_); printf("mode: %04o\n", (int)opt->mode_); + printf("nocache: %s\n", !opt->nocache_ ? "false" : "true"); printf("interval: %d\n", opt->interval_); printf("offset: %d\n", opt->offset_); printf("post_process: '%s'\n", opt->post_process_); diff --git a/src/options.h b/src/options.h index a91cd86..a529d9c 100644 --- a/src/options.h +++ b/src/options.h @@ -42,6 +42,7 @@ struct options_struct { char* output_dir_; char* name_format_; mode_t mode_; + int nocache_; int interval_; int offset_; char* post_process_; diff --git a/src/rharchive.c b/src/rharchive.c index 6d6bb7d..3bfca27 100644 --- a/src/rharchive.c +++ b/src/rharchive.c @@ -92,7 +92,7 @@ int main_loop(options_t* opt) return -1; } - int ret = writer_init(&writer, loop, opt->name_format_, opt->mode_, opt->output_dir_, opt->interval_, opt->offset_, opt->post_process_); + int ret = writer_init(&writer, loop, opt->name_format_, opt->mode_, opt->nocache_, opt->output_dir_, opt->interval_, opt->offset_, opt->post_process_); if(ret) { gst_object_unref(GST_OBJECT(pipeline)); gst_object_unref(GST_OBJECT(loop)); diff --git a/src/writer.c b/src/writer.c index d7875de..95d12ed 100644 --- a/src/writer.c +++ b/src/writer.c @@ -47,7 +47,7 @@ static int init_time_boundaries(writer_t* writer) struct tm bd_time; localtime_r(&(now.tv_sec), &bd_time); - writer->current_ = file_list_add(&(writer->files_), &bd_time, "current", writer->name_format_, writer->output_dir_, writer->mode_); + writer->current_ = file_list_add(&(writer->files_), &bd_time, "current", writer->name_format_, writer->output_dir_, writer->mode_, writer->nocache_); if(writer->current_ == NULL) return -2; bd_time.tm_sec = 0; @@ -59,7 +59,7 @@ static int init_time_boundaries(writer_t* writer) struct timespec b = { T, 0 }; writer->next_boundary_ = b; - writer->next_ = file_list_add(&(writer->files_), &bd_time, "next", writer->name_format_, writer->output_dir_, writer->mode_); + writer->next_ = file_list_add(&(writer->files_), &bd_time, "next", writer->name_format_, writer->output_dir_, writer->mode_, writer->nocache_); if(writer->next_ == NULL) return -2; return 0; @@ -92,7 +92,7 @@ static void fdremoved_cb(GstElement* sink, gint fd, gpointer data) file_list_remove(&(writer->files_), fd); } -int writer_init(writer_t* writer, GMainLoop *loop, const char* name_format, mode_t mode, const char* output_dir, int interval, int offset, char* post_process) +int writer_init(writer_t* writer, GMainLoop *loop, const char* name_format, mode_t mode, int nocache, const char* output_dir, int interval, int offset, char* post_process) { if(!writer) return -1; @@ -116,6 +116,7 @@ int writer_init(writer_t* writer, GMainLoop *loop, const char* name_format, mode } writer->name_format_ = name_format; writer->mode_ = mode; + writer->nocache_ = nocache; writer->output_dir_ = output_dir; writer->interval_ = interval * GST_MSECOND; writer->offset_ = offset * GST_MSECOND; @@ -164,7 +165,7 @@ static int check_boundaries(writer_t* writer) struct tm bd_time; localtime_r(&(writer->next_boundary_.tv_sec), &bd_time); - writer->next_ = file_list_add(&(writer->files_), &bd_time, "next", writer->name_format_, writer->output_dir_, writer->mode_); + writer->next_ = file_list_add(&(writer->files_), &bd_time, "next", writer->name_format_, writer->output_dir_, writer->mode_, writer->nocache_); if(writer->next_ == NULL) return -2; } diff --git a/src/writer.h b/src/writer.h index 8e012a9..9ee98a8 100644 --- a/src/writer.h +++ b/src/writer.h @@ -41,6 +41,7 @@ struct writer_struct { const char* name_format_; const char* output_dir_; mode_t mode_; + int nocache_; GstClockTime interval_; GstClockTime offset_; char* post_process_; @@ -51,7 +52,7 @@ struct writer_struct { }; typedef struct writer_struct writer_t; -int writer_init(writer_t* writer, GMainLoop *loop, const char* name_format, mode_t mode, const char* output_dir, int interval, int offset, char* post_process); +int writer_init(writer_t* writer, GMainLoop *loop, const char* name_format, mode_t mode, int nocache, const char* output_dir, int interval, int offset, char* post_process); int writer_start(writer_t* writer); void writer_stop(writer_t* writer); |