summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@helsinki.at>2014-02-04 13:25:05 (GMT)
committerChristian Pointner <equinox@helsinki.at>2014-02-04 13:25:05 (GMT)
commit5f4fceff0f892bf19a8f6176b17ea1ad2569bdf0 (patch)
tree3ba0bdfe667ffbf157a016745f7ae1aef0bd5bf8
parentbfca54665d2fa4e72997ab9816b35011d756694e (diff)
added new option --nocache which controls the usage of O_DIRECT
-rw-r--r--doc/rharchive.812
-rw-r--r--doc/rharchive.8.txt4
-rw-r--r--src/file_list.c8
-rw-r--r--src/file_list.h3
-rw-r--r--src/options.c4
-rw-r--r--src/options.h1
-rw-r--r--src/rharchive.c2
-rw-r--r--src/writer.c9
-rw-r--r--src/writer.h3
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);