[SCM] BOINC packaging branch, debian/experimental, updated. debian/6.2.18-2-18-g3665af8
rmayorga
rmayorga at debian.org
Sun Apr 5 22:08:54 UTC 2009
The following commit has been merged in the debian/experimental branch:
commit 3665af8796c4c5974b8d7a200eac5da5129ac05e
Author: rmayorga <rmayorga at debian.org>
Date: Sun Apr 5 16:08:00 2009 -0600
Delete app_stats_mac.cpp, it not has a clear license
diff --git a/client/app_stats_mac.cpp b/client/app_stats_mac.cpp
deleted file mode 100644
index 68681f5..0000000
--- a/client/app_stats_mac.cpp
+++ /dev/null
@@ -1,713 +0,0 @@
-// This file is part of BOINC.
-// http://boinc.berkeley.edu
-// Copyright (C) 2008 University of California
-//
-// BOINC is free software; you can redistribute it and/or modify it
-// under the terms of the GNU Lesser General Public License
-// as published by the Free Software Foundation,
-// either version 3 of the License, or (at your option) any later version.
-//
-// BOINC is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-// See the GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
-
-// This file is adapted from code originally supplied by Apple Computer, Inc.
-// The Berkeley Open Infrastructure for Network Computing project has modified
-// the original code and made additions as of September 22, 2006. The original
-// Apple Public Source License statement appears below:
-
-/*
- * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- *
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License"). You may not use this file except in compliance with the
- * License. Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
- *
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
- * License for the specific language governing rights and limitations
- * under the License.
- *
- * @APPLE_LICENSE_HEADER_END@
- */
-
-// app_stats_mac.C
-//
-
-// #define _DEBUG 1
-
-// Put a safety limit on recursion
-#define MAX_DESCENDANT_LEVEL 4
-
-// Totals for non_BOINC processes are not useful because most OSs don't
-// move idle processes out of RAM, so physical memory is always full
-#define GET_NON_BOINC_INFO 0
-
-// We don't need swap space info because
-// http://developer.apple.com/documentation/Performance/Conceptual/ManagingMemory/Articles/AboutMemory.html says:
-// Unlike most UNIX-based operating systems, Mac OS X does not use a
-// preallocated swap partition for virtual memory. Instead, it uses all
-// of the available space on the machineÕs boot partition.
-// However, the associated overhead is not significant if we are examining
-// only BOINC descendant processes.
-#define GET_SWAP_SIZE 1
-
-// The overhead for getting CPU times is not significant if we are
-// examining only BOINC descendant processes.
-#define GET_CPU_TIMES 1
-
-
-#include <cerrno>
-#include <sys/types.h>
-#include <mach/shared_memory_server.h>
-#include <mach/mach.h>
-#include <mach/mach_error.h>
-#include <sys/sysctl.h>
-
-#include "procinfo.h"
-
-using std::vector;
-
-static int get_boinc_proc_info(int my_pid, int boinc_pid);
-static int build_proc_list (vector<PROCINFO>& pi, int boinc_pid);
-static void output_child_totals(PROCINFO& pinfo);
-static boolean_t appstats_task_update(task_t a_task, vector<PROCINFO>& piv);
-static void find_all_descendants(vector<PROCINFO>& piv, int pid, int rlvl);
-static void add_child_totals(PROCINFO& pi, vector<PROCINFO>& piv, int pid, int rlvl);
-//static void add_others(PROCINFO&, std::vector<PROCINFO>&);
-static void sig_pipe(int signo);
-
-#ifdef _DEBUG
-static void print_procinfo(PROCINFO& pinfo);
-static void vm_size_render(unsigned long long a_size);
-#endif
-
-// BOINC helper application to get info about each of the BOINC Client's
-// child processes (including all its descendants) and also totals for
-// all other processes.
-// On the Mac, much of this information is accessible only by the super-user,
-// so this helper application must be run setuid root.
-
-int main(int argc, char** argv) {
- int boinc_pid, my_pid;
- int retval;
- char buf[256];
-
- if (geteuid() != 0) // This must be run setuid root
- return EACCES;
-
- my_pid = getpid();
- boinc_pid = getppid(); // Assumes we were called by BOINC client
-
- if (argc == 2)
- boinc_pid = atoi(argv[1]); // Pass in any desired valid pid for testing
-
- if (signal(SIGPIPE, sig_pipe) == SIG_ERR) {
- fprintf(stderr, "signal error");
- return 0;
- }
-
- setbuf(stdin, 0);
- setbuf(stdout, 0);
-
- while (1) {
- if (fgets(buf, sizeof(buf), stdin) == NULL)
- return 0;
-
- if (feof(stdin))
- return 0;
-
- retval = get_boinc_proc_info(my_pid, boinc_pid);
- }
-
- return 0;
-}
-
-static int get_boinc_proc_info(int my_pid, int boinc_pid) {
- int retval;
- vector<PROCINFO> piv;
- PROCINFO child_total;
- unsigned int i;
-
-
- retval = build_proc_list(piv, boinc_pid);
- if (retval)
- return retval;
-
- for (i=0; i<piv.size(); i++) {
- PROCINFO& p = piv[i];
- if (p.parentid == boinc_pid) {
- if (p.id == my_pid)
- continue;
-
- child_total = p;
- p.is_boinc_app = true;
-#ifdef _DEBUG
- printf("\n\nSumming info for process %d and its children:\n", child_total.id);
- print_procinfo(child_total);
-#endif
- // look for child processes
- add_child_totals(child_total, piv, p.id, 0);
-#ifdef _DEBUG
- printf("Totals for process %d and its children:\n", child_total.id);
-#endif
- output_child_totals(child_total);
- }
- }
-
- memset(&child_total, 0, sizeof(child_total));
-#if 0
-#ifdef _DEBUG
- printf("\n\nSumming info for all other processes\n");
-#endif
- add_others(child_total, piv);
-#endif
- output_child_totals(child_total); // zero pid signals end of data
-
- return 0;
-}
-
-
-static void output_child_totals(PROCINFO& pinfo) {
- printf("%d %d %.0lf %.0lf %lu %lf %lf\n",
- pinfo.id, pinfo.parentid, pinfo.working_set_size, pinfo.swap_size,
- pinfo.page_fault_count, pinfo.user_time, pinfo.kernel_time);
-// fflush(stdout);
-}
-
-static int build_proc_list (vector<PROCINFO>& pi, int boinc_pid) {
- boolean_t retval = FALSE;
- kern_return_t error;
- mach_port_t appstats_port;
- processor_set_t *psets, pset;
- task_t *tasks;
- unsigned i, j, pcnt, tcnt;
- PROCINFO pinfo;
- int pid, mib[4];
- struct kinfo_proc kinfo;
- size_t kinfosize;
-
- appstats_port = mach_host_self();
-
- // First, get a list of all tasks / processes
-
- error = host_processor_sets(appstats_port, &psets, &pcnt);
- if (error != KERN_SUCCESS) {
- fprintf(stderr,
- "Error in host_processor_sets(): %s",
- mach_error_string(error));
- retval = TRUE;
- goto RETURN;
- }
-
- for (i = 0; i < pcnt; i++) {
- if (retval)
- break;
-
- error = host_processor_set_priv(appstats_port, psets[i], &pset);
- if (error != KERN_SUCCESS) {
- fprintf(stderr,
- "Error in host_processor_set_priv(): %s",
- mach_error_string(error));
- retval = TRUE;
- break;
- }
-
- error = processor_set_tasks(pset, &tasks, &tcnt);
- if (error != KERN_SUCCESS) {
- fprintf(stderr,
- "Error in processor_set_tasks(): %s",
- mach_error_string(error));
- retval = TRUE;
- break;
- }
-
- for (j = 0; j < tcnt; j++) {
- if (retval)
- break;
-
- memset(&pinfo, 0, sizeof(PROCINFO));
-
- /* Get pid for this task. */
- error = pid_for_task(tasks[j], &pid);
- if (error != KERN_SUCCESS) {
- /* Not a process, or the process is gone. */
- continue;
- }
-
- // Get parent pid for each process
- /* Get kinfo structure for this task. */
- kinfosize = sizeof(struct kinfo_proc);
- mib[0] = CTL_KERN;
- mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_PID;
- mib[3] = pid;
-
- if (sysctl(mib, 4, &kinfo, &kinfosize, NULL, 0) == -1) {
- fprintf(stderr,
- "%s(): Error in sysctl(): %s", __FUNCTION__,
- strerror(errno));
- retval = TRUE;
- break;
- }
-
- if (kinfo.kp_proc.p_stat == 0) {
- /* Zombie process. */
- continue;
- }
-
- pinfo.id = pid;
- pinfo.parentid = kinfo.kp_eproc.e_ppid;
-
- pi.push_back(pinfo);
- }
- }
-
-#if ! GET_NON_BOINC_INFO
- // Next, find all BOINC's decendants and mark them for further study
- if (! retval)
- find_all_descendants(pi, boinc_pid, 0);
-#endif
-
- // Now get the process information for each descendant
- for (i = 0; i < pcnt; i++) {
- for (j = 0; j < tcnt; j++) {
- if (! retval)
- if (appstats_task_update(tasks[j], pi)) {
- retval = TRUE;
- goto RETURN;
- }
-
- /* Delete task port if it isn't our own. */
- if (tasks[j] != mach_task_self()) {
- mach_port_deallocate(mach_task_self(),
- tasks[j]);
- }
- }
-
- error = vm_deallocate((vm_map_t)mach_task_self(),
- (vm_address_t)tasks, tcnt * sizeof(task_t));
- if (error != KERN_SUCCESS) {
- if (!retval)
- fprintf(stderr,
- "Error in vm_deallocate(): %s",
- mach_error_string(error));
- retval = TRUE;
- goto RETURN;
- }
- if ((error = mach_port_deallocate(mach_task_self(),
- pset)) != KERN_SUCCESS
- || (error = mach_port_deallocate(mach_task_self(),
- psets[i])) != KERN_SUCCESS) {
- if (!retval)
- fprintf(stderr,
- "Error in mach_port_deallocate(): %s",
- mach_error_string(error));
- retval = TRUE;
- goto RETURN;
- }
- }
-
- error = vm_deallocate((vm_map_t)mach_task_self(),
- (vm_address_t)psets, pcnt * sizeof(processor_set_t));
- if (error != KERN_SUCCESS) {
- if (!retval)
- fprintf(stderr,
- "Error in vm_deallocate(): %s",
- mach_error_string(error));
- retval = TRUE;
- goto RETURN;
- }
-
- RETURN:
- return retval;
-
-}
-
-/* Update statistics for task a_task. */
-static boolean_t appstats_task_update(task_t a_task, vector<PROCINFO>& piv)
-{
- boolean_t retval;
- kern_return_t error;
- mach_msg_type_number_t count;
- task_basic_info_data_t ti;
- vm_address_t address;
- mach_port_t object_name;
- vm_region_top_info_data_t info;
- vm_size_t size;
- thread_array_t thread_table;
- unsigned int table_size;
- thread_basic_info_t thi;
- thread_basic_info_data_t thi_data;
- unsigned i;
- task_events_info_data_t events;
- vm_size_t vsize, rsize;
- PROCINFO *pinfo;
- int pid;
-
- /* Get pid for this task. */
- error = pid_for_task(a_task, &pid);
- if (error != KERN_SUCCESS) {
- /* Not a process, or the process is gone. */
- retval = FALSE;
- goto GONE;
- }
-
- for (i=0; i<piv.size(); i++) {
- pinfo = &piv[i];
- if (pinfo->id == pid)
- break;
- }
-
- if (pinfo->id != pid) {
- fprintf(stderr, "pid %d missing from list\n", pid);
- retval = FALSE;
- goto RETURN;
- }
-
-#if ! GET_NON_BOINC_INFO
- if (!pinfo->is_boinc_app) {
- retval = FALSE;
- goto RETURN;
- }
-#endif
- /*
- * Get task_info, which is used for memory usage and CPU usage
- * statistics.
- */
- count = TASK_BASIC_INFO_COUNT;
- error = task_info(a_task, TASK_BASIC_INFO, (task_info_t)&ti, &count);
- if (error != KERN_SUCCESS) {
- retval = FALSE;
- goto GONE;
- }
-
- /*
- * Get memory usage statistics.
- */
-
- /*
- * Set rsize and vsize; they require no calculation. (Well, actually,
- * we adjust vsize if traversing memory objects to not include the
- * globally shared text and data regions).
- */
- rsize = ti.resident_size;
-#if GET_SWAP_SIZE
- vsize = ti.virtual_size;
- /*
- * Iterate through the VM regions of the process and determine
- * the amount of memory of various types it has mapped.
- */
- for (address = 0; ; address += size) {
- /* Get memory region. */
- count = VM_REGION_TOP_INFO_COUNT;
- if (vm_region(a_task, &address, &size,
- VM_REGION_TOP_INFO, (vm_region_info_t)&info, &count,
- &object_name) != KERN_SUCCESS) {
- /* No more memory regions. */
- break;
- }
-
- if (address >= GLOBAL_SHARED_TEXT_SEGMENT
- && address < (GLOBAL_SHARED_DATA_SEGMENT
- + SHARED_DATA_REGION_SIZE)) {
- /* This region is private shared. */
-
- /*
- * Check if this process has the globally shared
- * text and data regions mapped in. If so, adjust
- * virtual memory size and exit loop.
- */
- if (info.share_mode == SM_EMPTY) {
- vm_region_basic_info_data_64_t b_info;
-
- count = VM_REGION_BASIC_INFO_COUNT_64;
- if (vm_region_64(a_task, &address,
- &size, VM_REGION_BASIC_INFO,
- (vm_region_info_t)&b_info, &count,
- &object_name) != KERN_SUCCESS) {
- break;
- }
-
- if (b_info.reserved) {
- vsize -= (SHARED_TEXT_REGION_SIZE + SHARED_DATA_REGION_SIZE);
- break;
- }
- }
- }
- }
-#else
- vsize = 0;
-#endif // GET_SWAP_SIZE
- pinfo->working_set_size = rsize;
- pinfo->swap_size = vsize;
-
- /*
- * Get CPU usage statistics.
- */
-
- pinfo->user_time = (double)ti.user_time.seconds + (((double)ti.user_time.microseconds)/1000000.);
- pinfo->kernel_time = (double)ti.system_time.seconds + (((double)ti.system_time.microseconds)/1000000.);
-
- /* Get number of threads. */
- error = task_threads(a_task, &thread_table, &table_size);
- if (error != KERN_SUCCESS) {
- retval = FALSE;
- goto RETURN;
- }
-
-#if GET_CPU_TIMES
- /* Iterate through threads and collect usage stats. */
- thi = &thi_data;
- for (i = 0; i < table_size; i++) {
- count = THREAD_BASIC_INFO_COUNT;
- if (thread_info(thread_table[i], THREAD_BASIC_INFO,
- (thread_info_t)thi, &count) == KERN_SUCCESS) {
- if ((thi->flags & TH_FLAGS_IDLE) == 0) {
- pinfo->user_time += (double)thi->user_time.seconds + (((double)thi->user_time.microseconds)/1000000.);
- pinfo->kernel_time += (double)thi->system_time.seconds + (((double)thi->system_time.microseconds)/1000000.);
- }
- }
- if (a_task != mach_task_self()) {
- if ((error = mach_port_deallocate(mach_task_self(),
- thread_table[i])) != KERN_SUCCESS) {
- fprintf(stderr,
- "Error in mach_port_deallocate(): %s",
- mach_error_string(error));
- retval = TRUE;
- goto RETURN;
- }
- }
- }
- if ((error = vm_deallocate(mach_task_self(), (vm_offset_t)thread_table,
- table_size * sizeof(thread_array_t)) != KERN_SUCCESS)) {
- fprintf(stderr,
- "Error in vm_deallocate(): %s",
- mach_error_string(error));
- retval = TRUE;
- goto RETURN;
- }
-#endif GET_CPU_TIMES
-
- /*
- * Get event counters.
- */
-
- count = TASK_EVENTS_INFO_COUNT;
- if (task_info(a_task, TASK_EVENTS_INFO,
- (task_info_t)&events, &count) != KERN_SUCCESS) {
- /* Error. */
- retval = FALSE;
- goto RETURN;
- } else {
- pinfo->page_fault_count = events.pageins;
- }
-
- retval = FALSE;
- RETURN:
- GONE:
-
- return retval;
-}
-
-// Scan the process table marking all the decendants of the parent
-// process. Loop thru entire table as the entries aren't in order.
-// Recurse at most 5 times to get additional child processes.
-//
-static void find_all_descendants(vector<PROCINFO>& piv, int pid, int rlvl) {
- unsigned int i;
-
- if (rlvl > MAX_DESCENDANT_LEVEL) {
- return;
- }
- for (i=0; i<piv.size(); i++) {
- PROCINFO& p = piv[i];
- if (p.parentid == pid) {
- p.is_boinc_app = true;
- // look for child process of this one
- find_all_descendants(piv, p.id, rlvl+1); // recursion - woo hoo!
- }
- }
-}
-
-// Scan the process table adding in CPU time and mem usage. Loop
-// thru entire table as the entries aren't in order. Recurse at
-// most 4 times to get additional child processes
-//
-static void add_child_totals(PROCINFO& pi, vector<PROCINFO>& piv, int pid, int rlvl) {
- unsigned int i;
-
- if (rlvl > (MAX_DESCENDANT_LEVEL - 1)) {
- return;
- }
- for (i=0; i<piv.size(); i++) {
- PROCINFO& p = piv[i];
- if (p.parentid == pid) {
- pi.kernel_time += p.kernel_time;
- pi.user_time += p.user_time;
- pi.swap_size += p.swap_size;
- pi.working_set_size += p.working_set_size;
- pi.page_fault_count += p.page_fault_count;
- p.is_boinc_app = true;
-#ifdef _DEBUG
- print_procinfo(p);
-#endif
- // look for child process of this one
- add_child_totals(pi, piv, p.id, rlvl+1); // recursion - woo hoo!
- }
- }
-}
-
-#if 0
-static void add_others(PROCINFO& pi, vector<PROCINFO>& piv) {
- unsigned int i;
-
- memset(&pi, 0, sizeof(pi));
- for (i=0; i<piv.size(); i++) {
- PROCINFO& p = piv[i];
- if (!p.is_boinc_app) {
- pi.kernel_time += p.kernel_time;
- pi.user_time += p.user_time;
- pi.swap_size += p.swap_size;
- pi.working_set_size += p.working_set_size;
- pi.page_fault_count += p.page_fault_count;
- p.is_boinc_app = true;
-#ifdef _DEBUG
- print_procinfo(p);
-#endif
- }
- }
-}
-#endif
-
-static void sig_pipe(int signo)
-{
- exit(1);
-}
-
-#ifdef _DEBUG
-static void print_procinfo(PROCINFO& pinfo) {
- unsigned long long rsize, vsize;
-
- rsize = (unsigned long long)pinfo.working_set_size;
- vsize = (unsigned long long)pinfo.swap_size;
- printf("pid=%d, ppid=%d, rm=%llu=", pinfo.id, pinfo.parentid, rsize);
- vm_size_render(rsize);
- printf("=, vm=%llu=", vsize);
- vm_size_render(vsize);
- printf(", pageins=%lu, usertime=%lf, systime=%lf\n", pinfo.page_fault_count, pinfo.user_time, pinfo.kernel_time);
-}
-
-/*
- * Render a memory size in units of B, K, M, or G, depending on the value.
- *
- * a_size is ULL, since there are places where VM sizes are capable of
- * overflowing 32 bits, particularly when VM stats are multiplied by the
- * pagesize.
- */
-static void vm_size_render(unsigned long long a_size)
-{
- if (a_size < 1024) {
- /* 1023B. */
- printf("%4lluB", a_size);
- } else if (a_size < (1024ULL * 1024ULL)) {
- /* K. */
- if (a_size < 10ULL * 1024ULL) {
- /* 9.99K */
- printf("%1.2fK",
- ((double)a_size) / 1024);
- } else if (a_size < 100ULL * 1024ULL) {
- /* 99.9K */
- printf("%2.1fK",
- ((double)a_size) / 1024);
- } else {
- /* 1023K */
- printf("%4lluK",
- a_size / 1024ULL);
- }
- } else if (a_size < (1024ULL * 1024ULL * 1024ULL)) {
- /* M. */
- if (a_size < 10ULL * 1024ULL * 1024ULL) {
- /* 9.99M */
- printf("%1.2fM",
- ((double)a_size) / (1024 * 1024));
- } else if (a_size < 100ULL * 1024ULL * 1024ULL) {
- /* 99.9M */
- printf("%2.1fM",
- ((double)a_size) / (1024 * 1024));
- } else {
- /* 1023M */
- printf("%4lluM",
- a_size / (1024ULL * 1024ULL));
- }
- } else if (a_size < (1024ULL * 1024ULL * 1024ULL * 1024ULL)) {
- /* G. */
- if (a_size < 10ULL * 1024ULL * 1024ULL * 1024ULL) {
- /* 9.99G. */
- printf("%1.2fG",
- ((double)a_size) / (1024 * 1024 * 1024));
- } else if (a_size < 100ULL * 1024ULL * 1024ULL * 1024ULL) {
- /* 99.9G. */
- printf("%2.1fG",
- ((double)a_size) / (1024 * 1024 * 1024));
- } else {
- /* 1023G */
- printf("%4lluG",
- a_size / (1024ULL * 1024ULL * 1024ULL));
- }
- } else if (a_size < (1024ULL * 1024ULL * 1024ULL * 1024ULL)) {
- /* T. */
- if (a_size < 10ULL * 1024ULL * 1024ULL * 1024ULL * 1024ULL) {
- /* 9.99T. */
- printf("%1.2fT",
- ((double)a_size) /
- (1024ULL * 1024ULL * 1024ULL * 1024ULL));
- } else if (a_size < (100ULL * 1024ULL * 1024ULL * 1024ULL
- * 1024ULL)) {
- /* 99.9T. */
- printf("%2.1fT",
- ((double)a_size) /
- (1024ULL * 1024ULL * 1024ULL * 1024ULL));
- } else {
- /* 1023T */
- printf("%4lluT",
- a_size /
- (1024ULL * 1024ULL * 1024ULL * 1024ULL));
- }
- } else {
- /* P. */
- if (a_size < (10ULL * 1024ULL * 1024ULL * 1024ULL * 1024ULL
- * 1024ULL)) {
- /* 9.99P. */
- printf("%1.2fP",
- ((double)a_size) /
- (1024ULL * 1024ULL * 1024ULL * 1024ULL
- * 1024ULL));
- } else if (a_size < (100ULL * 1024ULL * 1024ULL * 1024ULL
- * 1024ULL)) {
- /* 99.9P. */
- printf("%2.1fP",
- ((double)a_size) /
- (1024ULL * 1024ULL * 1024ULL * 1024ULL
- * 1024ULL));
- } else {
- /* 1023P */
- printf("%4lluP",
- a_size /
- (1024ULL * 1024ULL * 1024ULL * 1024ULL
- * 1024ULL));
- }
- }
-}
-#endif // _DEBUG
--
BOINC packaging
More information about the pkg-boinc-commits
mailing list