Attached a patch for the rrd-tool LIBDBI integration with the following improvements:
[rrdtool.git] / src / rrd_thread_safe_nt.c
index 53ebda3..e0dad45 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * RRDtool 1.2.23  Copyright by Tobi Oetiker, 1997-2007
+ * RRDtool 1.3.2  Copyright by Tobi Oetiker, 1997-2008
  * This file:     Copyright 2003 Peter Stamfest <peter@stamfest.at> 
  *                             & Tobias Oetiker
  * Distributed under the GPL
@@ -18,7 +18,7 @@
 
 /* Key for the thread-specific rrd_context */
 static DWORD context_key;
-static CRITICAL_SECTION CriticalSection; 
+static CRITICAL_SECTION CriticalSection;
 
 
 /* Once-only initialisation of the key */
@@ -28,89 +28,129 @@ static DWORD context_key_once = 0;
 /* Free the thread-specific rrd_context - we might actually use
    rrd_free_context instead...
  */
-static void context_destroy_context(void)
+static void context_destroy_context(
+    void)
 {
-       DeleteCriticalSection(&CriticalSection);
+    DeleteCriticalSection(&CriticalSection);
     TlsFree(context_key);
-       context_key_once=0;
+    context_key_once = 0;
 }
-static void context_init_context(void)
+static void context_init_context(
+    void)
 {
-       if (!InterlockedExchange(&context_key_once, 1)) {
-               context_key = TlsAlloc();
-               InitializeCriticalSection(&CriticalSection);
-               atexit(context_destroy_context);
-       }
+    if (!InterlockedExchange((LONG*)(&context_key_once), 1)) {
+        context_key = TlsAlloc();
+        InitializeCriticalSection(&CriticalSection);
+        atexit(context_destroy_context);
+    }
 }
-struct rrd_context *rrd_get_context(void) {
-    struct rrd_context *ctx;
-               
-       context_init_context();
-    ctx = TlsGetValue(context_key);
+rrd_context_t *rrd_get_context(
+    void)
+{
+    rrd_context_t *ctx;
+
+    context_init_context();
+
+    ctx = (rrd_context_t*)TlsGetValue(context_key);
     if (!ctx) {
-               ctx = rrd_new_context();
-               TlsSetValue(context_key, ctx);
-    } 
+        ctx = rrd_new_context();
+        TlsSetValue(context_key, ctx);
+    }
     return ctx;
 }
+
+
+/* this was added by the win32 porters Christof.Wegmann@exitgames.com */
+
+rrd_context_t *rrd_force_new_context(
+    void)
+{
+    rrd_context_t *ctx;
+
+    context_init_context();
+
+    ctx = rrd_new_context();
+    TlsSetValue(context_key, ctx);
+
+    return ctx;
+}
+
+
 #undef strerror
-const char *rrd_strerror(int err) {
-    struct rrd_context *ctx;
-       context_init_context();
+const char *rrd_strerror(
+    int err)
+{
+    rrd_context_t *ctx;
 
-       ctx = rrd_get_context();
+    context_init_context();
 
-    EnterCriticalSection(&CriticalSection); 
-    strncpy(ctx->lib_errstr, strerror(err), ctx->errlen);
-    ctx->lib_errstr[ctx->errlen] = '\0';
-    LeaveCriticalSection(&CriticalSection); 
+    ctx = rrd_get_context();
+
+    EnterCriticalSection(&CriticalSection);
+    strncpy(ctx->lib_errstr, strerror(err), sizeof(ctx->lib_errstr));
+    ctx->lib_errstr[sizeof(ctx->lib_errstr) - 1] = '\0';
+    LeaveCriticalSection(&CriticalSection);
 
     return ctx->lib_errstr;
 }
+
 /*
  * there much be a re-entrant version of these somewhere in win32 land
  */
-struct tm* localtime_r(const time_t *timep, struct tm* result)
+struct tm *localtime_r(
+    const time_t *timep,
+    struct tm *result)
 {
-       struct tm *local;
-       context_init_context();
-
-       EnterCriticalSection(&CriticalSection);
-       local = localtime(timep);
-       memcpy(result,local,sizeof(struct tm));
-       LeaveCriticalSection(&CriticalSection);
-       return result;
+    struct tm *local;
+
+    context_init_context();
+
+    EnterCriticalSection(&CriticalSection);
+    local = localtime(timep);
+    memcpy(result, local, sizeof(struct tm));
+    LeaveCriticalSection(&CriticalSection);
+    return result;
 }
-char* ctime_r(const time_t *timep, char* result)
+
+char     *ctime_r(
+    const time_t *timep,
+    char *result)
 {
-       char *local;
-       context_init_context();
-
-       EnterCriticalSection(&CriticalSection);
-       local = ctime(timep);
-       strcpy(result,local);
-       LeaveCriticalSection(&CriticalSection);
-       return result;
+    char     *local;
+
+    context_init_context();
+
+    EnterCriticalSection(&CriticalSection);
+    local = ctime(timep);
+    strcpy(result, local);
+    LeaveCriticalSection(&CriticalSection);
+    return result;
 }
 
-struct tm* gmtime_r(const time_t *timep, struct tm* result)
+struct tm *gmtime_r(
+    const time_t *timep,
+    struct tm *result)
 {
-       struct tm *local;
-       context_init_context();
-
-       EnterCriticalSection(&CriticalSection);
-       local = gmtime(timep);
-       memcpy(result,local,sizeof(struct tm));
-       LeaveCriticalSection(&CriticalSection);
-       return result;
+    struct tm *local;
+
+    context_init_context();
+
+    EnterCriticalSection(&CriticalSection);
+    local = gmtime(timep);
+    memcpy(result, local, sizeof(struct tm));
+    LeaveCriticalSection(&CriticalSection);
+    return result;
 }
 
 /* implementation from Apache's APR library */
-char *strtok_r(char *str, const char *sep, char **last)
+char     *strtok_r(
+    char *str,
+    const char *sep,
+    char **last)
 {
-    char *token;
-       context_init_context();
+    char     *token;
+
+    context_init_context();
 
 
     if (!str)           /* subsequent call */
@@ -130,7 +170,7 @@ char *strtok_r(char *str, const char *sep, char **last)
      */
     *last = token + 1;
     while (**last && !strchr(sep, **last))
-        ++*last;
+        ++ * last;
 
     if (**last) {
         **last = '\0';
@@ -139,4 +179,3 @@ char *strtok_r(char *str, const char *sep, char **last)
 
     return token;
 }
-