void threadA(void *arg)
{
mcs_mutex::guard g(mutex);
- printf("store: %d\n", 17);
- //store_32(&shared, 17);
- shared = 17;
+ //printf("store: %d\n", 17);
+ store_32(&shared, 17);
+ //shared = 17;
mutex->unlock(&g);
mutex->lock(&g);
- //printf("load: %u\n", load_32(&shared));
- printf("load: %u\n", shared);
+ printf("load: %u\n", load_32(&shared));
+ //printf("load: %u\n", shared);
}
void threadB(void *arg)
{
mcs_mutex::guard g(mutex);
- //printf("load: %u\n", load_32(&shared));
- printf("load: %u\n", shared);
+ printf("load: %u\n", load_32(&shared));
+ //printf("load: %u\n", shared);
mutex->unlock(&g);
mutex->lock(&g);
printf("store: %d\n", 17);
- shared = 17;
- //store_32(&shared, 17);
+ //shared = 17;
+ store_32(&shared, 17);
}
int user_main(int argc, char **argv)
me->gate.store(1, std::mo_relaxed );
// publish my node as the new tail :
- // FIXME: Only weakening the mo_acq_rel cause the spec error
mcs_node * pred = m_tail.exchange(me, std::mo_acq_rel);
/**
@Begin
// unlock of pred can see me in the tail before I fill next
// publish me to previous lock-holder :
+ // FIXME: detection miss
pred->next.store(me, std::mo_release );
// (*2) pred not touched any more
int my_gate = 1;
while (my_gate ) {
my_gate = me->gate.load(std::mo_acquire);
+ if (my_gate == 0)
+ printf("lock at gate!\n");
/**
@Begin
@Commit_point_define_check: my_gate == 0
void unlock(guard * I) {
mcs_node * me = &(I->m_node);
+ // FIXME: detection miss
mcs_node * next = me->next.load(std::mo_acquire);
if ( next == NULL )
{
mcs_node * tail_was_me = me;
bool success;
- // FIXME: Only weakening the mo_acq_rel cause the spec error
success = m_tail.compare_exchange_strong(
tail_was_me,NULL,std::mo_acq_rel);
/**
// (*1) catch the race :
rl::linear_backoff bo;
for(;;) {
+ // FIXME: detection miss
next = me->next.load(std::mo_acquire);
if ( next != NULL )
break;