%PDF- %PDF-
Direktori : /usr/local/lib/perl5/site_perl/mach/5.32/sys/ |
Current File : //usr/local/lib/perl5/site_perl/mach/5.32/sys/refcount.ph |
require '_h2ph_pre.ph'; no warnings qw(redefine misc); unless(defined(&__SYS_REFCOUNT_H__)) { eval 'sub __SYS_REFCOUNT_H__ () {1;}' unless defined(&__SYS_REFCOUNT_H__); require 'machine/atomic.ph'; if(defined(&_KERNEL) || defined(&_STANDALONE)) { require 'sys/systm.ph'; } else { require 'stdbool.ph'; eval 'sub KASSERT { my($exp, $msg) = @_; eval q(); }' unless defined(&KASSERT); } eval 'sub REFCOUNT_SATURATED { my($val) = @_; eval q(((($val) & (1 << 31)) != 0)); }' unless defined(&REFCOUNT_SATURATED); eval 'sub REFCOUNT_SATURATION_VALUE () {(3 << 30);}' unless defined(&REFCOUNT_SATURATION_VALUE); if(defined(&INVARIANTS)) { } else { } eval 'sub refcount_init { my($count,$value) = @_; eval q({ &KASSERT(! &REFCOUNT_SATURATED($value), (\\"invalid initial refcount value %u\\", $value)); &atomic_store_int($count, $value); }); }' unless defined(&refcount_init); eval 'sub refcount_load { my($count) = @_; eval q({ ( &atomic_load_int($count)); }); }' unless defined(&refcount_load); eval 'sub refcount_acquire { my($count) = @_; eval q({ \'u_int\' &old; &old = &atomic_fetchadd_int($count, 1); &if ( &__predict_false( &REFCOUNT_SATURATED( &old))) &_refcount_update_saturated($count); ( &old); }); }' unless defined(&refcount_acquire); eval 'sub refcount_acquiren { my($count,$n) = @_; eval q({ \'u_int\' &old; &KASSERT($n < &REFCOUNT_SATURATION_VALUE / 2, (\\"refcount_acquiren: n=%u too large\\", $n)); &old = &atomic_fetchadd_int($count, $n); &if ( &__predict_false( &REFCOUNT_SATURATED( &old))) &_refcount_update_saturated($count); ( &old); }); }' unless defined(&refcount_acquiren); eval 'sub refcount_acquire_checked { my($count) = @_; eval q({ \'u_int\' &old; &old = &atomic_load_int($count); &for (;;) { &if ( &__predict_false( &REFCOUNT_SATURATED( &old + 1))) ( &false); &if ( &__predict_true( &atomic_fcmpset_int($count, &old, &old + 1) == 1)) ( &true); } }); }' unless defined(&refcount_acquire_checked); eval 'sub refcount_acquire_if_not_zero { my($count) = @_; eval q({ ( &refcount_acquire_if_gt($count, 0)); }); }' unless defined(&refcount_acquire_if_not_zero); eval 'sub refcount_releasen { my($count,$n) = @_; eval q({ \'u_int\' &old; &KASSERT($n < &REFCOUNT_SATURATION_VALUE / 2, (\\"refcount_releasen: n=%u too large\\", $n)); &atomic_thread_fence_rel(); &old = &atomic_fetchadd_int($count, -$n); &if ( &__predict_false( &old < $n || &REFCOUNT_SATURATED( &old))) { &_refcount_update_saturated($count); ( &false); } &if ( &old > $n) ( &false); &atomic_thread_fence_acq(); ( &true); }); }' unless defined(&refcount_releasen); eval 'sub refcount_release { my($count) = @_; eval q({ ( &refcount_releasen($count, 1)); }); }' unless defined(&refcount_release); eval 'sub _refcount_release_if_cond { my($cond, $name) = @_; eval q( &static &__inline &__result_use_check &bool &_refcount_release_if_$name( &volatile \'u_int\' * &count, \'u_int\' &n) { \'u_int\' &old; &KASSERT( &n > 0, (\\"%s: zero increment\\", &__func__)); &old = &atomic_load_int( &count); &for (;;) { &if (!($cond)) &return ( &false); &if ( &__predict_false( &REFCOUNT_SATURATED( &old))) &return ( &false); &if ( &atomic_fcmpset_rel_int( &count, &old, &old - 1)) &return ( &true); } }); }' unless defined(&_refcount_release_if_cond); eval 'sub refcount_release_if_gt { my($count,$n) = @_; eval q({ ( &_refcount_release_if_gt($count, $n)); }); }' unless defined(&refcount_release_if_gt); eval 'sub refcount_release_if_last { my($count) = @_; eval q({ &if ( &_refcount_release_if_eq($count, 1)) { &atomic_thread_fence_acq(); ( &true); } ( &false); }); }' unless defined(&refcount_release_if_last); eval 'sub refcount_release_if_not_last { my($count) = @_; eval q({ ( &_refcount_release_if_gt($count, 1)); }); }' unless defined(&refcount_release_if_not_last); } 1;