public void run(){
  long last=0;
  while (isConnected()) {
    try {
      Thread.sleep(250);
    }
 catch (    InterruptedException ie) {
    }
    try {
      long current=m_protocol.messagesReceived();
      long delta=last - current;
      last=current;
      if (!m_lastResponse || (!isSuspended() && delta > 5))       throw new NotSuspendedException();
      for (      Isolate isolate : m_manager.getIsolates()) {
        int isolateId=isolate.getId();
        if (isolateId != Isolate.DEFAULT_ID && !isWorkerSuspended(isolateId) && delta > 5) {
          throw new NotSuspendedException();
        }
        int count=m_manager.getSwfInfoCount(isolateId);
        for (int i=0; i < count; i++) {
          DSwfInfo info=m_manager.getSwfInfo(i,isolateId);
          if (info == null || info.isUnloaded() || info.isPopulated() || (info.getVmVersion() > 0))           continue;
          info.getSwdSize(this);
          if (info.getVmVersion() > 0) {
            info.setPopulated();
            continue;
          }
          if (!info.isSwdLoading() && !info.isUnloaded()) {
            if (info.getSwf() == null && !info.isUnloaded())             info.setSwf(requestSwf(i));
            if (info.getSwd() == null && !info.isUnloaded())             info.setSwd(requestSwd(i));
            try {
              if (!info.isUnloaded())               info.parseSwfSwd(m_manager);
            }
 catch (            Throwable e) {
              if (Trace.error) {
                Trace.trace("Error while parsing swf/swd '" + info.getUrl() + "'. Giving up and marking it processed");
                e.printStackTrace();
              }
              info.setPopulated();
            }
          }
        }
      }
    }
 catch (    InProgressException ipe) {
    }
catch (    NoResponseException nre) {
    }
catch (    NotSuspendedException nse) {
    }
catch (    Exception e) {
      if (Trace.error) {
        Trace.trace("Exception in background swf/swd processing thread");
        e.printStackTrace();
      }
    }
  }
}

public void run ( ) { long last = 0 ; while ( isConnected ( ) ) { try { Thread . sleep ( 250 ) ; } catch ( InterruptedException ie ) { } try { long current = m_protocol . messagesReceived ( ) ; long delta = last - current ; last = current ; if ( ! m_lastResponse || ( ! isSuspended ( ) && delta > 5 ) ) throw new NotSuspendedException ( ) ; for ( Isolate isolate : m_manager . getIsolates ( ) ) { int isolateId = isolate . getId ( ) ; if ( isolateId != Isolate . DEFAULT_ID && ! isWorkerSuspended ( isolateId ) && delta > 5 ) { throw new NotSuspendedException ( ) ; } int count = m_manager . getSwfInfoCount ( isolateId ) ; for ( int i = 0 ; i < count ; i ++ ) { DSwfInfo info = m_manager . getSwfInfo ( i , isolateId ) ; if ( info == null || info . isUnloaded ( ) || info . isPopulated ( ) || ( info . getVmVersion ( ) > 0 ) ) continue ; info . getSwdSize ( this ) ; if ( info . getVmVersion ( ) > 0 ) { info . setPopulated ( ) ; continue ; } if ( ! info . isSwdLoading ( ) && ! info . isUnloaded ( ) ) { if ( info . getSwf ( ) == null && ! info . isUnloaded ( ) ) info . setSwf ( requestSwf ( i ) ) ; if ( info . getSwd ( ) == null && ! info . isUnloaded ( ) ) info . setSwd ( requestSwd ( i ) ) ; try { if ( ! info . isUnloaded ( ) ) info . parseSwfSwd ( m_manager ) ; } catch ( Throwable e ) { if ( Trace . error ) { Trace . trace ( "Error while parsing swf/swd '" + info . getUrl ( ) + "'. Giving up and marking it processed" ) ; e . printStackTrace ( ) ; } info . setPopulated ( ) ; } } } } } catch ( InProgressException ipe ) { } catch ( NoResponseException nre ) { } catch ( NotSuspendedException nse ) { } catch ( Exception e ) { if ( Trace . error ) { Trace . trace ( "Exception in background swf/swd processing thread" ) ; e . printStackTrace ( ) ; } } } }
a background thread which wakes up periodically and fetches the swf and swd from the player for new movies that have loaded . it then uses these to create an instance of moviemetadata ( a class shared with the profiler ) from which fdb can cull function names . this work is done on a background thread because it can take several seconds , and we want the fdb user to be able to execute other commands while it is happening .
