[xiph-cvs] cvs commit: icecast/src logging.h main.c xslt.c xslt.h

Michael Smith msmith at xiph.org
Tue Aug 13 05:46:46 PDT 2002



msmith      02/08/13 08:46:45

  Modified:    src      logging.h main.c xslt.c xslt.h
  Log:
  Cache stylesheets for transforming.

Revision  Changes    Path
1.5       +1 -0      icecast/src/logging.h

Index: logging.h
===================================================================
RCS file: /usr/local/cvsroot/icecast/src/logging.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- logging.h	3 Aug 2002 08:16:52 -0000	1.4
+++ logging.h	13 Aug 2002 12:46:45 -0000	1.5
@@ -36,6 +36,7 @@
 #define DEBUG1(y, a) log_write(errorlog, 4, CATMODULE "/", __FUNCTION__, y, a)
 #define DEBUG2(y, a, b) log_write(errorlog, 4, CATMODULE "/", __FUNCTION__, y, a, b)
 #define DEBUG3(y, a, b, c) log_write(errorlog, 4, CATMODULE "/", __FUNCTION__, y, a, b, c)
+#define DEBUG4(y, a, b, c, d) log_write(errorlog, 4, CATMODULE "/", __FUNCTION__, y, a, b, c, d)
 
 /* CATMODULE is the category or module that logging messages come from.
 ** we set one here in cause someone forgets in the .c file.

<p><p>1.15      +3 -0      icecast/src/main.c

Index: main.c
===================================================================
RCS file: /usr/local/cvsroot/icecast/src/main.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- main.c	9 Aug 2002 13:14:59 -0000	1.14
+++ main.c	13 Aug 2002 12:46:45 -0000	1.15
@@ -26,6 +26,7 @@
 #include "slave.h"
 #include "stats.h"
 #include "logging.h"
+#include "xslt.h"
 
 #ifdef _WIN32
 #define snprintf _snprintf
@@ -51,10 +52,12 @@
         connection_initialize();
         global_initialize();
         refbuf_initialize();
+    xslt_initialize();
 }
 
 static void _shutdown_subsystems(void)
 {
+    xslt_shutdown();
         refbuf_shutdown();
         stats_shutdown();
         slave_shutdown();

<p><p>1.4       +105 -5    icecast/src/xslt.c

Index: xslt.c
===================================================================
RCS file: /usr/local/cvsroot/icecast/src/xslt.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- xslt.c	9 Aug 2002 14:38:42 -0000	1.3
+++ xslt.c	13 Aug 2002 12:46:45 -0000	1.4
@@ -11,13 +11,20 @@
 #include <libxslt/transform.h>
 #include <libxslt/xsltutils.h>
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#ifndef _WIN32
+#include <sys/time.h>
+#endif
+
 
 #include <thread/thread.h>
 #include <avl/avl.h>
 #include <httpp/httpp.h>
 #include <net/sock.h>
 
-
 #include "connection.h"
 
 #include "global.h"
@@ -25,6 +32,99 @@
 #include "client.h"
 #include "stats.h"
 
+#define CATMODULE "xslt"
+#include "log.h"
+#include "logging.h"
+
+typedef struct {
+    char              *filename;
+    time_t             last_modified;
+    time_t             cache_age;
+    xsltStylesheetPtr  stylesheet;
+} stylesheet_cache_t;
+
+/* Keep it small... */
+#define CACHESIZE 3
+
+stylesheet_cache_t cache[CACHESIZE];
+mutex_t xsltlock;
+
+void xslt_initialize()
+{
+    memset(cache, 0, sizeof(stylesheet_cache_t)*CACHESIZE);
+    thread_mutex_create(&xsltlock);
+}
+
+void xslt_shutdown() {
+    int i;
+
+    for(i=0; i < CACHESIZE; i++) {
+        if(cache[i].filename)
+            free(cache[i].filename);
+        if(cache[i].stylesheet)
+            xsltFreeStylesheet(cache[i].stylesheet);
+    }
+
+    xsltCleanupGlobals();
+}
+
+static int evict_cache_entry() {
+    int i, age=0, oldest;
+
+    for(i=0; i < CACHESIZE; i++) {
+        if(cache[i].cache_age > age) {
+            age = cache[i].cache_age;
+            oldest = i;
+        }
+    }
+
+    xsltFreeStylesheet(cache[oldest].stylesheet);
+    free(cache[oldest].filename);
+
+    return oldest;
+}
+
+static xsltStylesheetPtr xslt_get_stylesheet(char *fn) {
+    int i;
+    int empty = -1;
+    struct stat file;
+
+    if(stat(fn, &file)) {
+        DEBUG1("Error checking for stylesheet file: %s", strerror(errno));
+        return NULL;
+    }
+
+    for(i=0; i < CACHESIZE; i++) {
+        if(cache[i].filename)
+        {
+            if(!strcmp(fn, cache[i].filename))
+            {
+                if(file.st_mtime > cache[i].last_modified)
+                {
+                    xsltFreeStylesheet(cache[i].stylesheet);
+
+                    cache[i].last_modified = file.st_mtime;
+                    cache[i].stylesheet = xsltParseStylesheetFile(fn);
+                    cache[i].cache_age = time(NULL);
+                }
+                return cache[i].stylesheet;
+            }
+        }
+        else
+            empty = i;
+    }
+
+    if(empty>=0)
+        i = empty;
+    else
+        i = evict_cache_entry();
+
+    cache[i].last_modified = file.st_mtime;
+    cache[i].filename = strdup(fn);
+    cache[i].stylesheet = xsltParseStylesheetFile(fn);
+    cache[i].cache_age = time(NULL);
+    return cache[i].stylesheet;
+}
 
 void xslt_transform(xmlDocPtr doc, char *xslfilename, client_t *client)
 {
@@ -39,7 +139,10 @@
         xmlSubstituteEntitiesDefault(1);
         xmlLoadExtDtdDefaultValue = 1;
 
-	cur = xsltParseStylesheetFile(xslfilename);
+    thread_mutex_lock(&xsltlock);
+    cur = xslt_get_stylesheet(xslfilename);
+    thread_mutex_unlock(&xsltlock);
+
         if (cur == NULL) {
                 bytes = sock_write_string(client->con->sock, 
                 (char *)"Could not parse XSLT file");
@@ -63,9 +166,6 @@
     
 
     xmlFree(outputBuffer);
-    xsltFreeStylesheet(cur);
     xmlFreeDoc(res);
-
-    xsltCleanupGlobals(); /* Neccesary? */
 }
 

<p><p>1.3       +2 -0      icecast/src/xslt.h

Index: xslt.h
===================================================================
RCS file: /usr/local/cvsroot/icecast/src/xslt.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- xslt.h	9 Aug 2002 14:38:42 -0000	1.2
+++ xslt.h	13 Aug 2002 12:46:45 -0000	1.3
@@ -23,4 +23,6 @@
 
 
 void xslt_transform(xmlDocPtr doc, char *xslfilename, client_t *client);
+void xslt_initialize();
+void xslt_shutdown();
 

<p><p>--- >8 ----
List archives:  http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'cvs-request at xiph.org'
containing only the word 'unsubscribe' in the body.  No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.



More information about the commits mailing list