/* 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 "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 */