task_impl::task_impl( std::uintmax_t stamp, timeval elapsed, const kinfo_proc &proc, logger_ptr logger ) : m_proc( proc ), m_log( logger ), m_stamp( stamp ) { assert( m_log.get() != nullptr ); m_pid = m_proc.kp_proc.p_pid; read_task_info( elapsed, true ); }
/// Iterate all tasks and update/create their information. /// @return The call returns -1 on error, 0 indicate successful completion. static int read_tasks_table(void) { kern_return_t kr; processor_set_t pset; task_array_t tasks; processor_set_name_array_t psets; mach_msg_type_number_t i, j, pcnt, tcnt; kr = host_processor_sets(task_manager_port, &psets, &pcnt); if (kr != KERN_SUCCESS) { syslog(LOG_ERR, "error in host_processor_sets(): %s", mach_error_string(kr)); return -1; } for (i = 0; i < pcnt; i++) { kr = host_processor_set_priv(task_manager_port, psets[i], &pset); if (kr != KERN_SUCCESS) { syslog(LOG_ERR, "error in host_processor_set_priv(): %s", mach_error_string(kr)); return -1; } kr = processor_set_tasks(pset, &tasks, &tcnt); if (kr != KERN_SUCCESS) { syslog(LOG_ERR, "error in processor_set_tasks(): %s", mach_error_string(kr)); return -1; } for (j = 0; j < tcnt; j++) { read_task_info(tasks[j]); kr = mach_port_deallocate(mach_task_self(), tasks[j]); if (kr != KERN_SUCCESS) { syslog(LOG_WARNING, "%s, error in mach_port_deallocate(): %s", __FUNCTION__, mach_error_string(kr)); } } kr = vm_deallocate(mach_task_self(), (vm_address_t)tasks, tcnt * sizeof(processor_set_t)); kr = mach_port_deallocate(mach_task_self(), pset); kr = mach_port_deallocate(mach_task_self(), psets[i]); } kr = vm_deallocate(mach_task_self(), (vm_address_t)psets, pcnt * sizeof(processor_set_t)); return 0; }