gravatar
deba@inf.elte.hu
deba@inf.elte.hu
Thread safe map construction and destruction (#223) It currently support pthread and windows threads.
0 7 1
default
8 files changed with 124 insertions and 1 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2012
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_BITS_LOCK_H
20
#define LEMON_BITS_LOCK_H
21

	
22
#include <lemon/config.h>
23
#if defined(LEMON_USE_PTHREAD)
24
#include <pthread.h>
25
#elif defined(LEMON_USE_WIN32_THREADS)
26
#include <lemon/bits/windows.h>
27
#endif
28

	
29
namespace lemon {
30
  namespace bits {
31

	
32
#if defined(LEMON_USE_PTHREAD)
33
    class Lock {
34
    public:
35
      Lock() {
36
	pthread_mutex_init(&_lock, 0);
37
      }
38
      ~Lock() {
39
	pthread_mutex_destroy(&_lock);
40
      }
41
      void lock() {
42
	pthread_mutex_lock(&_lock);
43
      }
44
      void unlock() {
45
	pthread_mutex_unlock(&_lock);
46
      }
47

	
48
    private:
49
      pthread_mutex_t _lock;
50
    };
51
#elif defined(LEMON_USE_WIN32_THREADS)
52
    class Lock : public WinLock {};
53
#else
54
    class Lock {
55
    public:
56
      Lock() {}
57
      ~Lock() {}
58
      void lock() {}
59
      void unlock() {}
60
    };    
61
#endif
62
  }
63
}
64

	
65
#endif
Ignore white space 6 line context
... ...
@@ -114,6 +114,10 @@
114 114
CHECK_TYPE_SIZE("long long" LONG_LONG)
115 115
SET(LEMON_HAVE_LONG_LONG ${HAVE_LONG_LONG})
116 116

	
117
INCLUDE(FindThreads)
118
SET(LEMON_USE_PTHREAD ${CMAKE_USE_PTHREADS_INIT})
119
SET(LEMON_USE_WIN32_THREADS ${CMAKE_USE_WIN32_THREADS_INIT})
120

	
117 121
ENABLE_TESTING()
118 122

	
119 123
IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer")
Ignore white space 6 line context
... ...
@@ -138,6 +138,7 @@
138 138
	lemon/bits/enable_if.h \
139 139
	lemon/bits/graph_adaptor_extender.h \
140 140
	lemon/bits/graph_extender.h \
141
	lemon/bits/lock.h \
141 142
	lemon/bits/map_extender.h \
142 143
	lemon/bits/path_dump.h \
143 144
	lemon/bits/solver_bits.h \
Ignore white space 6 line context
... ...
@@ -23,6 +23,7 @@
23 23
#include <list>
24 24

	
25 25
#include <lemon/core.h>
26
#include <lemon/bits/lock.h>
26 27

	
27 28
//\ingroup graphbits
28 29
//\file
... ...
@@ -251,7 +252,7 @@
251 252

	
252 253
    typedef std::list<ObserverBase*> Observers;
253 254
    Observers _observers;
254

	
255
    lemon::bits::Lock _lock;
255 256

	
256 257
  public:
257 258

	
... ...
@@ -332,14 +333,18 @@
332 333
  protected:
333 334

	
334 335
    void attach(ObserverBase& observer) {
336
      _lock.lock();
335 337
      observer._index = _observers.insert(_observers.begin(), &observer);
336 338
      observer._notifier = this;
339
      _lock.unlock();
337 340
    }
338 341

	
339 342
    void detach(ObserverBase& observer) {
343
      _lock.lock();
340 344
      _observers.erase(observer._index);
341 345
      observer._index = _observers.end();
342 346
      observer._notifier = 0;
347
      _lock.unlock();
343 348
    }
344 349

	
345 350
  public:
Ignore white space 6 line context
... ...
@@ -130,5 +130,35 @@
130 130
      return getpid() + tv.tv_sec + tv.tv_usec;
131 131
#endif
132 132
    }
133

	
134
    WinLock::WinLock() {
135
#ifdef WIN32
136
      CRITICAL_SECTION *lock = new CRITICAL_SECTION;
137
      InitializeCriticalSection(lock);
138
      _repr = lock;
139
#endif
140
    }
141
    
142
    WinLock::~WinLock() {
143
#ifdef WIN32
144
      CRITICAL_SECTION *lock = static_cast<CRITICAL_SECTION*>(_repr);
145
      DeleteCriticalSection(lock);
146
      delete lock;
147
#endif
148
    }
149

	
150
    void WinLock::lock() {
151
#ifdef WIN32
152
      CRITICAL_SECTION *lock = static_cast<CRITICAL_SECTION*>(_repr);
153
      EnterCriticalSection(lock);
154
#endif
155
    }
156

	
157
    void WinLock::unlock() {
158
#ifdef WIN32
159
      CRITICAL_SECTION *lock = static_cast<CRITICAL_SECTION*>(_repr);
160
      LeaveCriticalSection(lock);
161
#endif
162
    }
133 163
  }
134 164
}
Ignore white space 6 line context
... ...
@@ -28,6 +28,16 @@
28 28
                         double &cutime, double &cstime);
29 29
    std::string getWinFormattedDate();
30 30
    int getWinRndSeed();
31

	
32
    class WinLock {
33
    public:
34
      WinLock();
35
      ~WinLock();
36
      void lock();
37
      void unlock();
38
    private:
39
      void *_repr;
40
    };
31 41
  }
32 42
}
33 43

	
Ignore white space 6 line context
... ...
@@ -6,3 +6,5 @@
6 6
#cmakedefine LEMON_HAVE_CPLEX 1
7 7
#cmakedefine LEMON_HAVE_CLP 1
8 8
#cmakedefine LEMON_HAVE_CBC 1
9
#cmakedefine LEMON_USE_PTHREAD 1
10
#cmakedefine LEMON_USE_WIN32_THREADS 1
Ignore white space 6 line context
... ...
@@ -24,3 +24,9 @@
24 24

	
25 25
/* Define to 1 if you have CBC */
26 26
#undef LEMON_HAVE_CBC
27

	
28
/* Define to 1 if you have pthread */
29
#undef LEMON_USE_PTHREAD
30

	
31
/* Define to 1 if you have win32 threads */
32
#undef LEMON_USE_WIN32_THREADS
0 comments (0 inline)