diff options
author | Andreas Baumann <abaumann@yahoo.com> | 2009-03-31 13:44:17 +0200 |
---|---|---|
committer | Andreas Baumann <abaumann@yahoo.com> | 2009-03-31 13:44:17 +0200 |
commit | d2b0696d8fa0ce47e0bc525581b6b9254637984b (patch) | |
tree | 1c969b1005256bb47e1791ca919497f3276d00b6 /src/threads | |
parent | 038f9a5b1197b4f92c85d0c7d2cfd672589c2231 (diff) | |
download | wolfbones-d2b0696d8fa0ce47e0bc525581b6b9254637984b.tar.gz wolfbones-d2b0696d8fa0ce47e0bc525581b6b9254637984b.tar.bz2 |
created subdir for threading stuff, moved mutex there
Diffstat (limited to 'src/threads')
-rw-r--r-- | src/threads/mutex.c | 92 |
1 files changed, 92 insertions, 0 deletions
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 <abaumann@yahoo.com> + + 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 <http://www.gnu.org/licenses/>. +*/ + +#include "errors.h" +#include "threads/mutex.h" + +#if defined HAVE_PTHREADS + +#include <errno.h> /* for EXXX values */ +#include <assert.h> /* 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 */ |