Panda3D
Loading...
Searching...
No Matches
reMutexDirect.h
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file reMutexDirect.h
10 * @author drose
11 * @date 2006-02-13
12 */
13
14#ifndef REMUTEXDIRECT_H
15#define REMUTEXDIRECT_H
16
17#include "pandabase.h"
18#include "mutexTrueImpl.h"
19#include "conditionVarImpl.h"
20#include "thread.h"
21
22#ifndef DEBUG_THREADS
23
24/**
25 * This class implements a standard reMutex by making direct calls to the
26 * underlying implementation layer. It doesn't perform any debugging
27 * operations.
28 */
29class EXPCL_PANDA_PIPELINE ReMutexDirect {
30protected:
31 INLINE ReMutexDirect();
32 ReMutexDirect(const ReMutexDirect &copy) = delete;
33 ~ReMutexDirect() = default;
34
35 void operator = (const ReMutexDirect &copy) = delete;
36
37public:
38 INLINE void lock();
39 INLINE bool try_lock();
40 INLINE void unlock();
41
42PUBLISHED:
43 BLOCKING INLINE void acquire() const;
44 BLOCKING INLINE void acquire(Thread *current_thread) const;
45 BLOCKING INLINE bool try_acquire() const;
46 BLOCKING INLINE bool try_acquire(Thread *current_thread) const;
47 INLINE void elevate_lock() const;
48 INLINE void release() const;
49
50 INLINE bool debug_is_locked() const;
51
52 INLINE void set_name(const std::string &name);
53 INLINE void clear_name();
54 INLINE bool has_name() const;
55 INLINE std::string get_name() const;
56
57 void output(std::ostream &out) const;
58
59private:
60#ifdef HAVE_REMUTEXTRUEIMPL
61 mutable ReMutexTrueImpl _impl;
62
63#else
64 // If we don't have a reentrant mutex, we have to hand-roll one.
65 INLINE void do_lock();
66 void do_lock(Thread *current_thread);
67 INLINE bool do_try_lock();
68 bool do_try_lock(Thread *current_thread);
69 void do_elevate_lock();
70 void do_unlock(Thread *current_thread = Thread::get_current_thread());
71
72 Thread *_locking_thread;
73 int _lock_count;
74
75 MutexTrueImpl _lock_impl;
76 ConditionVarImpl _cvar_impl;
77#endif // HAVE_REMUTEXTRUEIMPL
78
79 friend class LightReMutexDirect;
80};
81
82INLINE std::ostream &
83operator << (std::ostream &out, const ReMutexDirect &m) {
84 m.output(out);
85 return out;
86}
87
88#include "reMutexDirect.I"
89
90#endif // !DEBUG_THREADS
91
92#endif
This class implements a standard lightReMutex by making direct calls to the underlying implementation...
A fake mutex implementation for single-threaded applications that don't need any synchronization cont...
This class implements a standard reMutex by making direct calls to the underlying implementation laye...
void output(std::ostream &out) const
This method is declared virtual in MutexDebug, but non-virtual in ReMutexDirect.
A thread; that is, a lightweight process.
Definition thread.h:46
get_current_thread
Returns a pointer to the currently-executing Thread object.
Definition thread.h:109
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.