#define DEBUGt(t) DEBUG() << "[" << t->vcpu() << "] "
+#define EVENT(event) \
+ do { \
+ Measurements::GenericEvent* ev = Romain::_the_instance_manager->logbuf()->next(); \
+ ev->header.tsc = Romain::_the_instance_manager->logbuf()->getTime(Log::logLocalTSC); \
+ ev->header.vcpu = (l4_uint32_t)t->vcpu(); \
+ ev->header.type = Measurements::Locking; \
+ ev->data.lock.eventType = event; \
+ } while (0)
+
Romain::PThreadLockObserver*
Romain::PThreadLockObserver::Create()
{ return new PThreadLock_priv(); }
+namespace Romain {
+ extern InstanceManager* _the_instance_manager;
+}
void Romain::PThreadLock_priv::status() const
{
_locks[lock] = new PThreadMutex(false /*XXX*/);
t->vcpu()->r()->ax = 0;
- t->vcpu()->r()->sp += sizeof(l4_umword_t);
- t->vcpu()->r()->ip = ret;
+ t->return_to(ret);
}
l4_umword_t ret = *(l4_umword_t*)stack;
l4_umword_t lock = t->vcpu()->r()->ax;
+ EVENT(Measurements::LockEvent::lock);
+
DEBUG() << "Stack ptr " << std::hex << t->vcpu()->r()->sp << " => "
<< stack;
DEBUG() << "Lock @ " << std::hex << lock;
lookup_or_create(lock)->lock(tg);
- t->vcpu()->r()->sp += sizeof(l4_umword_t); // RET: inc. ESP
- t->vcpu()->r()->ip = ret; // RET: return addr
+ t->return_to(ret);
}
l4_umword_t retaddr = *(l4_umword_t*)stack;
l4_umword_t lock = *(l4_umword_t*)(stack + 1*sizeof(l4_umword_t));
+ EVENT(Measurements::LockEvent::unlock);
+
DEBUG() << "Return addr " << std::hex << retaddr;
DEBUG() << "Lock @ " << std::hex << lock;
int ret = lookup_or_fail(lock)->unlock();
t->vcpu()->r()->ax = ret;
- t->vcpu()->r()->sp += sizeof(l4_umword_t); // RET: inc. ESP
- t->vcpu()->r()->ip = retaddr; // RET: return addr
+ t->return_to(retaddr);
}
/*
l4_umword_t retaddr = *(l4_umword_t*)stack;
l4_umword_t lock = *(l4_umword_t*)(stack + 1*sizeof(l4_umword_t));
+ EVENT(Measurements::LockEvent::mtx_lock);
+
DEBUG() << "lock @ " << std::hex << lock << " ESP.local = " << stack;
PThreadMutex* mtx = _locks[lock];
if (!mtx) {
int ret = mtx->lock(group);
t->vcpu()->r()->ax = ret;
- t->vcpu()->r()->sp += sizeof(l4_umword_t); // RET: inc. ESP
- t->vcpu()->r()->ip = retaddr; // RET: return addr
+ t->return_to(retaddr);
}
l4_umword_t retaddr = *(l4_umword_t*)stack;
l4_umword_t lock = *(l4_umword_t*)(stack + 1*sizeof(l4_umword_t));
+ EVENT(Measurements::LockEvent::mtx_unlock);
+
int ret = lookup_or_fail(lock)->unlock();
DEBUG() << "unlock @ " << std::hex << lock << " = " << ret;
t->vcpu()->r()->ax = ret;
- t->vcpu()->r()->sp += sizeof(l4_umword_t); // RET: inc. ESP
- t->vcpu()->r()->ip = retaddr; // RET: return addr
+ t->return_to(retaddr);
}