[xiph-commits] r15145 - in icecast/branches/kh/icecast: . src web win32

karl at svn.xiph.org karl at svn.xiph.org
Fri Aug 1 13:26:10 PDT 2008


Author: karl
Date: 2008-08-01 13:26:09 -0700 (Fri, 01 Aug 2008)
New Revision: 15145

Added:
   icecast/branches/kh/icecast/web/admin.html
Modified:
   icecast/branches/kh/icecast/NEWS
   icecast/branches/kh/icecast/config.h.vc6
   icecast/branches/kh/icecast/configure.in
   icecast/branches/kh/icecast/src/admin.c
   icecast/branches/kh/icecast/src/connection.c
   icecast/branches/kh/icecast/src/format_kate.c
   icecast/branches/kh/icecast/src/format_theora.c
   icecast/branches/kh/icecast/src/fserve.c
   icecast/branches/kh/icecast/src/slave.c
   icecast/branches/kh/icecast/src/stats.c
   icecast/branches/kh/icecast/src/stats.h
   icecast/branches/kh/icecast/web/Makefile.am
   icecast/branches/kh/icecast/win32/Makefile.am
   icecast/branches/kh/icecast/win32/icecast2.iss
   icecast/branches/kh/icecast/win32/icecast2_console.dsp
   icecast/branches/kh/icecast/win32/icecastService.dsp
Log:
bump version. the most significant things are the stats thread removal and a theora fix.


Modified: icecast/branches/kh/icecast/NEWS
===================================================================
--- icecast/branches/kh/icecast/NEWS	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/NEWS	2008-08-01 20:26:09 UTC (rev 15145)
@@ -15,6 +15,16 @@
 any extra tags are show in the conf/icecast.xml.dist file
 
 
+2.3.2-kh1
+. remove stats thread. Stats clients still have their own thread and queue.
+. fix low bandwidth theora stream problem.
+. failing on-demand relays were not being recovered as they should of.
+. encode xml entity data for clients useragent/username
+. reduce memory usage in avl nodes, seems to benefit win32 more because of the
+  unused lock handling
+. minor patch for kate detection applied. ogg.k.ogg.k
+. minor type cleanup for off_t in fserve
+
 2.3-kh34
 . Added Kate/Skeleton codec handling within Ogg streams. patch by ogg.k.ogg.k
 . small changes for stream directory handling, mostly for error cases. 

Modified: icecast/branches/kh/icecast/config.h.vc6
===================================================================
--- icecast/branches/kh/icecast/config.h.vc6	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/config.h.vc6	2008-08-01 20:26:09 UTC (rev 15145)
@@ -95,7 +95,7 @@
 #define PACKAGE_NAME "Icecast"
 
 /* Version number of package */
-#define VERSION "2.3-kh34"
+#define VERSION "2.3.2-kh1"
 
 /* Define to the version of this package. */
 #define PACKAGE_VERSION VERSION
@@ -139,6 +139,8 @@
 #define fseeko fseek
 #define PRIdMAX "ld"
 #define SCNdMAX "ld"
+#define SCN_OFF_T "ld"
+#define PRI_OFF_T "ld"
 
 #define PRId64	"I64d"
 #define PRIu64	"I64u"
@@ -157,3 +159,6 @@
 
 #define sock_t SOCKET
 
+/* time format for strftime */
+#define ICECAST_TIME_FMT "%a, %d %b %Y %H:%M:%S"
+

Modified: icecast/branches/kh/icecast/configure.in
===================================================================
--- icecast/branches/kh/icecast/configure.in	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/configure.in	2008-08-01 20:26:09 UTC (rev 15145)
@@ -1,4 +1,4 @@
-AC_INIT([Icecast], [2.3-kh34], [karl at xiph.org])
+AC_INIT([Icecast], [2.3.2-kh1], [karl at xiph.org])
 
 AC_PREREQ(2.59)
 AC_CONFIG_SRCDIR(src/main.c)
@@ -135,6 +135,7 @@
 
 ICECAST_OPTIONAL="$ICECAST_OPTIONAL auth_cmd.o"
 AC_DEFINE([MIMETYPESFILE],"/etc/mime.types", [Default location of mime types file])
+AC_DEFINE([ICECAST_TIME_FMT],["%a, %d %b %Y %H:%M:%S %z"], [time format for strftime])
 
 dnl Make substitutions
 

Modified: icecast/branches/kh/icecast/src/admin.c
===================================================================
--- icecast/branches/kh/icecast/src/admin.c	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/src/admin.c	2008-08-01 20:26:09 UTC (rev 15145)
@@ -632,7 +632,12 @@
     xmlNewChild (node, NULL, XMLSTR("ip"), XMLSTR(listener->con->ip));
 
     useragent = httpp_getvar (listener->parser, "user-agent");
-    xmlNewChild (node, NULL, XMLSTR("useragent"), XMLSTR(useragent)); 
+    if (useragent)
+    {
+        xmlChar *str = xmlEncodeEntitiesReentrant (srcnode->doc, XMLSTR(useragent));
+        xmlNewChild (node, NULL, XMLSTR("useragent"), str); 
+        xmlFree (str);
+    }
 
     snprintf (buf, sizeof (buf), "%u", listener->lag);
     xmlNewChild (node, NULL, XMLSTR("lag"), XMLSTR(buf));
@@ -641,7 +646,11 @@
             (unsigned long)(global.time - listener->con->con_time));
     xmlNewChild (node, NULL, XMLSTR("connected"), XMLSTR(buf));
     if (listener->username)
-        xmlNewChild (node, NULL, XMLSTR("username"), XMLSTR(listener->username));
+    {
+        xmlChar *str = xmlEncodeEntitiesReentrant (srcnode->doc, XMLSTR(listener->username));
+        xmlNewChild (node, NULL, XMLSTR("username"), str);
+        xmlFree (str);
+    }
 }
 
 

Modified: icecast/branches/kh/icecast/src/connection.c
===================================================================
--- icecast/branches/kh/icecast/src/connection.c	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/src/connection.c	2008-08-01 20:26:09 UTC (rev 15145)
@@ -1120,8 +1120,6 @@
 
 static void _handle_stats_request (client_t *client, char *uri)
 {
-    stats_event_inc(NULL, "stats_connections");
-
     if (connection_check_admin_pass (client->parser) == 0)
     {
         client_send_401 (client, NULL);

Modified: icecast/branches/kh/icecast/src/format_kate.c
===================================================================
--- icecast/branches/kh/icecast/src/format_kate.c	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/src/format_kate.c	2008-08-01 20:26:09 UTC (rev 15145)
@@ -209,7 +209,7 @@
     }
 #else
     /* we don't have libkate, so we examine the packet magic by hand */
-    if ((packet.bytes<9) || memcmp(packet.packet, "\x80kate\0\0\0\0", 9))
+    if ((packet.bytes<8) || memcmp(packet.packet, "\x80kate\0\0\0", 8))
     {
         ogg_stream_clear (&codec->os);
         free (kate_codec);

Modified: icecast/branches/kh/icecast/src/format_theora.c
===================================================================
--- icecast/branches/kh/icecast/src/format_theora.c	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/src/format_theora.c	2008-08-01 20:26:09 UTC (rev 15145)
@@ -124,12 +124,6 @@
     refbuf = make_refbuf_with_page (codec, page);
     /* DEBUG3 ("refbuf %p has pageno %ld, %llu", refbuf, ogg_page_pageno (page), (uint64_t)granulepos); */
 
-    if (has_keyframe && codec->possible_start)
-    {
-        codec->possible_start->sync_point = 1;
-        refbuf_release (codec->possible_start);
-        codec->possible_start = NULL;
-    }
     if (granulepos != theora->prev_granulepos || granulepos == 0)
     {
         if (codec->possible_start)
@@ -138,6 +132,12 @@
         codec->possible_start = refbuf;
     }
     theora->prev_granulepos = granulepos;
+    if (has_keyframe && codec->possible_start)
+    {
+        codec->possible_start->sync_point = 1;
+        refbuf_release (codec->possible_start);
+        codec->possible_start = NULL;
+    }
 
     return refbuf;
 }

Modified: icecast/branches/kh/icecast/src/fserve.c
===================================================================
--- icecast/branches/kh/icecast/src/fserve.c	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/src/fserve.c	2008-08-01 20:26:09 UTC (rev 15145)
@@ -31,6 +31,8 @@
 #include <unistd.h>
 #include <sys/time.h>
 #include <sys/socket.h>
+#define SCN_OFF_T SCNdMAX
+#define PRI_OFF_T PRIdMAX
 #else
 #include <winsock2.h>
 #include <windows.h>
@@ -546,7 +548,7 @@
         {
             ret = 0;
             if (strncasecmp (range, "bytes=", 6) == 0)
-                ret = sscanf (range+6, "%" SCNdMAX "-", &rangenumber);
+                ret = sscanf (range+6, "%" SCN_OFF_T "-", &rangenumber);
 
             if (ret == 1 && rangenumber>=0 && rangenumber < content_length)
             {
@@ -576,10 +578,10 @@
                     "HTTP/1.1 206 Partial Content\r\n"
                     "Date: %s\r\n"
                     "Accept-Ranges: bytes\r\n"
-                    "Content-Length: %" PRIdMAX "\r\n"
-                    "Content-Range: bytes %" PRIdMAX
-                    "-%" PRIdMAX 
-                    "/%" PRIdMAX "\r\n"
+                    "Content-Length: %" PRI_OFF_T "\r\n"
+                    "Content-Range: bytes %" PRI_OFF_T
+                    "-%" PRI_OFF_T 
+                    "/%" PRI_OFF_T "\r\n"
                     "Content-Type: %s\r\n\r\n",
                     currenttime,
                     new_content_len,
@@ -607,7 +609,7 @@
                         "HTTP/1.0 200 OK\r\n"
                         "Accept-Ranges: bytes\r\n"
                         "Content-Type: %s\r\n"
-                        "Content-Length: %" PRIdMAX "\r\n"
+                        "Content-Length: %" PRI_OFF_T "\r\n"
                         "\r\n",
                         type,
                         content_length);

Modified: icecast/branches/kh/icecast/src/slave.c
===================================================================
--- icecast/branches/kh/icecast/src/slave.c	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/src/slave.c	2008-08-01 20:26:09 UTC (rev 15145)
@@ -504,6 +504,7 @@
     thread_mutex_unlock (&src->lock);
 
     /* cleanup relay, but prevent this relay from starting up again too soon */
+    relay->source->on_demand = 0;
     relay->start = global.time + relay->interval;
     relay->cleanup = 1;
 
@@ -1094,6 +1095,7 @@
         }
         /* trigger any YP processing */
         yp_thread_startup();
+        stats_global_calc();
     }
     connection_thread_shutdown();
     INFO0 ("shutting down current relays");

Modified: icecast/branches/kh/icecast/src/stats.c
===================================================================
--- icecast/branches/kh/icecast/src/stats.c	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/src/stats.c	2008-08-01 20:26:09 UTC (rev 15145)
@@ -44,8 +44,9 @@
 #if !defined HAVE_ATOLL && defined HAVE_STRTOLL
 #define atoll(nptr) strtoll(nptr, (char **)NULL, 10)
 #endif
-static void stats_global_calc (void);
 
+#define VAL_BUFSIZE 20
+
 #define STATS_EVENT_SET     0
 #define STATS_EVENT_INC     1
 #define STATS_EVENT_DEC     2
@@ -54,6 +55,31 @@
 #define STATS_EVENT_REMOVE  5
 #define STATS_EVENT_HIDDEN  6
 
+typedef struct _stats_node_tag
+{
+    char *name;
+    char *value;
+    int hidden;
+} stats_node_t;
+
+typedef struct _stats_event_tag
+{
+    char *source;
+    char *name;
+    char *value;
+    int  hidden;
+    int  action;
+
+    struct _stats_event_tag *next;
+} stats_event_t;
+
+typedef struct _stats_source_tag
+{
+    char *source;
+    int  hidden;
+    avl_tree *stats_tree;
+} stats_source_t;
+
 typedef struct _event_queue_tag
 {
     volatile stats_event_t *head;
@@ -73,19 +99,14 @@
 } event_listener_t;
 
 static volatile int _stats_running = 0;
-static thread_type *_stats_thread_id;
 static volatile int _stats_threads = 0;
 
 static stats_t _stats;
 static mutex_t _stats_mutex;
 
-static event_queue_t _global_event_queue;
-spin_t _global_event_mutex;
-
 static volatile event_listener_t *_event_listeners;
 
 
-static void *_stats_thread(void *arg);
 static int _compare_stats(void *a, void *b, void *arg);
 static int _compare_source_stats(void *a, void *b, void *arg);
 static int _free_stats(void *key);
@@ -95,34 +116,21 @@
 static stats_source_t *_find_source(avl_tree *tree, const char *source);
 static void _free_event(stats_event_t *event);
 static stats_event_t *_get_event_from_queue (event_queue_t *queue);
+static void process_event (stats_event_t *event);
 
 
 /* simple helper function for creating an event */
-static stats_event_t *build_event (const char *source, const char *name, const char *value)
+static void build_event (stats_event_t *event, const char *source, const char *name, const char *value)
 {
-    stats_event_t *event;
-
-    event = (stats_event_t *)calloc(1, sizeof(stats_event_t));
-    if (event)
-    {
-        if (source)
-            event->source = (char *)strdup(source);
-        if (name)
-            event->name = (char *)strdup(name);
-        if (value)
-            event->value = (char *)strdup(value);
-        else
-            event->action = STATS_EVENT_REMOVE;
-    }
-    return event;
+    event->source = (char *)source;
+    event->name = (char *)name;
+    event->value = (char *)value;
+    if (value)
+        event->action = 0;
+    else
+        event->action = STATS_EVENT_REMOVE;
 }
 
-static void queue_global_event (stats_event_t *event)
-{
-    thread_spin_lock(&_global_event_mutex);
-    _add_event_to_queue (event, &_global_event_queue);
-    thread_spin_unlock(&_global_event_mutex);
-}
 
 void stats_initialize(void)
 {
@@ -135,13 +143,26 @@
     /* set up global mutex */
     thread_mutex_create("stats", &_stats_mutex);
 
-    /* set up stats queues */
-    event_queue_init (&_global_event_queue);
-    thread_spin_create("stats_global_event", &_global_event_mutex);
-
     /* fire off the stats thread */
     _stats_running = 1;
-    _stats_thread_id = thread_create("Stats Thread", _stats_thread, NULL, THREAD_ATTACHED);
+
+    stats_event_time (NULL, "server_start");
+
+    /* global currently active stats */
+    stats_event (NULL, "clients", "0");
+    stats_event (NULL, "connections", "0");
+    stats_event (NULL, "sources", "0");
+    stats_event (NULL, "stats", "0");
+    stats_event (NULL, "listeners", "0");
+
+    /* global accumulating stats */
+    stats_event (NULL, "client_connections", "0");
+    stats_event (NULL, "source_client_connections", "0");
+    stats_event (NULL, "source_relay_connections", "0");
+    stats_event (NULL, "source_total_connections", "0");
+    stats_event (NULL, "stats_connections", "0");
+    stats_event (NULL, "listener_connections", "0");
+    stats_event (NULL, "outgoing_kbitrate", "0");
 }
 
 void stats_shutdown(void)
@@ -153,7 +174,6 @@
 
     /* wait for thread to exit */
     _stats_running = 0;
-    thread_join(_stats_thread_id);
 
     /* wait for other threads to shut down */
     do {
@@ -166,25 +186,9 @@
 
     /* free the queues */
 
-    /* destroy the queue mutexes */
-    thread_spin_destroy(&_global_event_mutex);
-
     thread_mutex_destroy(&_stats_mutex);
     avl_tree_free(_stats.source_tree, _free_source_stats);
     avl_tree_free(_stats.global_tree, _free_stats);
-
-    while (1)
-    {
-        stats_event_t *event = _get_event_from_queue (&_global_event_queue);
-        if (event == NULL) break;
-        if(event->source)
-            free(event->source);
-        if(event->value)
-            free(event->value);
-        if(event->name)
-            free(event->name);
-        free(event);
-    }
 }
 
 stats_t *stats_get_stats(void)
@@ -203,16 +207,15 @@
 /* simple name=tag stat create/update */
 void stats_event(const char *source, const char *name, const char *value)
 {
-    stats_event_t *event;
+    stats_event_t event;
 
     if (value && xmlCheckUTF8 ((unsigned char *)value) == 0)
     {
         WARN2 ("seen non-UTF8 data, probably incorrect metadata (%s, %s)", name, value);
         return;
     }
-    event = build_event (source, name, value);
-    if (event)
-        queue_global_event (event);
+    build_event (&event, source, name, (char *)value);
+    process_event (&event);
 }
 
 
@@ -258,17 +261,14 @@
  * source stats tree. */
 void stats_event_hidden (const char *source, const char *name, int hidden)
 {
-    stats_event_t *event;
     const char *str = NULL;
+    stats_event_t event;
 
     if (hidden)
         str = "";
-    event = build_event (source, name, str);
-    if (event)
-    {
-        event->action = STATS_EVENT_HIDDEN;
-        queue_global_event (event);
-    }
+    build_event (&event, source, name, NULL);
+    event.action = STATS_EVENT_HIDDEN;
+    process_event (&event);
 }
 
 /* printf style formatting for stat create/update */
@@ -325,51 +325,46 @@
 /* increase the value in the provided stat by 1 */
 void stats_event_inc(const char *source, const char *name)
 {
-    stats_event_t *event = build_event (source, name, NULL);
+    stats_event_t event;
+    char buffer[VAL_BUFSIZE];
+    build_event (&event, source, name, buffer);
     /* DEBUG2("%s on %s", name, source==NULL?"global":source); */
-    if (event)
-    {
-        event->action = STATS_EVENT_INC;
-        queue_global_event (event);
-    }
+    event.action = STATS_EVENT_INC;
+    process_event (&event);
 }
 
 void stats_event_add(const char *source, const char *name, unsigned long value)
 {
-    stats_event_t *event = build_event (source, name, NULL);
+    stats_event_t event;
+    char buffer [VAL_BUFSIZE];
+
+    build_event (&event, source, name, buffer);
+    snprintf (buffer, VAL_BUFSIZE, "%ld", value);
+    event.action = STATS_EVENT_ADD;
     /* DEBUG2("%s on %s", name, source==NULL?"global":source); */
-    if (event)
-    {
-        event->value = malloc (16);
-        snprintf (event->value, 16, "%ld", value);
-        event->action = STATS_EVENT_ADD;
-        queue_global_event (event);
-    }
+    process_event (&event);
 }
 
 void stats_event_sub(const char *source, const char *name, unsigned long value)
 {
-    stats_event_t *event = build_event (source, name, NULL);
+    stats_event_t event;
+    char buffer[VAL_BUFSIZE];
+    build_event (&event, source, name, buffer);
     /* DEBUG2("%s on %s", name, source==NULL?"global":source); */
-    if (event)
-    {
-        event->value = malloc (16);
-        snprintf (event->value, 16, "%ld", value);
-        event->action = STATS_EVENT_SUB;
-        queue_global_event (event);
-    }
+    snprintf (buffer, VAL_BUFSIZE, "%ld", value);
+    event.action = STATS_EVENT_SUB;
+    process_event (&event);
 }
 
 /* decrease the value in the provided stat by 1 */
 void stats_event_dec(const char *source, const char *name)
 {
+    stats_event_t event;
+    char buffer[VAL_BUFSIZE];
     /* DEBUG2("%s on %s", name, source==NULL?"global":source); */
-    stats_event_t *event = build_event (source, name, NULL);
-    if (event)
-    {
-        event->action = STATS_EVENT_DEC;
-        queue_global_event (event);
-    }
+    build_event (&event, source, name, buffer);
+    event.action = STATS_EVENT_DEC;
+    process_event (&event);
 }
 
 /* note: you must call this function only when you have exclusive access
@@ -448,8 +443,8 @@
 /* helper to apply specialised changes to a stats node */
 static void modify_node_event (stats_node_t *node, stats_event_t *event)
 {
-    char *str;
-
+    if (node == NULL || event == NULL)
+        return;
     if (event->action == STATS_EVENT_HIDDEN)
     {
         if (event->value)
@@ -479,15 +474,10 @@
             default:
                 break;
         }
-        str = malloc (20);
-        snprintf (str, 20, "%" PRId64, value);
-        free (event->value);
-        event->value = strdup (str);
+        snprintf (event->value, VAL_BUFSIZE, "%" PRId64, value);
     }
-    else
-        str = (char *)strdup (event->value);
     free (node->value);
-    node->value = str;
+    node->value = strdup (event->value);
 }
 
 
@@ -604,7 +594,7 @@
     char buffer[100];
 
     localtime_r (&now, &local);
-    strftime (buffer, sizeof (buffer), "%a, %d %b %Y %H:%M:%S %z", &local);
+    strftime (buffer, sizeof (buffer), ICECAST_TIME_FMT, &local);
     stats_event (mount, name, buffer);
 }
 
@@ -640,64 +630,26 @@
     stats_event (NULL, "admin", config->admin);
 }
 
-
-static void *_stats_thread(void *arg)
+static void process_event_unlocked (stats_event_t *event)
 {
-    stats_event_t *event;
+    /* check if we are dealing with a global or source event */
+    if (event->source == NULL)
+        process_global_event (event);
+    else
+        process_source_event (event);
 
-    stats_event_time (NULL, "server_start");
+    /* now we have an event that's been processed into the running stats */
+    /* this event should get copied to event listeners' queues */
+    stats_listener_send (event);
+}
 
-    /* global currently active stats */
-    stats_event (NULL, "clients", "0");
-    stats_event (NULL, "connections", "0");
-    stats_event (NULL, "sources", "0");
-    stats_event (NULL, "stats", "0");
-    stats_event (NULL, "listeners", "0");
-
-    /* global accumulating stats */
-    stats_event (NULL, "client_connections", "0");
-    stats_event (NULL, "source_client_connections", "0");
-    stats_event (NULL, "source_relay_connections", "0");
-    stats_event (NULL, "source_total_connections", "0");
-    stats_event (NULL, "stats_connections", "0");
-    stats_event (NULL, "listener_connections", "0");
-    stats_event (NULL, "outgoing_kbitrate", "0");
-
-    INFO0 ("stats thread started");
-    while (_stats_running) {
-        if (_global_event_queue.head != NULL) {
-            /* grab the next event from the queue */
-            thread_spin_lock(&_global_event_mutex);
-            event = _get_event_from_queue (&_global_event_queue);
-            thread_spin_unlock(&_global_event_mutex);
-
-            if (event == NULL)
-                continue;
-            event->next = NULL;
-
-            thread_mutex_lock(&_stats_mutex);
-
-            /* check if we are dealing with a global or source event */
-            if (event->source == NULL)
-                process_global_event (event);
-            else
-                process_source_event (event);
-
-            /* now we have an event that's been processed into the running stats */
-            /* this event should get copied to event listeners' queues */
-            stats_listener_send (event);
-
-            /* now we need to destroy the event */
-            _free_event(event);
-
-            thread_mutex_unlock(&_stats_mutex);
-            continue;
-        }
-        thread_sleep(500000);
-        stats_global_calc();
-    }
-
-    return NULL;
+static void process_event (stats_event_t *event)
+{
+    if (event == NULL)
+        return;
+    thread_mutex_lock (&_stats_mutex);
+    process_event_unlocked (event);
+    thread_mutex_unlock (&_stats_mutex);
 }
 
 /* you must have the _stats_mutex locked here */
@@ -705,6 +657,9 @@
 {
     event_listener_t **prev = (event_listener_t **)&_event_listeners,
                      *current = *prev;
+    stats_event_t stats_count, *event;
+    char buffer [VAL_BUFSIZE];
+
     while (current)
     {
         if (current == listener)
@@ -715,6 +670,15 @@
         prev = &current->next;
         current = *prev;
     }
+
+    /* remove this listener before sending this change */
+    build_event (&stats_count, NULL, "stats_connections", buffer);
+    stats_count.action = STATS_EVENT_DEC;
+    process_event_unlocked (&stats_count);
+
+    /* flush any extra that sneaked on at the last moment */
+    while ((event = _get_event_from_queue (&listener->queue)) != NULL)
+        _free_event (event);
 }
 
 
@@ -823,8 +787,12 @@
     avl_node *node2;
     stats_event_t *event;
     stats_source_t *source;
+    stats_event_t stats_count;
+    char buffer[20];
 
-    thread_mutex_lock(&_stats_mutex);
+    build_event (&stats_count, NULL, "stats_connections", buffer);
+    stats_count.action = STATS_EVENT_INC;
+    process_event_unlocked (&stats_count);
 
     /* first we fill our queue with the current stats */
     
@@ -855,11 +823,8 @@
     /* now we register to receive future event notices */
     listener->next = (event_listener_t *)_event_listeners;
     _event_listeners = listener;
-
-    thread_mutex_unlock(&_stats_mutex);
 }
 
-
 static void check_uri (event_listener_t *listener, client_t *client)
 {
     const char *mount = httpp_getvar (client->parser, HTTPP_VAR_URI);
@@ -883,12 +848,10 @@
     /* increment the thread count */
     thread_mutex_lock(&_stats_mutex);
     _stats_threads++;
-    stats_event_args (NULL, "stats", "%d", _stats_threads);
-    thread_mutex_unlock(&_stats_mutex);
-
     thread_mutex_create("stats local event", &listener.mutex);
 
     _register_listener (&listener);
+    thread_mutex_unlock(&_stats_mutex);
 
     while (_stats_running) {
         thread_mutex_lock (&listener.mutex);
@@ -908,7 +871,6 @@
     thread_mutex_lock(&_stats_mutex);
     _unregister_listener (&listener);
     _stats_threads--;
-    stats_event_args (NULL, "stats", "%d", _stats_threads);
     thread_mutex_unlock(&_stats_mutex);
 
     thread_mutex_destroy (&listener.mutex);
@@ -939,7 +901,7 @@
     struct _source_xml_tag *next;
 } source_xml_t;
 
-static xmlNodePtr _find_xml_node(char *mount, source_xml_t **list, xmlNodePtr root)
+static xmlNodePtr _find_xml_node(const char *mount, source_xml_t **list, xmlNodePtr root)
 {
     source_xml_t *node, *node2;
     int found = 0;
@@ -1185,30 +1147,21 @@
 }
 
 
-static void stats_global_calc (void)
+void stats_global_calc (void)
 {
     stats_event_t event;
-    stats_node_t *node;
-    char buffer [20];
+    char buffer [VAL_BUFSIZE];
     static time_t next_update = 0;
 
     if (global.time < next_update)
         return;
     next_update = global.time + 1;
-    event.source = NULL;
-    event.name = "outgoing_kbitrate";
-    event.value = buffer;
-    event.action = STATS_EVENT_SET;
+    build_event (&event, NULL, "outgoing_kbitrate", buffer);
 
     thread_mutex_lock (&_stats_mutex);
-    node = _find_node(_stats.global_tree, event.name);
-    if (node)
-    {
-        snprintf (buffer, sizeof(buffer), "%" PRIu64,
+    snprintf (buffer, sizeof(buffer), "%" PRIu64,
             (int64_t)(global_getrate_avg (global.out_bitrate) * 8 / 1000.0 + 0.5));
-        modify_node_event (node, &event);
-        stats_listener_send (&event);
-    }
+    process_event_unlocked (&event);
     thread_mutex_unlock (&_stats_mutex);
 }
 

Modified: icecast/branches/kh/icecast/src/stats.h
===================================================================
--- icecast/branches/kh/icecast/src/stats.h	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/src/stats.h	2008-08-01 20:26:09 UTC (rev 15145)
@@ -22,31 +22,6 @@
 #include <libxml/tree.h>
 
 
-typedef struct _stats_node_tag
-{
-    char *name;
-    char *value;
-    int hidden;
-} stats_node_t;
-
-typedef struct _stats_event_tag
-{
-    char *source;
-    char *name;
-    char *value;
-    int  hidden;
-    int  action;
-
-    struct _stats_event_tag *next;
-} stats_event_t;
-
-typedef struct _stats_source_tag
-{
-    char *source;
-    int  hidden;
-    avl_tree *stats_tree;
-} stats_source_t;
-
 typedef struct _stats_tag
 {
     avl_tree *global_tree;
@@ -93,6 +68,7 @@
 
 void *stats_connection(void *arg);
 void stats_callback (client_t *client, void *notused);
+void stats_global_calc(void);
 
 void stats_transform_xslt(client_t *client, const char *uri);
 void stats_sendxml(client_t *client);

Modified: icecast/branches/kh/icecast/web/Makefile.am
===================================================================
--- icecast/branches/kh/icecast/web/Makefile.am	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/web/Makefile.am	2008-08-01 20:26:09 UTC (rev 15145)
@@ -11,6 +11,6 @@
                 server_version.xsl \
                 adminbar.html \
                 statusbar.html \
-				admin.html \
-				index.html \
+                admin.html \
+                index.html \
                 favicon.ico

Added: icecast/branches/kh/icecast/web/admin.html
===================================================================
--- icecast/branches/kh/icecast/web/admin.html	                        (rev 0)
+++ icecast/branches/kh/icecast/web/admin.html	2008-08-01 20:26:09 UTC (rev 15145)
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+  <head>
+    <link rel="stylesheet" type="text/css" href="/style.css" />
+    <title>Icecast Streaming Media Server</title>
+  </head>
+
+  <frameset rows="170,*" border="0">
+      <frame name="header" frameborder="0" scrolling="no" width="100%" src="/adminbar.html" />
+      <frame name="content" frameborder="0" scrolling="auto" width="100%" src="/admin/stats.xsl" />
+  </frameset>
+</html>

Modified: icecast/branches/kh/icecast/win32/Makefile.am
===================================================================
--- icecast/branches/kh/icecast/win32/Makefile.am	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/win32/Makefile.am	2008-08-01 20:26:09 UTC (rev 15145)
@@ -12,5 +12,5 @@
     colors.h icecast.dsp icecast.ico icecast2.iss icecast2logo2.bmp\
     resource.h running.bmp stopped.bmp TRAYNOT.h Traynot.cpp \
     icecast2_console.dsw icecast2_console.dsp credits.bmp icecast2title.bmp \
-    icecastService.cpp icecastService.dsp fnmatch.h
+    icecastService.cpp icecastService.dsp
 

Modified: icecast/branches/kh/icecast/win32/icecast2.iss
===================================================================
--- icecast/branches/kh/icecast/win32/icecast2.iss	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/win32/icecast2.iss	2008-08-01 20:26:09 UTC (rev 15145)
@@ -3,7 +3,7 @@
 
 [Setup]
 AppName=Icecast2-KH
-AppVerName=Icecast v2.3.1-kh34
+AppVerName=Icecast v2.3.2-kh1
 AppPublisherURL=http://www.icecast.org
 AppSupportURL=http://www.icecast.org
 AppUpdatesURL=http://www.icecast.org
@@ -13,7 +13,7 @@
 LicenseFile=..\COPYING
 InfoAfterFile=..\README
 OutputDir=.
-OutputBaseFilename=icecast2_win32_v2.3.1-kh34_setup
+OutputBaseFilename=icecast2_win32_v2.3.2-kh1_setup
 WizardImageFile=icecast2logo2.bmp
 WizardImageStretch=no
 ; uncomment the following line if you want your installation to run on NT 3.51 too.

Modified: icecast/branches/kh/icecast/win32/icecast2_console.dsp
===================================================================
--- icecast/branches/kh/icecast/win32/icecast2_console.dsp	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/win32/icecast2_console.dsp	2008-08-01 20:26:09 UTC (rev 15145)
@@ -50,7 +50,8 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 theora_static_d.lib libspeex.lib ogg_static.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libcurl.lib vorbis_static.lib libxml2.lib libxslt.lib iconv.lib pthreadVSE.lib ws2_32.lib ssleay32MT.lib /nologo /subsystem:console /machine:I386 /nodefaultlib:"libc.lib" /nodefaultlib:"libcd.lib" /nodefaultlib:"libcmt.lib"
+# ADD LINK32 theora_static_d.lib libspeex.lib ogg_static.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libcurl.lib vorbis_static.lib libxml2.lib libxslt.lib iconv.lib pthreadVSE.lib ws2_32.lib winmm.lib ssleay32MT.lib /nologo /subsystem:console /machine:I386 /nodefaultlib:"libc.lib" /nodefaultlib:"libcd.lib" /nodefaultlib:"libcmt.lib"
+# SUBTRACT LINK32 /pdb:none
 
 !ELSEIF  "$(CFG)" == "icecast2 console - Win32 Debug"
 
@@ -74,7 +75,8 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 theora_static_d.lib libspeex.lib ogg_static.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libcurl.lib vorbis_static.lib libxml2.lib libxslt.lib iconv.lib pthreadVSE.lib ws2_32.lib ssleay32MT.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /nodefaultlib:"libcmt.lib" /nodefaultlib:"libcmtd.lib" /pdbtype:sept
+# ADD LINK32 theora_static_d.lib libspeex.lib ogg_static.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libcurl.lib vorbis_static.lib libxml2.lib libxslt.lib iconv.lib pthreadVSE.lib ws2_32.lib winmm.lib ssleay32MT.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /nodefaultlib:"libcmt.lib" /nodefaultlib:"libcmtd.lib" /pdbtype:sept
+# SUBTRACT LINK32 /pdb:none
 
 !ENDIF 
 

Modified: icecast/branches/kh/icecast/win32/icecastService.dsp
===================================================================
--- icecast/branches/kh/icecast/win32/icecastService.dsp	2008-08-01 08:49:56 UTC (rev 15144)
+++ icecast/branches/kh/icecast/win32/icecastService.dsp	2008-08-01 20:26:09 UTC (rev 15145)
@@ -43,7 +43,6 @@
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
 # ADD CPP /nologo /MD /W3 /GX /O2 /I ".." /I "..\src" /D "NDEBUG" /D "_CONSOLE" /D "WIN32_SERVICE" /D HAVE_CONFIG_H=1 /D "WIN32" /D "_MBCS" /YX /FD /c
-# SUBTRACT CPP /Z<none>
 # ADD BASE RSC /l 0x409 /d "NDEBUG"
 # ADD RSC /l 0x409 /d "NDEBUG"
 BSC32=bscmake.exe
@@ -51,8 +50,7 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 libspeex.lib theora_static_d.lib ogg_static.lib vorbis_static.lib pthreadVSE.lib ssleay32MT.lib libcurl.lib libxml2.lib libxslt.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /pdb:none /machine:I386 /nodefaultlib:"libcmt.lib" /nodefaultlib:"libcmtd.lib" /nodefaultlib:"libcd.lib"
-# SUBTRACT LINK32 /debug
+# ADD LINK32 libspeex.lib theora_static_d.lib ogg_static.lib vorbis_static.lib pthreadVSE.lib ssleay32MT.lib libcurl.lib libxml2.lib libxslt.lib ws2_32.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /pdb:none /machine:I386 /nodefaultlib:"libcmt.lib" /nodefaultlib:"libcmtd.lib" /nodefaultlib:"libcd.lib"
 
 !ELSEIF  "$(CFG)" == "icecastService - Win32 Debug"
 
@@ -76,8 +74,8 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 vorbis_static.lib iconv.lib libspeex.lib theora_static_d.lib ogg_static_d.lib vorbis_static_d.lib pthreadVSE.lib ssleay32MT.lib libcurl.lib libxml2.lib libxslt.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcmt.lib" /out:"service_debug/icecast2service.exe" /pdbtype:sept
-# SUBTRACT LINK32 /verbose
+# ADD LINK32 vorbis_static.lib iconv.lib libspeex.lib theora_static_d.lib ogg_static_d.lib vorbis_static_d.lib pthreadVSE.lib ssleay32MT.lib libcurl.lib libxml2.lib libxslt.lib ws2_32.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcmt.lib" /out:"service_debug/icecast2service.exe" /pdbtype:sept
+# SUBTRACT LINK32 /pdb:none
 
 !ENDIF 
 



More information about the commits mailing list