Changes in benchmark/readyQ/cycle.cpp [56ac392:c4241b6]
- File:
-
- 1 edited
-
benchmark/readyQ/cycle.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
benchmark/readyQ/cycle.cpp
r56ac392 rc4241b6 3 3 #include <libfibre/fibre.h> 4 4 5 class __attribute__((aligned(128))) bench_sem { 6 Fibre * volatile ptr = nullptr; 7 public: 8 inline bool wait() { 9 static Fibre * const ready = reinterpret_cast<Fibre * const>(1ull); 10 for(;;) { 11 Fibre * expected = this->ptr; 12 if(expected == ready) { 13 if(__atomic_compare_exchange_n(&this->ptr, &expected, nullptr, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 14 return false; 15 } 16 } 17 else { 18 /* paranoid */ assert( expected == nullptr ); 19 if(__atomic_compare_exchange_n(&this->ptr, &expected, fibre_self(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 20 fibre_park(); 21 return true; 22 } 23 } 24 25 } 26 } 27 28 inline bool post() { 29 static Fibre * const ready = reinterpret_cast<Fibre * const>(1ull); 30 for(;;) { 31 Fibre * expected = this->ptr; 32 if(expected == ready) return false; 33 if(expected == nullptr) { 34 if(__atomic_compare_exchange_n(&this->ptr, &expected, ready, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 35 return false; 36 } 37 } 38 else { 39 if(__atomic_compare_exchange_n(&this->ptr, &expected, nullptr, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 40 fibre_unpark( expected ); 41 return true; 42 } 43 } 44 } 45 } 46 }; 5 47 struct Partner { 6 48 unsigned long long count = 0; … … 51 93 52 94 bool is_tty = isatty(STDOUT_FILENO); 53 start = timeHiRes();95 start = getTimeNsec(); 54 96 55 97 for(int i = 0; i < nthreads; i++) { … … 59 101 60 102 stop = true; 61 end = timeHiRes();103 end = getTimeNsec(); 62 104 printf("\nDone\n"); 63 105
Note:
See TracChangeset
for help on using the changeset viewer.