X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_thread_safe_nt.c;h=e0dad45a565f8acacf40c6c17afd8b6ca28be816;hp=9a598c54e1bf0dffd53fe221374ce4132e81f306;hb=d4110e29da41ce702bcc3327e86768c6f266915e;hpb=ab384eb6dac85f5f57dabcfc16114fcaf79d5e94 diff --git a/src/rrd_thread_safe_nt.c b/src/rrd_thread_safe_nt.c index 9a598c5..e0dad45 100644 --- a/src/rrd_thread_safe_nt.c +++ b/src/rrd_thread_safe_nt.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.2.1 Copyright by Tobi Oetiker, 1997-2005 + * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008 * This file: Copyright 2003 Peter Stamfest * & 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,88 +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); - 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 */ @@ -129,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'; @@ -138,4 +179,3 @@ char *strtok_r(char *str, const char *sep, char **last) return token; } -