CV_EXPORTS void parallel_for_(const Range& range, const ParallelLoopBody& body);
+/////////////////////////// Synchronization Primitives ///////////////////////////////
+
+class CV_EXPORTS Mutex
+{
+public:
+ Mutex();
+ ~Mutex();
+ Mutex(const Mutex& m);
+ Mutex& operator = (const Mutex& m);
+
+ void lock();
+ bool trylock();
+ void unlock();
+
+ struct Impl;
+protected:
+ Impl* impl;
+};
+
+class CV_EXPORTS AutoLock
+{
+public:
+ AutoLock(Mutex& m) : mutex(&m) { mutex->lock(); }
+ ~AutoLock() { mutex->unlock(); }
+protected:
+ Mutex* mutex;
+};
+
}
#endif // __cplusplus
}
#endif
+namespace cv
+{
+
+#if defined WIN32 || defined _WIN32 || defined WINCE
+
+struct Mutex::Impl
+{
+ Impl() { InitializeCriticalSection(&cs); refcount = 1; }
+ ~Impl() { DeleteCriticalSection(&cs); }
+
+ void lock() { EnterCriticalSection(&cs); }
+ bool trylock() { return TryEnterCriticalSection(&cs) != 0; }
+ void unlock() { LeaveCriticalSection(&cs); }
+
+ CRITICAL_SECTION cs;
+ int refcount;
+};
+
+#elif defined __APPLE__
+
+#include <libkern/OSAtomic.h>
+
+struct Mutex::Impl
+{
+ Impl() { sl = OS_SPINLOCK_INIT; refcount = 1; }
+ ~Impl() {}
+
+ void lock() { OSSpinLockLock(&sl); }
+ bool trylock() { return OSSpinLockTry(&sl); }
+ void unlock() { OSSpinLockUnlock(&sl); }
+
+ OSSpinLock sl;
+ int refcount;
+};
+
+#elif defined __linux__
+
+struct Mutex::Impl
+{
+ Impl() { pthread_spin_init(&sl, 0); refcount = 1; }
+ ~Impl() { pthread_spin_destroy(&sl); }
+
+ void lock() { pthread_spin_lock(&sl); }
+ bool trylock() { return pthread_spin_trylock(&sl) == 0; }
+ void unlock() { pthread_spin_unlock(&sl); }
+
+ pthread_spinlock_t sl;
+ int refcount;
+};
+
+#else
+
+struct Mutex::Impl
+{
+ Impl() { pthread_mutex_init(&sl, 0); refcount = 1; }
+ ~Impl() { pthread_mutex_destroy(&sl); }
+
+ void lock() { pthread_mutex_lock(&sl); }
+ bool trylock() { return pthread_mutex_trylock(&sl) == 0; }
+ void unlock() { pthread_mutex_unlock(&sl); }
+
+ pthread_mutex_t sl;
+ int refcount;
+};
+
+#endif
+
+Mutex::Mutex()
+{
+ impl = new Mutex::Impl;
+}
+
+Mutex::~Mutex()
+{
+ if( CV_XADD(&impl->refcount, -1) == 1 )
+ delete impl;
+ impl = 0;
+}
+
+Mutex::Mutex(const Mutex& m)
+{
+ impl = m.impl;
+ CV_XADD(&impl->refcount, 1);
+}
+
+Mutex& Mutex::operator = (const Mutex& m)
+{
+ CV_XADD(&m.impl->refcount, 1);
+ if( CV_XADD(&impl->refcount, -1) == 1 )
+ delete impl;
+ impl = m.impl;
+ return *this;
+}
+
+void Mutex::lock() { impl->lock(); }
+void Mutex::unlock() { impl->unlock(); }
+bool Mutex::trylock() { return impl->trylock(); }
+
+}
+
/* End of file. */
\ No newline at end of file