EXPORT_C void CMsvTestUtils::GoServerSideL() { Reset(); _LIT(KMsvServerPattern, "!MsvServer*"); TFindProcess findprocess(KMsvServerPattern); TFullName name; // wait for the server to close before trying to start // one within this process. for(;;) { TFindServer find(KMsvServerPattern); if (find.Next(name) != KErrNone) break; User::After(100000); } iMsvServer = CMsvServer::NewL(); // wait a couple of seconds CTestTimer* timer = CTestTimer::NewL(); timer->After(5000000); CActiveScheduler::Start(); delete timer; iServerEntry = CMsvServerEntry::NewL(*iMsvServer, KMsvRootIndexEntryId); iClientServer = EServerSide; }
/** * Get the proc infomation (CPU percentage, MEM in MByte and percent, * status), enduser version. * @param p A Service object * @param pid The process id * @return TRUE if succeeded otherwise FALSE. */ int update_process_data(Service_T s, ProcessTree_T *pt, int treesize, pid_t pid) { ASSERT(s); ASSERT(systeminfo.mem_kbyte_max > 0); /* save the previous pid and set actual one */ s->inf->priv.process._pid = s->inf->priv.process.pid; s->inf->priv.process.pid = pid; int leaf; if ((leaf = findprocess(pid, pt, treesize)) != -1) { /* save the previous ppid and set actual one */ s->inf->priv.process._ppid = s->inf->priv.process.ppid; s->inf->priv.process.ppid = pt[leaf].ppid; s->inf->priv.process.uid = pt[leaf].uid; s->inf->priv.process.euid = pt[leaf].euid; s->inf->priv.process.gid = pt[leaf].gid; s->inf->priv.process.uptime = time(NULL) - pt[leaf].starttime; s->inf->priv.process.children = pt[leaf].children_sum; s->inf->priv.process.mem_kbyte = pt[leaf].mem_kbyte; s->inf->priv.process.status_flag = pt[leaf].status_flag; s->inf->priv.process.total_mem_kbyte = pt[leaf].mem_kbyte_sum; s->inf->priv.process.cpu_percent = pt[leaf].cpu_percent; s->inf->priv.process.total_cpu_percent = pt[leaf].cpu_percent_sum; if (systeminfo.mem_kbyte_max == 0) { s->inf->priv.process.total_mem_percent = 0; s->inf->priv.process.mem_percent = 0; } else { s->inf->priv.process.total_mem_percent = (int)((double)pt[leaf].mem_kbyte_sum * 1000.0 / systeminfo.mem_kbyte_max); s->inf->priv.process.mem_percent = (int)((double)pt[leaf].mem_kbyte * 1000.0 / systeminfo.mem_kbyte_max); } } else { s->inf->priv.process.ppid = -1; s->inf->priv.process.uid = -1; s->inf->priv.process.euid = -1; s->inf->priv.process.gid = -1; s->inf->priv.process.uptime = 0; s->inf->priv.process.children = 0; s->inf->priv.process.total_mem_kbyte = 0; s->inf->priv.process.total_mem_percent = 0; s->inf->priv.process.mem_kbyte = 0; s->inf->priv.process.mem_percent = 0; s->inf->priv.process.cpu_percent = 0; s->inf->priv.process.total_cpu_percent = 0; } return TRUE; }
/** * Initialize the process tree * @return treesize >= 0 if succeeded otherwise < 0 */ int initprocesstree(ProcessTree_T **pt_r, int *size_r, ProcessTree_T **oldpt_r, int *oldsize_r) { int i; int oldentry; ProcessTree_T *pt; ProcessTree_T *oldpt; int root = -1; if (*pt_r != NULL) { if (oldpt_r && *oldpt_r != NULL) delprocesstree(oldpt_r, oldsize_r); *oldpt_r = *pt_r; *oldsize_r = *size_r; } if ((*size_r = initprocesstree_sysdep(pt_r)) <= 0) { DEBUG("system statistic error -- cannot initialize the process tree => process resource monitoring disabled\n"); Run.doprocess = FALSE; return -1; } else if (Run.doprocess == FALSE) { DEBUG("system statistic -- initialization of the process tree succeeded => process resource monitoring enabled\n"); Run.doprocess = TRUE; } pt = *pt_r; oldpt = *oldpt_r; if (pt == NULL) return 0; for (i = 0; i < (volatile int)*size_r; i ++) { if (oldpt && ((oldentry = findprocess(pt[i].pid, oldpt, *oldsize_r)) != -1)) { pt[i].cputime_prev = oldpt[oldentry].cputime; pt[i].time_prev = oldpt[oldentry].time; /* The cpu_percent may be set already (for example by HPUX module) */ if (pt[i].cpu_percent == 0 && pt[i].cputime_prev != 0 && pt[i].cputime != 0 && pt[i].cputime > pt[i].cputime_prev) { pt[i].cpu_percent = (int)((1000 * (double)(pt[i].cputime - pt[i].cputime_prev) / (pt[i].time - pt[i].time_prev)) / systeminfo.cpus); if (pt[i].cpu_percent > 1000 / systeminfo.cpus) pt[i].cpu_percent = 1000 / systeminfo.cpus; } } else { pt[i].cputime_prev = 0; pt[i].time_prev = 0.0; pt[i].cpu_percent = 0; } if (pt[i].pid == pt[i].ppid) { pt[i].parent = i; continue; } if ((pt[i].parent = findprocess(pt[i].ppid, pt, *size_r)) == -1) { /* Parent process wasn't found - on Linux this is normal: main process with PID 0 is not listed, similarly in FreeBSD jail. * We create virtual process entry for missing parent so we can have full tree-like structure with root. */ int j = (*size_r)++; pt = *pt_r = xresize(*pt_r, *size_r * sizeof(ProcessTree_T)); memset(&pt[j], 0, sizeof(ProcessTree_T)); pt[j].ppid = pt[j].pid = pt[i].ppid; pt[i].parent = j; } if (! connectchild(pt, pt[i].parent, i)) { /* connection to parent process has failed, this is usually caused in the part above */ DEBUG("system statistic error -- cannot connect process id %d to its parent %d\n", pt[i].pid, pt[i].ppid); pt[i].pid = 0; continue; } } /* The main process in Solaris zones and FreeBSD host doesn't have pid 1, so try to find process which is parent of itself */ for (i = 0; i < *size_r; i++) { if (pt[i].pid == pt[i].ppid) { root = i; break; } } if (root == -1) { DEBUG("system statistic error -- cannot find root process id\n"); return -1; } fillprocesstree(pt, root); update_system_load(*pt_r, *size_r); return *size_r; }
EXPORT_C void CMsvTestUtils::CleanMessageFolderL() { //Kill the message server if its running _LIT(KMsvServerPattern, "!MsvServer*"); TFindProcess findprocess(KMsvServerPattern); TFullName name; if(findprocess.Next(name)==KErrNone) { RProcess process; User::LeaveIfError(process.Open(findprocess)); process.Kill(KErrCancel) ; process.Close() ; } // Wait for the server to close before trying to remove // the message folder TInt loopCount = 0; FOREVER { TFindServer find(KMsvServerPattern); if (find.Next(name) != KErrNone) break; User::After(1000000); ++loopCount; if(loopCount > 5) { User::Invariant(); } } // remove the drive from the system ini CDictionaryFileStore* store = CDictionaryFileStore::SystemLC(iFs); if (store->IsPresentL(KUidMsvMessageDriveStream)) { store->RemoveL(KUidMsvMessageDriveStream); store->CommitL(); } CleanupStack::PopAndDestroy(); // store CFileMan* fileMan = CFileMan::NewL(iFs); CleanupStack::PushL(fileMan); TParse parse; TInt error; TFileName fileName(KMsvDefaultFolder2); TChar driveChar=FileSession().GetSystemDriveChar(); TBuf<2> systemDrive = iDriveName; parse.Set(fileName, &systemDrive, NULL); error = fileMan->RmDir(parse.DriveAndPath()); error = iFs.RmDir(parse.DriveAndPath()); if (!(error==KErrNotFound||error==KErrNone || error == KErrPathNotFound)) { TPtrC driveAndPath = parse.DriveAndPath(); Printf(_L("Directory %S cannot be removed. "), &driveAndPath); Printf(_L("Please ensure directory is not in use.\n")); User::Leave(KErrAccessDenied); } //delete DBs in C:, D: and E:. TPath pathNameTemp(iDriveName); pathNameTemp.Append(KDbFileName); RSqlDatabase::Delete(pathNameTemp); pathNameTemp = _L("D:"); pathNameTemp.Append(KDbFileName); RSqlDatabase::Delete(pathNameTemp); pathNameTemp = _L("E:"); pathNameTemp.Append(KDbFileName); RSqlDatabase::Delete(pathNameTemp); // delete "StoreInit.tmp" TPath pathName(iDriveName); pathName.Append(KStoreInitFileName); iFs.Delete(pathName); CleanupStack::PopAndDestroy(fileMan); }