-XBT_PUBLIC_CLASS Mutex {
-friend ConditionVariable;
-private:
- friend simgrid::simix::Mutex;
- simgrid::simix::Mutex* mutex_;
- Mutex(simgrid::simix::Mutex* mutex) : mutex_(mutex) {}
+class XBT_PUBLIC Mutex {
+#ifndef DOXYGEN
+ friend ConditionVariable;
+ friend kernel::activity::MutexImpl;
+ friend void kernel::activity::intrusive_ptr_release(kernel::activity::MutexImpl* mutex);
+#endif
+
+ kernel::activity::MutexImpl* const pimpl_;
+ /* refcounting */
+ friend XBT_PUBLIC void intrusive_ptr_add_ref(const Mutex* mutex);
+ friend XBT_PUBLIC void intrusive_ptr_release(const Mutex* mutex);
+
+ explicit Mutex(kernel::activity::MutexImpl* mutex) : pimpl_(mutex) {}
+ ~Mutex() = default;
+#ifndef DOXYGEN
+ Mutex(Mutex const&) = delete; // No copy constructor; Use MutexPtr instead
+ Mutex& operator=(Mutex const&) = delete; // No direct assignment either. Use MutexPtr instead
+#endif