- XBT_IN("(%p; %p)", this, issuer);
- /* FIXME: check where to validate the arguments */
- RawImplPtr synchro = nullptr;
-
- if (locked_) {
- /* FIXME: check if the host is active ? */
- /* Somebody using the mutex, use a synchronization to get host failures */
- synchro = RawImplPtr(new RawImpl());
- (*synchro).set_host(issuer->get_host()).start();
- synchro->simcalls_.push_back(&issuer->simcall);
- issuer->waiting_synchro = synchro;
- sleeping_.push_back(*issuer);
+ xbt_assert(mutex_->owner_ != nullptr); // it was locked either by someone else or by me during the lock_async
+ xbt_assert(issuer == issuer_, "Cannot wait on acquisitions created by another actor (id %ld)", issuer_->get_pid());
+ xbt_assert(timeout < 0, "Timeouts on mutex acquisitions are not implemented yet.");
+
+ this->register_simcall(&issuer_->simcall_); // Block on that acquisition
+
+ if (mutex_->get_owner() == issuer_) { // I'm the owner
+ finish();
+ } else {
+ // Already in the queue
+ }
+}
+void MutexAcquisitionImpl::finish()
+{
+ xbt_assert(simcalls_.size() == 1, "Unexpected number of simcalls waiting: %zu", simcalls_.size());
+ simix::Simcall* simcall = simcalls_.front();
+ simcalls_.pop_front();
+
+ simcall->issuer_->waiting_synchro_ = nullptr;
+ simcall->issuer_->simcall_answer();
+}
+
+/* -------- Mutex -------- */
+
+unsigned MutexImpl::next_id_ = 0;
+
+MutexAcquisitionImplPtr MutexImpl::lock_async(actor::ActorImpl* issuer)
+{
+ auto res = MutexAcquisitionImplPtr(new kernel::activity::MutexAcquisitionImpl(issuer, this), true);
+
+ if (owner_ != nullptr) {
+ /* Somebody is using the mutex; register the acquisition */
+ ongoing_acquisitions_.push_back(res);