static void load_prefetch_data() { DIR *dir = opendir("/etc/launch_cache"); if (dir == NULL) return; struct dirent *dirent; while ((dirent = readdir(dir)) != NULL) { if (dirent->d_name[0] == '.') continue; Session *session = new Session(dirent->d_name); if (session->LoadFromDirectory(dirfd(dir)) != B_OK) { delete session; continue; } if (session->IsMainSession()) { session->Next() = sMainPrefetchSessions; sMainPrefetchSessions = session; } else { hash_insert(sPrefetchHash, session); } } closedir(dir); }
static void uninit() { unregister_generic_syscall(LAUNCH_SPEEDUP_SYSCALLS, 1); recursive_lock_lock(&sLock); // free all sessions from the hashes uint32 cookie = 0; Session *session; while ((session = (Session *)hash_remove_first(sTeamHash, &cookie)) != NULL) { delete session; } cookie = 0; while ((session = (Session *)hash_remove_first(sPrefetchHash, &cookie)) != NULL) { delete session; } // free all sessions from the main prefetch list for (session = sMainPrefetchSessions; session != NULL; ) { sMainPrefetchSessions = session->Next(); delete session; session = sMainPrefetchSessions; } hash_uninit(sTeamHash); hash_uninit(sPrefetchHash); recursive_lock_destroy(&sLock); }
static Session * start_session(team_id team, dev_t device, ino_t node, const char *name, int32 seconds = 30) { RecursiveLocker locker(&sLock); Session *session = new Session(team, name, device, node, seconds); if (session == NULL) return NULL; if (session->InitCheck() != B_OK || session->StartWatchingTeam() != B_OK) { delete session; return NULL; } // let's see if there is a prefetch session for this session Session *prefetchSession; if (session->IsMainSession()) { // search for session by name for (prefetchSession = sMainPrefetchSessions; prefetchSession != NULL; prefetchSession = prefetchSession->Next()) { if (!strcmp(prefetchSession->Name(), name)) { // found session! break; } } } else { // ToDo: search for session by device/node ID prefetchSession = NULL; } if (prefetchSession != NULL) { TRACE(("found prefetch session %s\n", prefetchSession->Name())); prefetchSession->Prefetch(); } if (team >= B_OK) hash_insert(sTeamHash, session); session->Lock(); return session; }