| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383 |
- // -*- C++ -*-
- // Copyright (C) 2010-2015, Vaclav Haisman. All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without modifica-
- // tion, are permitted provided that the following conditions are met:
- //
- // 1. Redistributions of source code must retain the above copyright notice,
- // this list of conditions and the following disclaimer.
- //
- // 2. Redistributions in binary form must reproduce the above copyright notice,
- // this list of conditions and the following disclaimer in the documentation
- // and/or other materials provided with the distribution.
- //
- // THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
- // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- // APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
- // DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- // OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- #ifndef LOG4CPLUS_THREAD_SYNCPRIMS_H
- #define LOG4CPLUS_THREAD_SYNCPRIMS_H
- #include <log4cplus/config.hxx>
- #if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
- #pragma once
- #endif
- namespace log4cplus { namespace thread {
- template <typename SyncPrim>
- class SyncGuard
- {
- public:
- SyncGuard ();
- SyncGuard (SyncPrim const &);
- ~SyncGuard ();
- void lock ();
- void unlock ();
- void attach (SyncPrim const &);
- void attach_and_lock (SyncPrim const &);
- void detach ();
- private:
- SyncPrim const * sp;
- SyncGuard (SyncGuard const &);
- SyncGuard & operator = (SyncGuard const &);
- };
- class ManualResetEvent;
- class MutexImplBase
- {
- protected:
- ~MutexImplBase ();
- };
- class LOG4CPLUS_EXPORT Mutex
- {
- public:
- enum Type
- {
- DEFAULT,
- RECURSIVE
- };
- explicit Mutex (Type = RECURSIVE);
- ~Mutex ();
- void lock () const;
- void unlock () const;
- private:
- MutexImplBase * mtx;
- Mutex (Mutex const &);
- Mutex & operator = (Mutex &);
- };
- typedef SyncGuard<Mutex> MutexGuard;
- class SemaphoreImplBase
- {
- protected:
- ~SemaphoreImplBase ();
- };
- class LOG4CPLUS_EXPORT Semaphore
- {
- public:
- Semaphore (unsigned max, unsigned initial);
- ~Semaphore ();
- void lock () const;
- void unlock () const;
- private:
- SemaphoreImplBase * sem;
- Semaphore (Semaphore const &);
- Semaphore & operator = (Semaphore const &);
- };
- typedef SyncGuard<Semaphore> SemaphoreGuard;
- class FairMutexImplBase
- {
- protected:
- ~FairMutexImplBase ();
- };
- class LOG4CPLUS_EXPORT FairMutex
- {
- public:
- FairMutex ();
- ~FairMutex ();
- void lock () const;
- void unlock () const;
- private:
- FairMutexImplBase * mtx;
- FairMutex (FairMutex const &);
- FairMutex & operator = (FairMutex &);
- };
- typedef SyncGuard<FairMutex> FairMutexGuard;
- class ManualResetEventImplBase
- {
- protected:
- ~ManualResetEventImplBase ();
- };
- class LOG4CPLUS_EXPORT ManualResetEvent
- {
- public:
- ManualResetEvent (bool = false);
- ~ManualResetEvent ();
- void signal () const;
- void wait () const;
- bool timed_wait (unsigned long msec) const;
- void reset () const;
- private:
- ManualResetEventImplBase * ev;
- ManualResetEvent (ManualResetEvent const &);
- ManualResetEvent & operator = (ManualResetEvent const &);
- };
- class SharedMutexImplBase
- {
- protected:
- ~SharedMutexImplBase ();
- };
- template <typename SyncPrim, void (SyncPrim:: * lock_func) () const,
- void (SyncPrim:: * unlock_func) () const>
- class SyncGuardFunc
- {
- public:
- SyncGuardFunc (SyncPrim const &);
- ~SyncGuardFunc ();
- void lock ();
- void unlock ();
- void attach (SyncPrim const &);
- void detach ();
- private:
- SyncPrim const * sp;
- SyncGuardFunc (SyncGuardFunc const &);
- SyncGuardFunc & operator = (SyncGuardFunc const &);
- };
- class LOG4CPLUS_EXPORT SharedMutex
- {
- public:
- SharedMutex ();
- ~SharedMutex ();
- void rdlock () const;
- void rdunlock () const;
- void wrlock () const;
- void wrunlock () const;
- private:
- SharedMutexImplBase * sm;
- SharedMutex (SharedMutex const &);
- SharedMutex & operator = (SharedMutex const &);
- };
- typedef SyncGuardFunc<SharedMutex, &SharedMutex::rdlock,
- &SharedMutex::rdunlock> SharedMutexReaderGuard;
- typedef SyncGuardFunc<SharedMutex, &SharedMutex::wrlock,
- &SharedMutex::wrunlock> SharedMutexWriterGuard;
- //
- //
- //
- template <typename SyncPrim>
- inline
- SyncGuard<SyncPrim>::SyncGuard ()
- : sp (0)
- { }
- template <typename SyncPrim>
- inline
- SyncGuard<SyncPrim>::SyncGuard (SyncPrim const & m)
- : sp (&m)
- {
- sp->lock ();
- }
- template <typename SyncPrim>
- inline
- SyncGuard<SyncPrim>::~SyncGuard ()
- {
- if (sp)
- sp->unlock ();
- }
- template <typename SyncPrim>
- inline
- void
- SyncGuard<SyncPrim>::lock ()
- {
- sp->lock ();
- }
- template <typename SyncPrim>
- inline
- void
- SyncGuard<SyncPrim>::unlock ()
- {
- sp->unlock ();
- }
- template <typename SyncPrim>
- inline
- void
- SyncGuard<SyncPrim>::attach (SyncPrim const & m)
- {
- sp = &m;
- }
- template <typename SyncPrim>
- inline
- void
- SyncGuard<SyncPrim>::attach_and_lock (SyncPrim const & m)
- {
- attach (m);
- try
- {
- lock();
- }
- catch (...)
- {
- detach ();
- throw;
- }
- }
- template <typename SyncPrim>
- inline
- void
- SyncGuard<SyncPrim>::detach ()
- {
- sp = 0;
- }
- //
- //
- //
- template <typename SyncPrim, void (SyncPrim:: * lock_func) () const,
- void (SyncPrim:: * unlock_func) () const>
- inline
- SyncGuardFunc<SyncPrim, lock_func, unlock_func>::SyncGuardFunc (SyncPrim const & m)
- : sp (&m)
- {
- (sp->*lock_func) ();
- }
- template <typename SyncPrim, void (SyncPrim:: * lock_func) () const,
- void (SyncPrim:: * unlock_func) () const>
- inline
- SyncGuardFunc<SyncPrim, lock_func, unlock_func>::~SyncGuardFunc ()
- {
- if (sp)
- (sp->*unlock_func) ();
- }
- template <typename SyncPrim, void (SyncPrim:: * lock_func) () const,
- void (SyncPrim:: * unlock_func) () const>
- inline
- void
- SyncGuardFunc<SyncPrim, lock_func, unlock_func>::lock ()
- {
- (sp->*lock_func) ();
- }
- template <typename SyncPrim, void (SyncPrim:: * lock_func) () const,
- void (SyncPrim:: * unlock_func) () const>
- inline
- void
- SyncGuardFunc<SyncPrim, lock_func, unlock_func>::unlock ()
- {
- (sp->*unlock_func) ();
- }
- template <typename SyncPrim, void (SyncPrim:: * lock_func) () const,
- void (SyncPrim:: * unlock_func) () const>
- inline
- void
- SyncGuardFunc<SyncPrim, lock_func, unlock_func>::attach (SyncPrim const & m)
- {
- sp = &m;
- }
- template <typename SyncPrim, void (SyncPrim:: * lock_func) () const,
- void (SyncPrim:: * unlock_func) () const>
- inline
- void
- SyncGuardFunc<SyncPrim, lock_func, unlock_func>::detach ()
- {
- sp = 0;
- }
- } } // namespace log4cplus { namespace thread {
- #endif // LOG4CPLUS_THREAD_SYNCPRIMS_H
|