projects
/
cdsspec-compiler.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix rcu spec
[cdsspec-compiler.git]
/
benchmark
/
mcs-lock
/
mcs-lock.h
diff --git
a/benchmark/mcs-lock/mcs-lock.h
b/benchmark/mcs-lock/mcs-lock.h
index af31894cfeaf626c0717be79c5429eb910c624ac..4714567fd1a82b02839897c919a639bed22e96a9 100644
(file)
--- a/
benchmark/mcs-lock/mcs-lock.h
+++ b/
benchmark/mcs-lock/mcs-lock.h
@@
-82,7
+82,6
@@
public:
me->gate.store(1, std::mo_relaxed );
// publish my node as the new tail :
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
mcs_node * pred = m_tail.exchange(me, std::mo_acq_rel);
/**
@Begin
@@
-95,6
+94,7
@@
public:
// unlock of pred can see me in the tail before I fill next
// publish me to previous lock-holder :
// unlock of pred can see me in the tail before I fill next
// publish me to previous lock-holder :
+ // FIXME: detection miss, don't think it's necessary
pred->next.store(me, std::mo_release );
// (*2) pred not touched any more
pred->next.store(me, std::mo_release );
// (*2) pred not touched any more
@@
-105,6
+105,8
@@
public:
int my_gate = 1;
while (my_gate ) {
my_gate = me->gate.load(std::mo_acquire);
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
/**
@Begin
@Commit_point_define_check: my_gate == 0
@@
-130,12
+132,12
@@
public:
void unlock(guard * I) {
mcs_node * me = &(I->m_node);
void unlock(guard * I) {
mcs_node * me = &(I->m_node);
+ // FIXME: detection miss, don't think it's necessary
mcs_node * next = me->next.load(std::mo_acquire);
if ( next == NULL )
{
mcs_node * tail_was_me = me;
bool success;
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);
/**
success = m_tail.compare_exchange_strong(
tail_was_me,NULL,std::mo_acq_rel);
/**
@@
-153,6
+155,7
@@
public:
// (*1) catch the race :
rl::linear_backoff bo;
for(;;) {
// (*1) catch the race :
rl::linear_backoff bo;
for(;;) {
+ // FIXME: detection miss, don't think it's necessary
next = me->next.load(std::mo_acquire);
if ( next != NULL )
break;
next = me->next.load(std::mo_acquire);
if ( next != NULL )
break;