audiod: switch from ringbuffer to statically allocated array
authorAndre <maan@p133.(none)>
Sun, 26 Mar 2006 23:17:16 +0000 (01:17 +0200)
committerAndre <maan@p133.(none)>
Sun, 26 Mar 2006 23:17:16 +0000 (01:17 +0200)
This patch also fixes a minor bug where audiod would send empty status
lines or lines containing only a colon (only happens if para_server
status is paused).

audiod.c
configure.ac
stat.c

index 9e001c6..c9a0ff7 100644 (file)
--- a/audiod.c
+++ b/audiod.c
@@ -28,7 +28,6 @@
 #include "filter.h"
 #include "grab_client.cmdline.h"
 #include "grab_client.h"
-#include "ringbuffer.h"
 
 #include "error.h"
 #include "audiod.h"
@@ -131,9 +130,7 @@ static int playing, current_decoder = -1,
        sa_time_diff_sign = 1, audiod_socket = -1;
 static char *af_status, /* the audio format announced in server status */
        *socket_name, *hostname;
-/** how many status items to remember */
-#define RINGBUFFER_SIZE 32
-static void *stat_item_ringbuf;
+static char *stat_item_values[NUM_STAT_ITEMS];
 static FILE *logfile;
 static const struct timeval restart_delay = {0, 300 * 1000};
 
@@ -302,9 +299,11 @@ static char *get_time_string(struct timeval *newest_stime)
        struct timeval now, diff, adj_stream_start, tmp;
        int total = 0, use_server_time = 1;
 
-       if (!playing)
-               return make_message("%s:", length_seconds?
-                       "" : status_item_list[SI_PLAY_TIME]);
+       if (!playing) {
+               if (length_seconds)
+                       return NULL;
+               return make_message("%s:", status_item_list[SI_PLAY_TIME]);
+       }
        if (audiod_status == AUDIOD_OFF)
                goto out;
        if (sa_time_diff_sign > 0)
@@ -370,12 +369,13 @@ static char *audiod_status_string(void)
        decoder_flags[MAX_STREAM_SLOTS] = '\0';
        time_string = get_time_string(newest_stime);
        uptime_string = uptime_str();
-       ret = make_message("%s:%s\n%s:%s\n%s:%s\n%s",
+       ret = make_message("%s:%s\n%s:%s\n%s:%s",
                status_item_list[SI_AUDIOD_UPTIME], uptime_string,
                status_item_list[SI_DECODER_FLAGS], decoder_flags,
                status_item_list[SI_AUDIOD_STATUS], audiod_status == AUDIOD_ON?
-                       "on" : (audiod_status == AUDIOD_OFF? "off": "sb"),
-               time_string);
+                       "on" : (audiod_status == AUDIOD_OFF? "off": "sb"));
+       if (time_string)
+               ret = make_message("%s\n%s", ret, time_string);
        free(uptime_string);
        free(decoder_flags);
        free(time_string);
@@ -546,7 +546,6 @@ static int decoder_running(int format)
 
 static void close_stat_pipe(void)
 {
-       char *msg;
        int i;
 
        if (stat_pipe < 0)
@@ -556,17 +555,18 @@ static void close_stat_pipe(void)
        del_close_on_fork_list(stat_pipe);
        stat_pipe = -1;
        kill_all_decoders();
-       for (i = 0; i < RINGBUFFER_SIZE; i++)
-               free(ringbuffer_add(stat_item_ringbuf, para_strdup(NULL)));
+       for (i = 0; i < NUM_STAT_ITEMS; i++) {
+               free(stat_item_values[i]);
+               stat_item_values[i] = NULL;
+       }
        dump_empty_status();
        length_seconds = 0;
        offset_seconds = 0;
        audiod_status_dump();
        playing = 0;
-       msg = make_message("%s:no connection to para_server\n",
+       stat_item_values[SI_STATUS_BAR] = make_message("%s:no connection to para_server\n",
                status_item_list[SI_STATUS_BAR]);
-       free(ringbuffer_add(stat_item_ringbuf, msg));
-       stat_client_write(msg);
+       stat_client_write(stat_item_values[SI_STATUS_BAR]);
 }
 
 static void __noreturn clean_exit(int status, const char *msg)
@@ -796,11 +796,14 @@ static void check_stat_line(char *line)
 
        if (!line)
                return;
-       free(ringbuffer_add(stat_item_ringbuf, para_strdup(line)));
-       stat_client_write(line);
        itemnum = stat_line_valid(line);
-       if (itemnum < 0)
+       if (itemnum < 0) {
+               PARA_WARNING_LOG("invalid status line: %s\n", line);
                return;
+       }
+       stat_client_write(line);
+       free(stat_item_values[itemnum]);
+       stat_item_values[itemnum] = para_strdup(line);
        ilen = strlen(status_item_list[itemnum]);
        switch (itemnum) {
        case SI_STATUS:
@@ -1183,7 +1186,7 @@ static int dump_commands(int fd)
 /*
  * command handlers don't close their fd on errors (ret < 0) so that
  * its caller can send an error message. Otherwise (ret >= 0) it's up
- * to each individual command to close the fd if necessary.  
+ * to each individual command to close the fd if necessary.
  */
 
 static int com_help(int fd, int argc, char **argv)
@@ -1224,16 +1227,13 @@ out:
 static int com_stat(int fd, __unused int argc, __unused char **argv)
 {
        int i, ret;
-       char *buf = audiod_status_string();
+       char *buf = make_message("%s\n", audiod_status_string());
 
-       buf = para_strcat(buf, "\n");
-       for (i = RINGBUFFER_SIZE - 1; i >= 0; i--) {
-               char *tmp, *line = ringbuffer_get(stat_item_ringbuf, i);
-               if (!line)
-                       continue;
-               tmp = make_message("%s\n", line);
-               buf = para_strcat(buf, tmp);
-               free(tmp);
+       for (i = 0; i < NUM_STAT_ITEMS; i++) {
+               char *tmp, *v = stat_item_values[i];
+               tmp = make_message("%s%s%s", buf, v? v : "", v? "\n" : "");
+               free(buf);
+               buf = tmp;
        }
        ret = client_write(fd, buf);
        if (ret > 0)
@@ -1597,7 +1597,6 @@ int __noreturn main(int argc, char *argv[])
        set_initial_status();
        FOR_EACH_SLOT(i)
                clear_slot(i);
-       stat_item_ringbuf = ringbuffer_new(RINGBUFFER_SIZE);
        init_grabbing();
        setup_signal_handling();
        if (conf.daemon_given)
index 7c1cfc9..f95a168 100644 (file)
@@ -68,7 +68,7 @@ filter_ldflags=""
 audiod_cmdline_objs="audiod.cmdline grab_client.cmdline compress_filter.cmdline
        http_recv.cmdline dccp_recv.cmdline"
 audiod_errlist_objs="audiod exec close_on_fork signal string daemon stat net
-       time grab_client filter_chain wav compress http_recv dccp dccp_recv recv_common ringbuffer"
+       time grab_client filter_chain wav compress http_recv dccp dccp_recv recv_common"
 audiod_ldflags=""
 
 server_cmdline_objs="server.cmdline"
diff --git a/stat.c b/stat.c
index 4259956..ac5fe8c 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -195,7 +195,6 @@ void dump_empty_status(void)
                free(empty_items);
                empty_items = tmp;
        }
-//     PARA_DEBUG_LOG("%s: empty items: %s\n", __func__, empty_items);
        stat_client_write(empty_items);
        free(empty_items);
 }