//---------------------------------------------------------------------- // MachTask::Resume //---------------------------------------------------------------------- kern_return_t MachTask::Resume() { struct task_basic_info task_info; task_t task = TaskPort(); if (task == TASK_NULL) return KERN_INVALID_ARGUMENT; DNBError err; err = BasicInfo(task, &task_info); if (err.Success()) { // task_resume isn't counted like task_suspend calls are, are, so if the // task is not suspended, don't try and resume it since it is already // running if (task_info.suspend_count > 0) { err = ::task_resume (task); if (DNBLogCheckLogBit(LOG_TASK) || err.Fail()) err.LogThreaded("::task_resume ( target_task = 0x%4.4x )", task); } } return err.Error(); }
//---------------------------------------------------------------------- // MachTask::IsValid // // Returns true if a task is a valid task port for a current process. //---------------------------------------------------------------------- bool MachTask::IsValid (task_t task) { if (task != TASK_NULL) { struct task_basic_info task_info; return BasicInfo(task, &task_info) == KERN_SUCCESS; } return false; }
///******************************************************************************************* void WantlistModel::addResult (const QJsonObject &o) { int i; QJsonObject basicInformation = o["basic_information"].toObject(); qDebug() << "basic_information " << basicInformation; BasicInfo i_basicInformation; QJsonArray labels = basicInformation["labels"].toArray(); qDebug() << "Labels " << labels; QList<Companies> i_labels; //может быть список for (QJsonArray::const_iterator iter = labels.begin();iter!= labels.end(); ++iter) { const QJsonObject b = (*iter).toObject(); i_labels << Companies(b["catno"].toString(), b["entity_type"].toString(), b["entity_type_name"].toString(), b["id"].toInt(), b["name"].toString(), b["resource_url"].toString()); } QJsonArray formats = basicInformation["formats"].toArray(); qDebug() << "Formats " << formats; Formats i_formats; for (QJsonArray::const_iterator iter = formats.begin();iter!= formats.end(); ++iter) { const QJsonObject c = (*iter).toObject(); QJsonArray descriptions = c["descriptions"].toArray(); qDebug() << "Descriptions " << descriptions ; QList<QString> i_descriptions; for (i=0; i<descriptions.size();i++) { i_descriptions << descriptions.at(i).toString(); } i_formats = Formats(i_descriptions, c["name"].toString(), c["qty"].toString()); } QJsonArray artists = basicInformation["artists"].toArray(); qDebug() << "artists " << artists; Artists i_artists; for (QJsonArray::const_iterator iter = artists.begin();iter!= artists.end(); ++iter) { const QJsonObject d = (*iter).toObject(); i_artists = Artists(d["anv"].toString(), d["id"].toInt(), d["join"].toString(), d["name"].toString(), d["resource_url"].toString(), d["role"].toString(), d["tracks"].toString()); } QJsonArray notes = o["notes"].toArray(); qDebug() << "notes " << notes; QList<Notes> i_notes; for (QJsonArray::const_iterator iter = notes.begin();iter!= notes.end(); ++iter) { const QJsonObject e = (*iter).toObject(); i_notes << Notes(e["field_id"].toInt(), e["value"].toString()); } i_basicInformation = BasicInfo(basicInformation["id"].toInt(), basicInformation["title"].toString(), basicInformation["year"].toInt(), basicInformation["resource_url"].toString(), basicInformation["thumb"].toString(), i_formats, i_labels, i_artists, i_notes); m_WantsResult << Wants(o["rating"].toInt(), i_basicInformation, o["resource_url"].toString(), o["id"].toInt()); }
//---------------------------------------------------------------------- // MachTask::BasicInfo //---------------------------------------------------------------------- kern_return_t MachTask::BasicInfo(struct task_basic_info *info) { return BasicInfo (TaskPort(), info); }
std::string MachTask::GetProfileData (DNBProfileDataScanType scanType) { std::string result; static int32_t numCPU = -1; struct host_cpu_load_info host_info; if (scanType & eProfileHostCPU) { int32_t mib[] = {CTL_HW, HW_AVAILCPU}; size_t len = sizeof(numCPU); if (numCPU == -1) { if (sysctl(mib, sizeof(mib) / sizeof(int32_t), &numCPU, &len, NULL, 0) != 0) return result; } mach_port_t localHost = mach_host_self(); mach_msg_type_number_t count = HOST_CPU_LOAD_INFO_COUNT; kern_return_t kr = host_statistics(localHost, HOST_CPU_LOAD_INFO, (host_info_t)&host_info, &count); if (kr != KERN_SUCCESS) return result; } task_t task = TaskPort(); if (task == TASK_NULL) return result; struct task_basic_info task_info; DNBError err; err = BasicInfo(task, &task_info); if (!err.Success()) return result; uint64_t elapsed_usec = 0; uint64_t task_used_usec = 0; if (scanType & eProfileCPU) { // Get current used time. struct timeval current_used_time; struct timeval tv; TIME_VALUE_TO_TIMEVAL(&task_info.user_time, ¤t_used_time); TIME_VALUE_TO_TIMEVAL(&task_info.system_time, &tv); timeradd(¤t_used_time, &tv, ¤t_used_time); task_used_usec = current_used_time.tv_sec * 1000000ULL + current_used_time.tv_usec; struct timeval current_elapsed_time; int res = gettimeofday(¤t_elapsed_time, NULL); if (res == 0) { elapsed_usec = current_elapsed_time.tv_sec * 1000000ULL + current_elapsed_time.tv_usec; } } std::vector<uint64_t> threads_id; std::vector<std::string> threads_name; std::vector<uint64_t> threads_used_usec; if (scanType & eProfileThreadsCPU) { get_threads_profile_data(scanType, task, m_process->ProcessID(), threads_id, threads_name, threads_used_usec); } struct vm_statistics vm_stats; uint64_t physical_memory; mach_vm_size_t rprvt = 0; mach_vm_size_t rsize = 0; mach_vm_size_t vprvt = 0; mach_vm_size_t vsize = 0; mach_vm_size_t dirty_size = 0; mach_vm_size_t purgeable = 0; mach_vm_size_t anonymous = 0; if (m_vm_memory.GetMemoryProfile(scanType, task, task_info, m_process->GetCPUType(), m_process->ProcessID(), vm_stats, physical_memory, rprvt, rsize, vprvt, vsize, dirty_size, purgeable, anonymous)) { std::ostringstream profile_data_stream; if (scanType & eProfileHostCPU) { profile_data_stream << "num_cpu:" << numCPU << ';'; profile_data_stream << "host_user_ticks:" << host_info.cpu_ticks[CPU_STATE_USER] << ';'; profile_data_stream << "host_sys_ticks:" << host_info.cpu_ticks[CPU_STATE_SYSTEM] << ';'; profile_data_stream << "host_idle_ticks:" << host_info.cpu_ticks[CPU_STATE_IDLE] << ';'; } if (scanType & eProfileCPU) { profile_data_stream << "elapsed_usec:" << elapsed_usec << ';'; profile_data_stream << "task_used_usec:" << task_used_usec << ';'; } if (scanType & eProfileThreadsCPU) { int num_threads = threads_id.size(); for (int i=0; i<num_threads; i++) { profile_data_stream << "thread_used_id:" << std::hex << threads_id[i] << std::dec << ';'; profile_data_stream << "thread_used_usec:" << threads_used_usec[i] << ';'; if (scanType & eProfileThreadName) { profile_data_stream << "thread_used_name:"; int len = threads_name[i].size(); if (len) { const char *thread_name = threads_name[i].c_str(); // Make sure that thread name doesn't interfere with our delimiter. profile_data_stream << RAW_HEXBASE << std::setw(2); const uint8_t *ubuf8 = (const uint8_t *)(thread_name); for (int j=0; j<len; j++) { profile_data_stream << (uint32_t)(ubuf8[j]); } // Reset back to DECIMAL. profile_data_stream << DECIMAL; } profile_data_stream << ';'; } } } if (scanType & eProfileHostMemory) profile_data_stream << "total:" << physical_memory << ';'; if (scanType & eProfileMemory) { static vm_size_t pagesize; static bool calculated = false; if (!calculated) { calculated = true; pagesize = PageSize(); } profile_data_stream << "wired:" << vm_stats.wire_count * pagesize << ';'; profile_data_stream << "active:" << vm_stats.active_count * pagesize << ';'; profile_data_stream << "inactive:" << vm_stats.inactive_count * pagesize << ';'; uint64_t total_used_count = vm_stats.wire_count + vm_stats.inactive_count + vm_stats.active_count; profile_data_stream << "used:" << total_used_count * pagesize << ';'; profile_data_stream << "free:" << vm_stats.free_count * pagesize << ';'; profile_data_stream << "rprvt:" << rprvt << ';'; profile_data_stream << "rsize:" << rsize << ';'; profile_data_stream << "vprvt:" << vprvt << ';'; profile_data_stream << "vsize:" << vsize << ';'; if (scanType & eProfileMemoryDirtyPage) profile_data_stream << "dirty:" << dirty_size << ';'; if (scanType & eProfileMemoryAnonymous) { profile_data_stream << "purgeable:" << purgeable << ';'; profile_data_stream << "anonymous:" << anonymous << ';'; } } profile_data_stream << "--end--;"; result = profile_data_stream.str(); } return result; }