/* virtual */ SysStatus FCMPrimitive<PL,ALLOC>::detachRegion(RegionRef regRef) { uval found; RegionInfo *rinfo; // check before locking to avoid callback deadlock on destruction if (this->beingDestroyed) return 0; this->lock.acquire(); found = this->regionList.remove(regRef, rinfo); if (!found) { // assume race on destruction call tassert(this->beingDestroyed, err_printf("no region; no destruction race\n")); this->lock.release(); return 0; } if (this->regionList.isEmpty()) { this->lock.release(); this->notInUse(); } else { this->lock.release(); updatePM(rinfo->pm); } delete rinfo; return 0; }
void Oscillator::update( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { if( m_freq >= Engine::mixer()->processingSampleRate() / 2 ) { Mixer::clearAudioBuffer( _ab, _frames ); return; } if( m_subOsc != NULL ) { switch( m_modulationAlgoModel->value() ) { case PhaseModulation: updatePM( _ab, _frames, _chnl ); break; case AmplitudeModulation: updateAM( _ab, _frames, _chnl ); break; case SignalMix: updateMix( _ab, _frames, _chnl ); break; case SynchronizedBySubOsc: updateSync( _ab, _frames, _chnl ); break; case FrequencyModulation: updateFM( _ab, _frames, _chnl ); } } else { updateNoSub( _ab, _frames, _chnl ); } }
// Don't destroy FCM when last use disappears. Only destroy // if FR (file representative) detaches (file is really gone) // or page replacement removes last page (lazy close). // FIXME: no locking going on here??? SysStatus FCMDefault::detachRegion(RegionRef regRef) { //err_printf("FCMDefault::detachRegion(%lx) : %lx\n", regRef, getRef()); RegionInfo *rinfo; PMRef pm; uval found; // check before locking to avoid callback on destruction deadlock if (beingDestroyed) return 0; lock.acquire(); found = regionList.remove(regRef, rinfo); if (!found) { // assume race on destruction call tassert(beingDestroyed,err_printf("no region; no destruction race\n")); lock.release(); return 0; } pm = rinfo->pm; delete rinfo; if (!referenceCount && regionList.isEmpty()) { //err_printf("FCMDefault::detachRegion(%lx) regionlist empty: %lx\n", // regRef, getRef()); lock.release(); notInUse(); } else { lock.release(); } //err_printf("FCMDefault::detachRegion maybe doing updatePM\n"); // above code may have destroyed us; updatePM info if we still have a pm if (!beingDestroyed) updatePM(pm); //err_printf("FCMDefault::detachRegion all done\n"); return 0; }