Mercurial > hg > octave-lyh
diff liboctave/oct-mutex.cc @ 7934:5a156ab94dd2
Add octave_mutex class
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 16 Jul 2008 14:26:18 -0400 |
parents | |
children | 7b8aca1cdf0a |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/liboctave/oct-mutex.cc @@ -0,0 +1,131 @@ +/* + +Copyright (C) 2008 Michael Goffioul + +This file is part of Octave. + +Octave 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. + +Octave 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 Octave; see the file COPYING. If not, see +<http://www.gnu.org/licenses/>. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "oct-mutex.h" +#include "error.h" + +#if defined (HAVE_PTHREAD_H) +#include <pthread.h> +#endif + +#if defined (__WIN32__) && ! defined (__CYGWIN__) +#include <windows.h> +#endif + +class +octave_default_mutex : public octave_mutex +{ +public: + octave_default_mutex (void) + : octave_mutex (-1) { } + + void lock (void) + { error ("mutex not supported on this platform"); } + + void unlock(void) + { error ("mutex not supported on this platform"); } +}; + +#if defined (__WIN32__) && ! defined (__CYGWIN__) + +class +octave_w32_mutex : public octave_mutex +{ +public: + octave_w32_mutex (void) + : octave_mutex (-1) + { + InitializeCriticalSection (&cs); + } + + ~octave_w32_mutex (void) + { + DeleteCriticalSection (&cs); + } + + void lock (void) + { + EnterCriticalSection (&cs); + } + + void unlock (void) + { + LeaveCriticalSection (&cs); + } + +private: + CRITICAL_SECTION cs; +}; + +#elif defined (HAVE_PTHREAD_H) + +class +octave_pthread_mutex : public octave_mutex +{ +public: + octave_pthread_mutex (void) + : octave_mutex (-1) + { + pthread_mutexattr_t attr; + + pthread_mutexattr_init (&attr); + pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init (&pm, &attr); + pthread_mutexattr_destroy (&attr); + } + + ~octave_pthread_mutex (void) + { + pthread_mutex_destroy (&pm); + } + + void lock (void) + { + pthread_mutex_lock (&pm); + } + + void unlock (void) + { + pthread_mutex_unlock (&pm); + } + +private: + pthread_mutex_t pm; +}; + +#endif + +octave_mutex::octave_mutex (void) +{ +#if defined (__WIN32__) && ! defined (__CYGWIN__) + rep = new octave_w32_mutex (); +#elif defined (HAVE_PTHREAD_H) + rep = new octave_pthread_mutex (); +#else + rep = new octave_default_mutex (); +#endif + rep->count++; +}