diff --git a/ChangeLog b/ChangeLog index c54566790..27917581c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,7 @@ Features Bugfix * Fix hardclock() (only used in the benchmarking program) with some versions of mingw64 (found by kxjhlele). + * Fix warnings from mingw64 in timing.c (found by kxjklele). Changes * Move from SHA-1 to SHA-256 in example programs using signatures diff --git a/include/polarssl/timing.h b/include/polarssl/timing.h index a3eb510dc..5f3acfa17 100644 --- a/include/polarssl/timing.h +++ b/include/polarssl/timing.h @@ -65,6 +65,10 @@ unsigned long get_timer( struct hr_time *val, int reset ); * \brief Setup an alarm clock * * \param seconds delay before the "alarmed" flag is set + * + * \warning Only one alarm at a time is supported. In a threaded + * context, this means one for the whole process, not one per + * thread. */ void set_alarm( int seconds ); diff --git a/library/timing.c b/library/timing.c index a61220851..913cbdce6 100644 --- a/library/timing.c +++ b/library/timing.c @@ -251,9 +251,13 @@ unsigned long get_timer( struct hr_time *val, int reset ) return( delta ); } -DWORD WINAPI TimerProc( LPVOID uElapse ) +/* It's OK to use a global because alarm() is supposed to be global anyway */ +static DWORD alarmMs; + +DWORD WINAPI TimerProc( LPVOID TimerContext ) { - Sleep( (DWORD) uElapse ); + ((void) TimerContext); + Sleep( alarmMs ); alarmed = 1; return( TRUE ); } @@ -263,8 +267,8 @@ void set_alarm( int seconds ) DWORD ThreadId; alarmed = 0; - CloseHandle( CreateThread( NULL, 0, TimerProc, - (LPVOID) ( seconds * 1000 ), 0, &ThreadId ) ); + alarmMs = seconds * 1000; + CloseHandle( CreateThread( NULL, 0, TimerProc, NULL, 0, &ThreadId ) ); } void m_sleep( int milliseconds )