| [148] | 1 | /*------------------------------------------------------------------------- | 
|---|
 | 2 | This source file is a part of OGRE | 
|---|
 | 3 | (Object-oriented Graphics Rendering Engine) | 
|---|
 | 4 |  | 
|---|
 | 5 | For the latest info, see http://www.ogre3d.org/ | 
|---|
 | 6 |  | 
|---|
 | 7 | Copyright (c) 2000-2013 Torus Knot Software Ltd | 
|---|
 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy | 
|---|
 | 9 | of this software and associated documentation files (the "Software"), to deal | 
|---|
 | 10 | in the Software without restriction, including without limitation the rights | 
|---|
 | 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
|---|
 | 12 | copies of the Software, and to permit persons to whom the Software is | 
|---|
 | 13 | furnished to do so, subject to the following conditions: | 
|---|
 | 14 |  | 
|---|
 | 15 | The above copyright notice and this permission notice shall be included in | 
|---|
 | 16 | all copies or substantial portions of the Software. | 
|---|
 | 17 |  | 
|---|
 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
|---|
 | 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
|---|
 | 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
|---|
 | 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
|---|
 | 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
|---|
 | 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 
|---|
 | 24 | THE SOFTWARE | 
|---|
 | 25 | -------------------------------------------------------------------------*/ | 
|---|
 | 26 | #ifndef __OgreThreadDefinesBoost_H__ | 
|---|
 | 27 | #define __OgreThreadDefinesBoost_H__ | 
|---|
 | 28 |  | 
|---|
 | 29 | #define OGRE_TOKEN_PASTE(x, y) x ## y | 
|---|
 | 30 | #define OGRE_TOKEN_PASTE_EXTRA(x, y) OGRE_TOKEN_PASTE(x, y) | 
|---|
 | 31 |  | 
|---|
 | 32 | #if BOOST_THREAD_VERSION < 4 | 
|---|
 | 33 | #define OGRE_LOCK_AUTO_MUTEX boost::recursive_mutex::scoped_lock ogreAutoMutexLock(OGRE_AUTO_MUTEX_NAME) | 
|---|
 | 34 | #define OGRE_LOCK_MUTEX(name) boost::recursive_mutex::scoped_lock OGRE_TOKEN_PASTE_EXTRA(ogrenameLock, __LINE__) (name) | 
|---|
 | 35 | #define OGRE_LOCK_MUTEX_NAMED(mutexName, lockName) boost::recursive_mutex::scoped_lock lockName(mutexName) | 
|---|
 | 36 | #define OGRE_THREAD_SYNCHRONISER(sync) boost::condition sync | 
|---|
 | 37 | #define OGRE_THREAD_SLEEP(ms) boost::this_thread::sleep(boost::posix_time::millisec(ms)) | 
|---|
 | 38 | #else | 
|---|
 | 39 | #define OGRE_LOCK_AUTO_MUTEX boost::unique_lock<boost::recursive_mutex> ogreAutoMutexLock(OGRE_AUTO_MUTEX_NAME) | 
|---|
 | 40 | #define OGRE_LOCK_MUTEX(name) boost::unique_lock<boost::recursive_mutex> OGRE_TOKEN_PASTE_EXTRA(ogrenameLock, __LINE__) (name) | 
|---|
 | 41 | #define OGRE_LOCK_MUTEX_NAMED(mutexName, lockName) boost::unique_lock<boost::recursive_mutex> lockName(mutexName) | 
|---|
 | 42 | #define OGRE_THREAD_SYNCHRONISER(sync) boost::condition_variable_any sync | 
|---|
 | 43 | #define OGRE_THREAD_SLEEP(ms) boost::this_thread::sleep_for(boost::chrono::milliseconds(ms)) | 
|---|
 | 44 | #endif | 
|---|
 | 45 |  | 
|---|
 | 46 | #define OGRE_AUTO_MUTEX mutable boost::recursive_mutex OGRE_AUTO_MUTEX_NAME | 
|---|
 | 47 | #define OGRE_MUTEX(name) mutable boost::recursive_mutex name | 
|---|
 | 48 | #define OGRE_STATIC_MUTEX(name) static boost::recursive_mutex name | 
|---|
 | 49 | #define OGRE_STATIC_MUTEX_INSTANCE(name) boost::recursive_mutex name | 
|---|
 | 50 | // like OGRE_AUTO_MUTEX but mutex held by pointer | 
|---|
 | 51 | #define OGRE_AUTO_SHARED_MUTEX mutable boost::recursive_mutex *OGRE_AUTO_MUTEX_NAME | 
|---|
 | 52 | #define OGRE_LOCK_AUTO_SHARED_MUTEX assert(OGRE_AUTO_MUTEX_NAME); boost::recursive_mutex::scoped_lock ogreAutoMutexLock(*OGRE_AUTO_MUTEX_NAME) | 
|---|
 | 53 | #define OGRE_NEW_AUTO_SHARED_MUTEX assert(!OGRE_AUTO_MUTEX_NAME); OGRE_AUTO_MUTEX_NAME = new boost::recursive_mutex() | 
|---|
 | 54 | #define OGRE_DELETE_AUTO_SHARED_MUTEX do { assert(OGRE_AUTO_MUTEX_NAME); delete OGRE_AUTO_MUTEX_NAME; } while (0) | 
|---|
 | 55 | #define OGRE_COPY_AUTO_SHARED_MUTEX(from) assert(!OGRE_AUTO_MUTEX_NAME); OGRE_AUTO_MUTEX_NAME = from | 
|---|
 | 56 | #define OGRE_SET_AUTO_SHARED_MUTEX_NULL OGRE_AUTO_MUTEX_NAME = 0 | 
|---|
 | 57 | #define OGRE_MUTEX_CONDITIONAL(mutex) if (mutex) | 
|---|
 | 58 | #define OGRE_THREAD_WAIT(sync, mutex, lock) sync.wait(lock) | 
|---|
 | 59 | #define OGRE_THREAD_NOTIFY_ONE(sync) sync.notify_one() | 
|---|
 | 60 | #define OGRE_THREAD_NOTIFY_ALL(sync) sync.notify_all() | 
|---|
 | 61 | // Read-write mutex | 
|---|
 | 62 | #define OGRE_RW_MUTEX(name) mutable boost::shared_mutex name | 
|---|
 | 63 | #define OGRE_LOCK_RW_MUTEX_READ(name) boost::shared_lock<boost::shared_mutex> ogrenameLock(name) | 
|---|
 | 64 | #define OGRE_LOCK_RW_MUTEX_WRITE(name) boost::unique_lock<boost::shared_mutex> ogrenameLock(name) | 
|---|
 | 65 | // Thread-local pointer | 
|---|
 | 66 | #define OGRE_THREAD_POINTER(T, var) boost::thread_specific_ptr<T> var | 
|---|
 | 67 | #define OGRE_THREAD_POINTER_INIT(var) var(&deletePtr) | 
|---|
 | 68 | #define OGRE_THREAD_POINTER_VAR(T, var) boost::thread_specific_ptr<T> var (&deletePtr<T>) | 
|---|
 | 69 | #define OGRE_THREAD_POINTER_SET(var, expr) var.reset(expr) | 
|---|
 | 70 | #define OGRE_THREAD_POINTER_GET(var) var.get() | 
|---|
 | 71 | #define OGRE_THREAD_POINTER_DELETE(var) var.reset(0) | 
|---|
 | 72 | // Thread objects and related functions | 
|---|
 | 73 | #define OGRE_THREAD_TYPE boost::thread | 
|---|
 | 74 | #define OGRE_THREAD_CREATE(name, worker) boost::thread* name = OGRE_NEW_T(boost::thread, MEMCATEGORY_GENERAL)(worker) | 
|---|
 | 75 | #define OGRE_THREAD_DESTROY(name) OGRE_DELETE_T(name, thread, MEMCATEGORY_GENERAL) | 
|---|
 | 76 | #define OGRE_THREAD_HARDWARE_CONCURRENCY boost::thread::hardware_concurrency() | 
|---|
 | 77 | #define OGRE_THREAD_CURRENT_ID boost::this_thread::get_id() | 
|---|
 | 78 | #define OGRE_THREAD_WORKER_INHERIT | 
|---|
 | 79 | // Utility | 
|---|
 | 80 | #define OGRE_THREAD_ID_TYPE boost::thread::id | 
|---|
 | 81 | #define OGRE_THREAD_YIELD boost::this_thread::yield() | 
|---|
 | 82 |  | 
|---|
 | 83 | #endif | 
|---|