%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /usr/local/lib/perl5/site_perl/mach/5.32/sys/
Upload File :
Create Path :
Current File : //usr/local/lib/perl5/site_perl/mach/5.32/sys/seqc.ph

require '_h2ph_pre.ph';

no warnings qw(redefine misc);

unless(defined(&_SYS_SEQC_H_)) {
    eval 'sub _SYS_SEQC_H_ () {1;}' unless defined(&_SYS_SEQC_H_);
    if(defined(&_KERNEL)) {
	require 'sys/systm.ph';
    }
    require 'sys/types.ph';
    require 'sys/_seqc.ph';
    if(defined(&_KERNEL)) {
	require 'sys/lock.ph';
	require 'machine/cpu.ph';
	eval 'sub seqc_in_modify {
	    my($seqc) = @_;
    	    eval q(({  &seqc_t  &__seqc = ($seqc);  &__predict_false( &__seqc & 1); }));
	}' unless defined(&seqc_in_modify);
	eval 'sub seqc_write_begin {
	    my($seqcp) = @_;
    	    eval q({  &critical_enter();  &MPASS(! &seqc_in_modify(*$seqcp)); *$seqcp += 1;  &atomic_thread_fence_rel(); });
	}' unless defined(&seqc_write_begin);
	eval 'sub seqc_write_end {
	    my($seqcp) = @_;
    	    eval q({  &atomic_thread_fence_rel(); *$seqcp += 1;  &MPASS(! &seqc_in_modify(*$seqcp));  &critical_exit(); });
	}' unless defined(&seqc_write_end);
	eval 'sub seqc_read_any {
	    my($seqcp) = @_;
    	    eval q({ ( &atomic_load_acq_int( &__DECONST( &seqc_t *, $seqcp))); });
	}' unless defined(&seqc_read_any);
	eval 'sub seqc_read_notmodify {
	    my($seqcp) = @_;
    	    eval q({ ( &atomic_load_acq_int( &__DECONST( &seqc_t *, $seqcp)) & ~1); });
	}' unless defined(&seqc_read_notmodify);
	eval 'sub seqc_read {
	    my($seqcp) = @_;
    	    eval q({  &seqc_t  &ret;  &for (;;) {  &ret =  &seqc_read_any($seqcp);  &if ( &seqc_in_modify( &ret)) {  &cpu_spinwait();  &continue; }  &break; } ( &ret); });
	}' unless defined(&seqc_read);
	eval 'sub seqc_consistent_nomb {
	    my($seqcp, $oldseqc) = @_;
    	    eval q(({  &const  &seqc_t * &__seqcp = ($seqcp);  &seqc_t  &__oldseqc = ($oldseqc);  &MPASS(!( &seqc_in_modify( &__oldseqc)));  &__predict_true(* &__seqcp ==  &__oldseqc); }));
	}' unless defined(&seqc_consistent_nomb);
	eval 'sub seqc_consistent {
	    my($seqcp, $oldseqc) = @_;
    	    eval q(({  &atomic_thread_fence_acq();  &seqc_consistent_nomb($seqcp, $oldseqc); }));
	}' unless defined(&seqc_consistent);
	eval 'sub seqc_sleepable_write_end {
	    my($seqcp) = @_;
    	    eval q({  &atomic_thread_fence_rel(); *$seqcp += 1;  &MPASS(! &seqc_in_modify(*$seqcp)); });
	}' unless defined(&seqc_sleepable_write_end);
    }
}
1;

Zerion Mini Shell 1.0