From d2b0696d8fa0ce47e0bc525581b6b9254637984b Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Tue, 31 Mar 2009 13:44:17 +0200 Subject: created subdir for threading stuff, moved mutex there --- src/threads/mutex.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/threads/mutex.c (limited to 'src/threads') diff --git a/src/threads/mutex.c b/src/threads/mutex.c new file mode 100644 index 0000000..509eb51 --- /dev/null +++ b/src/threads/mutex.c @@ -0,0 +1,92 @@ +/* + 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 "errors.h" +#include "threads/mutex.h" + +#if defined HAVE_PTHREADS + +#include /* for EXXX values */ +#include /* for assertions */ + +wolf_error_t wolf_mutex_init( wolf_mutex_t *mutex ) { + pthread_mutexattr_t attr; + int res; + + /* intialize mutex attribute object */ + res = pthread_mutexattr_init( &attr ); + if( res == ENOMEM ) { + return WOLF_ERR_OUT_OF_MEMORY; + } else if( res == EINVAL ) { + return WOLF_ERR_INVALID_VALUE; + } else if( res != 0 ) { + return WOLF_ERR_INTERNAL; + } + + /* set default values */ + res = pthread_mutexattr_settype( &attr, WOLF_MUTEX_DEFAULT_ATTR ); + if( res != 0 ) { + res = pthread_mutexattr_destroy( &attr ); + assert( res == 0 ); + return WOLF_ERR_INTERNAL; + } + + /* initialize the mutex */ + res = pthread_mutex_init( mutex, &attr ); + if( res == ENOMEM ) { + return WOLF_ERR_OUT_OF_MEMORY; + } else if( res == EINVAL ) { + return WOLF_ERR_INVALID_VALUE; + } else if( res != 0 ) { + return WOLF_ERR_INTERNAL; + } + + /* destroy mutex attributes */ + res = pthread_mutexattr_destroy( &attr ); + assert( res == 0 ); + + return WOLF_OK; +} + +wolf_error_t wolf_mutex_destroy( wolf_mutex_t *mutex ) { + int res; + + res = pthread_mutex_destroy( mutex ); + if( res == EINVAL ) { + return WOLF_ERR_INVALID_VALUE; + } else if( res != 0 ) { + return WOLF_ERR_INTERNAL; + } + + return WOLF_OK; +} + +#endif /* defined HAVE_PTHREADS */ + +#if defined _WIN32 + +wolf_error_t wolf_mutex_init( wolf_mutex_t *mutex ) { + InitializeCriticalSection( mutex ); + return WOLF_OK; +} + +wolf_error_t wolf_mutex_destroy( wolf_mutex_t *mutex ) { + DeleteCriticalSection( mutex ); + return WOLF_OK; +} + +#endif /* defined _WIN32 */ -- cgit v1.2.3-54-g00ecf