Code

Imported upstream version 1.3.8.
[pkg-rrdtool.git] / src / rrd_thread_safe_nt.c
index fa55cf515cfb2b43798ce448d918e5ea4a1f9822..92e6ba5c165b07d45c80820a4e33915293d3b8ee 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * RRDtool 1.3rc4  Copyright by Tobi Oetiker, 1997-2008
+ * RRDtool 1.3.8  Copyright by Tobi Oetiker, 1997-2009
  * This file:     Copyright 2003 Peter Stamfest <peter@stamfest.at> 
  *                             & Tobias Oetiker
  * Distributed under the GPL
@@ -7,7 +7,7 @@
  * rrd_thread_safe.c   Contains routines used when thread safety is required
  *                     for win32
  *****************************************************************************
- * $Id: rrd_thread_safe_nt.c 1366 2008-05-18 13:06:44Z oetiker $
+ * $Id: rrd_thread_safe_nt.c 1801 2009-05-19 13:45:05Z oetiker $
  *************************************************************************** */
 
 #include <windows.h>
@@ -22,7 +22,7 @@ static CRITICAL_SECTION CriticalSection;
 
 
 /* Once-only initialisation of the key */
-static DWORD context_key_once = 0;
+static volatile LONG context_key_once = 0;
 
 
 /* Free the thread-specific rrd_context - we might actually use
@@ -44,14 +44,14 @@ static void context_init_context(
         atexit(context_destroy_context);
     }
 }
-struct rrd_context *rrd_get_context(
+rrd_context_t *rrd_get_context(
     void)
 {
-    struct rrd_context *ctx;
+    rrd_context_t *ctx;
 
     context_init_context();
 
-    ctx = TlsGetValue(context_key);
+    ctx = (rrd_context_t*)(TlsGetValue(context_key));
     if (!ctx) {
         ctx = rrd_new_context();
         TlsSetValue(context_key, ctx);
@@ -59,19 +59,33 @@ struct rrd_context *rrd_get_context(
     return ctx;
 }
 
+#ifdef WIN32
+       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;
+       }
+#endif
+
 #undef strerror
 const char *rrd_strerror(
     int err)
 {
-    struct rrd_context *ctx;
+    rrd_context_t *ctx;
 
     context_init_context();
 
     ctx = rrd_get_context();
 
     EnterCriticalSection(&CriticalSection);
-    strncpy(ctx->lib_errstr, strerror(err), ctx->errlen);
-    ctx->lib_errstr[ctx->errlen] = '\0';
+    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;