void ModuleManager::syncModuleWithSystemState( IModule* module ) { try { switch( getSystem()->getState() ) { case SystemState_Initializing: // module is already initialized break; case SystemState_Integrating: case SystemState_Integrated: updateModule( module, ModuleState_Integrated ); break; case SystemState_IntegratingPresentation: case SystemState_Running: updateModule( module, ModuleState_PresentationIntegrated ); break; default: assert( false ); } } catch( std::exception& e ) { module->abort(); CORAL_THROW( ModuleLoadException, "exception raised by module '" << module->getNamespace()->getFullName() << "' during update: " << e.what() ); } }
void ModuleManager::updateModules( ModuleState state ) { size_t numModules = _modules.size(); std::vector<IModule*> sortedModules; sortedModules.reserve( numModules ); for( size_t i = 0; i < numModules; ++i ) sortedModules.push_back( _modules[i].get() ); std::sort( sortedModules.begin(), sortedModules.end(), sortByIncreasingRank ); for( size_t i = 0; i < numModules; ++i ) { IModule* module = sortedModules[i]; try { updateModule( module, state ); } catch( std::exception& e ) { module->abort(); CORAL_LOG(WARNING) << "Module '" << module->getNamespace()->getFullName() << "' aborted due to exception: " << e.what(); } } }
void Destroyable::internalUpdate(quantity<si::time, f32> timeSinceLastFrame) { ModuleMapT::iterator it = mModules.begin(); for (; it != mModules.end(); ++it) updateModule(it->first, timeSinceLastFrame); }
void updateProcessModuleList(CPUState* env, gpid_t pid) { DECAF_Processes_Callback_Params params; target_ulong task = 0; target_ulong i = 0; char name[MAX_PROCESS_INFO_NAME_LEN]; if (pid == 0) { return; } task = DECAF_get_current_process(env); i = task; do { if (pid == DECAF_get_pid(env, i)) { break; } i = DECAF_get_next_task_struct(env, i); } while ( (i != 0) && (i != task) ); if ((i == 0) || (i == task)) { return; } target_ulong mmap_first = DECAF_get_first_mmap(env, i); target_ulong mmap_i = mmap_first; target_ulong vmfile = 0; target_ulong flags = 0; target_ulong vmstart = 0; target_ulong vmend = 0; target_ulong startbrk = 0; target_ulong brk = 0; target_ulong startstack = 0; target_ulong mm = 0; do { vmstart = DECAF_get_vm_start(env, mmap_i); vmend = DECAF_get_vm_end(env, mmap_i); flags = DECAF_get_vm_flags(env, mmap_i); mm = DECAF_get_mm(env, i); startbrk = DECAF_get_start_brk(env, mm); brk = DECAF_get_brk(env, mm); startstack = DECAF_get_start_stack(env, mm); //from mm.h //#define VM_READ 0x00000001 /* currently active flags */ //#define VM_WRITE 0x00000002 //#define VM_EXEC 0x00000004 //#define VM_SHARED 0x00000008 vmfile = DECAF_get_vm_file(env, mmap_i); if (vmfile != 0) { //get_mod_dname(mmap_i, name, 128); DECAF_get_mod_full_dname(env, mmap_i, name, 128); } else { name[0] = '\0'; //get_mod_iname(mmap_i, name, 128); DECAF_get_mod_full_iname(env, mmap_i, name, 128); if (strlen(name) <= 0) { if (vmstart <= startbrk && vmend >= brk) { sprintf(name, "[heap]"); } else if (vmstart <= startstack && vmend >= startstack) { sprintf(name, "[stack]"); } } } int ret = updateModule(pid, vmstart, vmend, flags, name); if (ret == 0xF) //if this is a new module { params.lm.pid = pid; params.lm.pgd = getCurrentPGD(); params.lm.name = name; //TODO: THIS IS NOT THREAD SAFE!!! params.lm.full_name = name; params.lm.base = vmstart; params.lm.size = vmend-vmstart; SimpleCallback_dispatch(&DroidScope_callbacks[DECAF_PROCESSES_LOAD_MODULE_CB], ¶ms); } else if (ret > 0) { params.mu.pid = pid; params.mu.startAddr = vmstart; params.mu.mask = ret; SimpleCallback_dispatch(&DroidScope_callbacks[DECAF_PROCESSES_MODULES_UPDATED_CB], ¶ms); } mmap_i = DECAF_get_next_mmap(env, mmap_i); } while ((mmap_i != 0) && (mmap_i != mmap_first)); }
bool processPackage( QDomDocument* list, QString path ) { QString map = findMapInDir( path ); if( map.isEmpty() ) { printf( "no map file in dir (required for parsing)\n" ); printf( "package path: " + path.toUtf8() + "\n" ); return false; } QDomElement mapElement = findPackageElement( *list, "map", map ); if( path.endsWith( "MoNav.ini" ) ) { if( !mapElement.isNull() ) { QString pHash = computePackageHash( path ); if( mapElement.attribute( "hash" ) != pHash ) { updateMap( list, &mapElement ); mapElement.setAttribute( "hash", pHash ); } else printf( "map already in list\n" ); return false; } addMap( list, map, path ); } else if( path.endsWith( ".mmm" ) ) { if( mapElement.isNull() ) addMap( list, map, path ); QString package = path.right( path.size() - path.lastIndexOf( '/' ) - 1 ); QStringList packageAttributes = package.split( "_" ); QString type = packageAttributes[0]; QString name = packageAttributes[1].replace( ".mmm", "" ); QDomElement packageElement = findPackageElement( *list, "module", name, map ); if( !packageElement.isNull() ) { QString pHash = computePackageHash( path ); if( packageElement.attribute( "hash" ) != pHash ) { updateModule( list, &packageElement ); packageElement.setAttribute( "hash", pHash ); } else printf( "package already in list\n" ); return false; } addModule( list, &mapElement, name, type, path ); } else { printf( "unrecognized package format\n" ); return false; } return true; }