/* Copyright (C) 2008 Andreas Baumann This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "port/time.h" #if !defined HAVE_LOCALTIME_R || defined TEST_LOCALTIME_R #if defined HAVE_PTHREADS #include /* for pthread_X */ #include "port/stdbool.h" /* for bool */ #include "port/string.h" /* for memcpy */ struct tm *wolf_port_localtime_r( const time_t *timep, struct tm *result ) { static pthread_mutex_t mutex; static bool first = true; struct tm *local_result; if( first ) { pthread_mutex_init( &mutex, NULL ); first = false; } pthread_mutex_lock( &mutex ); local_result = localtime( timep ); if( local_result != NULL ) { memcpy( result, local_result, sizeof( struct tm ) ); } pthread_mutex_unlock( &mutex ); return ( local_result != NULL ) ? result : NULL; } #else /* defined HAVE_PTHREADS */ #if defined _WIN32 /* localtime on Windows uses thread-local data to make things thread-safe, * see MinGW mailing-lists. So we can safely copy the local buffer to the * result without locking. * TODO: needs testing of the hypothesis! */ #include "port/string.h" /* for memcpy */ struct tm *wolf_port_localtime_r( const time_t *timep, struct tm *result ) { struct tm *local_result; local_result = localtime( timep ); if( local_result != NULL ) { memcpy( result, local_result, sizeof( struct tm ) ); } return ( local_result != NULL ) ? result : NULL; } #else #error no pthreads, port localtime_r differently! #endif /* defined _WIN32 */ #endif /* defined HAVE_PTHREADS */ #endif /* !defined HAVE_LOCALTIME_R || defined TEST_LOCALTIME_R */