home *** CD-ROM | disk | FTP | other *** search
/ Beginning C++ Through Gam…rogramming (2nd Edition) / BCGP2E.ISO / bloodshed / devcpp-4.9.9.2_setup.exe / concurrence.h < prev    next >
C/C++ Source or Header  |  2005-01-29  |  3KB  |  96 lines

  1. // Support for concurrent programing -*- C++ -*-
  2.  
  3. // Copyright (C) 2003, 2004
  4. // Free Software Foundation, Inc.
  5. //
  6. // This file is part of the GNU ISO C++ Library.  This library is free
  7. // software; you can redistribute it and/or modify it under the
  8. // terms of the GNU General Public License as published by the
  9. // Free Software Foundation; either version 2, or (at your option)
  10. // any later version.
  11.  
  12. // This library is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. // GNU General Public License for more details.
  16.  
  17. // You should have received a copy of the GNU General Public License along
  18. // with this library; see the file COPYING.  If not, write to the Free
  19. // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  20. // USA.
  21.  
  22. // As a special exception, you may use this file as part of a free software
  23. // library without restriction.  Specifically, if other files instantiate
  24. // templates or use macros or inline functions from this file, or you compile
  25. // this file and link it with other files to produce an executable, this
  26. // file does not by itself cause the resulting executable to be covered by
  27. // the GNU General Public License.  This exception does not however
  28. // invalidate any other reasons why the executable file might be covered by
  29. // the GNU General Public License.
  30.  
  31. #ifndef _CONCURRENCE_H
  32. #define _CONCURRENCE_H 1
  33.  
  34. // GCC's thread abstraction layer
  35. #include "bits/gthr.h"
  36.  
  37. #if __GTHREADS
  38.  
  39. # ifdef __GTHREAD_MUTEX_INIT
  40. #  define __glibcxx_mutex_type __gthread_mutex_t
  41. #  define __glibcxx_mutex_define_initialized(NAME) \
  42. __gthread_mutex_t NAME = __GTHREAD_MUTEX_INIT
  43. #  define __glibcxx_mutex_lock(NAME) \
  44. __gthread_mutex_lock(&NAME)
  45. # else
  46. // Implies __GTHREAD_MUTEX_INIT_FUNCTION
  47. struct __glibcxx_mutex : public __gthread_mutex_t
  48. {
  49.    __glibcxx_mutex() { __GTHREAD_MUTEX_INIT_FUNCTION(this); }
  50. };
  51.  
  52. #  define __glibcxx_mutex_type __glibcxx_mutex
  53. #  define __glibcxx_mutex_define_initialized(NAME) \
  54. __glibcxx_mutex NAME
  55. # define __glibcxx_mutex_lock(NAME) \
  56. __gthread_mutex_lock(&NAME)
  57. # endif
  58.  
  59. # define __glibcxx_mutex_unlock(NAME) __gthread_mutex_unlock(&NAME)
  60.  
  61. #else
  62.  
  63. # define __glibcxx_mutex_type __gthread_mutex_t
  64. # define __glibcxx_mutex_define_initialized(NAME) __gthread_mutex_t NAME
  65. # define __glibcxx_mutex_lock(NAME)
  66. # define __glibcxx_mutex_unlock(NAME)
  67.  
  68. #endif
  69.  
  70. namespace __gnu_cxx
  71. {
  72.   typedef __glibcxx_mutex_type mutex_type;
  73.   
  74.   // Scoped lock idiom.
  75.   // Acquire the mutex here with a constructor call, then release with
  76.   // the destructor call in accordance with RAII style.
  77.    class lock
  78.   {
  79.     // Externally defined and initialized.
  80.     mutex_type& device;
  81.  
  82.   public:
  83.     explicit lock(mutex_type& name) : device(name)
  84.     { __glibcxx_mutex_lock(device); }
  85.  
  86.     ~lock() throw()
  87.     { __glibcxx_mutex_unlock(device); }
  88.  
  89.   private:
  90.     lock(const lock&);
  91.     lock& operator=(const lock&);
  92.   };
  93. }
  94.  
  95. #endif
  96.