XBT_ATTRIB_DEPRECATED_v330("Please use sg_mutex_init()") XBT_PUBLIC smx_mutex_t simcall_mutex_init();
XBT_PUBLIC void simcall_mutex_lock(smx_mutex_t mutex);
XBT_PUBLIC int simcall_mutex_trylock(smx_mutex_t mutex);
-XBT_PUBLIC void simcall_mutex_unlock(smx_mutex_t mutex);
+XBT_ATTRIB_DEPRECATED_v331("Please use s4u::Mutex::unlock()") XBT_PUBLIC void simcall_mutex_unlock(smx_mutex_t mutex);
XBT_ATTRIB_DEPRECATED_v330("Please use sg_cond_init()") XBT_PUBLIC smx_cond_t simcall_cond_init();
XBT_PUBLIC void simcall_cond_wait(smx_cond_t cond, smx_mutex_t mutex);
{
return mutex->try_lock(simcall->issuer_);
}
-
-void simcall_HANDLER_mutex_unlock(smx_simcall_t simcall, smx_mutex_t mutex)
-{
- mutex->unlock(simcall->issuer_);
-}
return next_value_;
}
+std::string MutexUnlockSimcall::to_string(int time_considered) const
+{
+ return SimcallInspector::to_string(time_considered) + "Mutex UNLOCK";
+}
+
+std::string MutexUnlockSimcall::dot_label() const
+{
+ return SimcallInspector::dot_label() + "Mutex UNLOCK";
+}
+
} // namespace mc
} // namespace simgrid
std::string dot_label() const override;
int get_value() const;
};
+
+class MutexUnlockSimcall : public SimcallInspector {
+ using SimcallInspector::SimcallInspector;
+
+public:
+ std::string to_string(int times_considered) const override;
+ std::string dot_label() const override;
+};
} // namespace mc
} // namespace simgrid
return req->call_ == Simcall::COMM_ISEND || req->call_ == Simcall::COMM_IRECV || req->call_ == Simcall::COMM_WAIT ||
req->call_ == Simcall::COMM_WAITANY || req->call_ == Simcall::COMM_TEST ||
req->call_ == Simcall::COMM_TESTANY || req->call_ == Simcall::MUTEX_LOCK ||
- req->call_ == Simcall::MUTEX_TRYLOCK || req->call_ == Simcall::MUTEX_UNLOCK;
+ req->call_ == Simcall::MUTEX_TRYLOCK;
}
}
#include "simgrid/mutex.h"
#include "simgrid/s4u/Mutex.hpp"
#include "src/kernel/activity/MutexImpl.hpp"
+#include "src/mc/checker/SimcallInspector.hpp"
namespace simgrid {
namespace s4u {
*/
void Mutex::unlock()
{
- simcall_mutex_unlock(pimpl_);
+ kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
+ mc::MutexUnlockSimcall observer{issuer};
+ kernel::actor::simcall([this, issuer] { this->pimpl_->unlock(issuer); }, &observer);
}
/** @brief Acquire the mutex if it's free, and return false (without blocking) if not */
* @ingroup simix_synchro_management
*
*/
-void simcall_mutex_unlock(smx_mutex_t mutex)
+void simcall_mutex_unlock(smx_mutex_t mutex) // XBT_ATTRIB_DEPRECATD_v331
{
- simcall_BODY_mutex_unlock(mutex);
+ mutex->mutex().unlock();
}
/**
simgrid::simix::marshal<int>(simcall->result_, result);
}
-static inline smx_mutex_t simcall_mutex_unlock__get__mutex(smx_simcall_t simcall)
-{
- return simgrid::simix::unmarshal<smx_mutex_t>(simcall->args_[0]);
-}
-static inline smx_mutex_t simcall_mutex_unlock__getraw__mutex(smx_simcall_t simcall)
-{
- return simgrid::simix::unmarshal_raw<smx_mutex_t>(simcall->args_[0]);
-}
-static inline void simcall_mutex_unlock__set__mutex(smx_simcall_t simcall, smx_mutex_t arg)
-{
- simgrid::simix::marshal<smx_mutex_t>(simcall->args_[0], arg);
-}
-
static inline smx_cond_t simcall_cond_wait__get__cond(smx_simcall_t simcall)
{
return simgrid::simix::unmarshal<smx_cond_t>(simcall->args_[0]);
XBT_PRIVATE void simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms, size_t count);
XBT_PRIVATE void simcall_HANDLER_mutex_lock(smx_simcall_t simcall, smx_mutex_t mutex);
XBT_PRIVATE int simcall_HANDLER_mutex_trylock(smx_simcall_t simcall, smx_mutex_t mutex);
-XBT_PRIVATE void simcall_HANDLER_mutex_unlock(smx_simcall_t simcall, smx_mutex_t mutex);
XBT_PRIVATE void simcall_HANDLER_cond_wait(smx_simcall_t simcall, smx_cond_t cond, smx_mutex_t mutex);
XBT_PRIVATE void simcall_HANDLER_cond_wait_timeout(smx_simcall_t simcall, smx_cond_t cond, smx_mutex_t mutex, double timeout);
XBT_PRIVATE void simcall_HANDLER_sem_acquire(smx_simcall_t simcall, smx_sem_t sem);
return simcall<int, smx_mutex_t>(Simcall::MUTEX_TRYLOCK, mutex);
}
-inline static void simcall_BODY_mutex_unlock(smx_mutex_t mutex)
-{
- if (false) /* Go to that function to follow the code flow through the simcall barrier */
- simcall_HANDLER_mutex_unlock(&SIMIX_process_self()->simcall_, mutex);
- return simcall<void, smx_mutex_t>(Simcall::MUTEX_UNLOCK, mutex);
-}
-
inline static void simcall_BODY_cond_wait(smx_cond_t cond, smx_mutex_t mutex)
{
if (false) /* Go to that function to follow the code flow through the simcall barrier */
COMM_TESTANY,
MUTEX_LOCK,
MUTEX_TRYLOCK,
- MUTEX_UNLOCK,
COND_WAIT,
COND_WAIT_TIMEOUT,
SEM_ACQUIRE,
RUN_BLOCKING,
};
-constexpr int NUM_SIMCALLS = 19;
+constexpr int NUM_SIMCALLS = 18;
} // namespace simix
} // namespace simgrid
"Simcall::COMM_TESTANY",
"Simcall::MUTEX_LOCK",
"Simcall::MUTEX_TRYLOCK",
- "Simcall::MUTEX_UNLOCK",
"Simcall::COND_WAIT",
"Simcall::COND_WAIT_TIMEOUT",
"Simcall::SEM_ACQUIRE",
simcall_answer();
break;
- case Simcall::MUTEX_UNLOCK:
- simcall_HANDLER_mutex_unlock(&simcall_, simgrid::simix::unmarshal<smx_mutex_t>(simcall_.args_[0]));
- simcall_answer();
- break;
-
case Simcall::COND_WAIT:
simcall_HANDLER_cond_wait(&simcall_, simgrid::simix::unmarshal<smx_cond_t>(simcall_.args_[0]), simgrid::simix::unmarshal<smx_mutex_t>(simcall_.args_[1]));
break;
void mutex_lock(smx_mutex_t mutex) [[block]];
int mutex_trylock(smx_mutex_t mutex);
-void mutex_unlock(smx_mutex_t mutex);
void cond_wait(smx_cond_t cond, smx_mutex_t mutex) [[block]];
int cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) [[block]];