void SessionInitialiser::execute() { Scope x( log() ); SessionInitialiserData::State state = d->state; do { state = d->state; switch ( d->state ) { case SessionInitialiserData::NoTransaction: findSessions(); if ( d->sessions.isEmpty() ) { emitUpdates(); d->state = SessionInitialiserData::QueriesDone; } else { grabLock(); d->state = SessionInitialiserData::WaitingForLock; } break; case SessionInitialiserData::SessionInitialiserData::WaitingForLock: findRecent(); if ( !d->recent || d->recent->done() ) d->state = SessionInitialiserData::HaveUidnext; break; case SessionInitialiserData::HaveUidnext: findMailboxChanges(); d->state = SessionInitialiserData::ReceivingChanges; break; case SessionInitialiserData::ReceivingChanges: recordMailboxChanges(); recordExpunges(); if ( d->messages->done() && ( !d->expunges || d->expunges->done() ) ) d->state = SessionInitialiserData::Updated; break; case SessionInitialiserData::Updated: releaseLock(); // may change d->state break; case SessionInitialiserData::QueriesDone: break; } } while ( state != d->state ); if ( d->t && d->t->failed() ) { releaseLock(); d->t = 0; } // when we come down here, we either have a callback from a query // or we don't. if we don't, we're done and Allocator will deal // with the object. }
ATerm get_sessions_by_moduleid(int cid, ATerm moduleId) { ATermList sessions = findSessions(moduleId); return sndValue(ATmake("sessions(<term>)", sessions)); }