Ignore:
Timestamp:
Nov 18, 2020, 4:34:08 PM (4 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
7c9ac4a
Parents:
3ea8ad1
Message:

Some fixes to cycle benchmark and added a pthread version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • benchmark/readyQ/cycle.cpp

    r3ea8ad1 r69d1748  
    11
    22#include "rq_bench.hpp"
     3#include <libfibre/fibre.h>
    34
     5class __attribute__((aligned(128))) bench_sem {
     6        Fibre * volatile ptr = nullptr;
     7public:
     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};
    447struct Partner {
    548        unsigned long long count  = 0;
     
    5598                                thddata[i].self.post();
    5699                        }
    57                         wait(start, is_tty);
     100                        wait<Fibre>(start, is_tty);
    58101
    59102                        stop = true;
     
    62105
    63106                        for(int i = 0; i < tthreads; i++) {
     107                                thddata[i].self.post();
    64108                                fibre_join( threads[i], nullptr );
    65109                                global_counter += thddata[i].count;
Note: See TracChangeset for help on using the changeset viewer.