From: <haw...@us...> - 2008-10-30 18:17:21
|
Revision: 209 http://pgsqlformac.svn.sourceforge.net/pgsqlformac/?rev=209&view=rev Author: hawkmoon Date: 2008-10-30 18:17:07 +0000 (Thu, 30 Oct 2008) Log Message: ----------- Added Preference Pane rough code, this is not the current status from Dru, but an older code drop. Added Paths: ----------- trunk/PreferencePane/ trunk/PreferencePane/PostgreSQL Server/ trunk/PreferencePane/PostgreSQL Server/AGProcess.h trunk/PreferencePane/PostgreSQL Server/AGProcess.m trunk/PreferencePane/PostgreSQL Server/English.lproj/ trunk/PreferencePane/PostgreSQL Server/English.lproj/InfoPlist.strings trunk/PreferencePane/PostgreSQL Server/English.lproj/PostgreSQL_ServerPref.xib trunk/PreferencePane/PostgreSQL Server/Info.plist trunk/PreferencePane/PostgreSQL Server/PostgreSQL Server.xcodeproj/ trunk/PreferencePane/PostgreSQL Server/PostgreSQL Server.xcodeproj/project.pbxproj trunk/PreferencePane/PostgreSQL Server/PostgreSQL Server_Prefix.pch trunk/PreferencePane/PostgreSQL Server/PostgreSQL_ServerPref.h trunk/PreferencePane/PostgreSQL Server/PostgreSQL_ServerPref.m trunk/PreferencePane/PostgreSQL Server/PostgreSQL_ServerPref.tiff trunk/PreferencePane/PostgreSQL Server/Utilities/ trunk/PreferencePane/PostgreSQL Server/Utilities/PostgreSQL Network Configuration/ trunk/PreferencePane/PostgreSQL Server/Utilities/PostgreSQL Network Configuration/English.lproj/ trunk/PreferencePane/PostgreSQL Server/Utilities/PostgreSQL Network Configuration/English.lproj/InfoPlist.strings trunk/PreferencePane/PostgreSQL Server/Utilities/PostgreSQL Network Configuration/English.lproj/MainMenu.xib trunk/PreferencePane/PostgreSQL Server/Utilities/PostgreSQL Network Configuration/Info.plist trunk/PreferencePane/PostgreSQL Server/Utilities/PostgreSQL Network Configuration/PostgreSQL Network Configuration.xcodeproj/ trunk/PreferencePane/PostgreSQL Server/Utilities/PostgreSQL Network Configuration/PostgreSQL Network Configuration.xcodeproj/TemplateIcon.icns trunk/PreferencePane/PostgreSQL Server/Utilities/PostgreSQL Network Configuration/PostgreSQL Network Configuration.xcodeproj/project.pbxproj trunk/PreferencePane/PostgreSQL Server/Utilities/PostgreSQL Network Configuration/PostgreSQL Network Configuration_Prefix.pch trunk/PreferencePane/PostgreSQL Server/Utilities/PostgreSQL Network Configuration/main.m trunk/PreferencePane/PostgreSQL Server/Xserve 42U.icns trunk/PreferencePane/PostgreSQL Server/data-folder.png trunk/PreferencePane/PostgreSQL Server/lock_32.png trunk/PreferencePane/PostgreSQL Server/ntwrk_32.png trunk/PreferencePane/PostgreSQL Server/postgres-logo.png trunk/PreferencePane/PostgreSQL Server/prefs_32.png trunk/PreferencePane/PostgreSQL Server/restart.png trunk/PreferencePane/PostgreSQL Server/security_32.png trunk/PreferencePane/PostgreSQL Server/start.png trunk/PreferencePane/PostgreSQL Server/stop.png trunk/PreferencePane/PostgreSQL Server/ulock_32.png trunk/PreferencePane/PostgreSQL Server/xserve-alert.png trunk/PreferencePane/PostgreSQL Server/xserve-running.png trunk/PreferencePane/PostgreSQL Server/xserve-stopped.png trunk/PreferencePane/PostgreSQL Server/xserve-unknown.png Added: trunk/PreferencePane/PostgreSQL Server/AGProcess.h =================================================================== --- trunk/PreferencePane/PostgreSQL Server/AGProcess.h (rev 0) +++ trunk/PreferencePane/PostgreSQL Server/AGProcess.h 2008-10-30 18:17:07 UTC (rev 209) @@ -0,0 +1,313 @@ +// AGProcess.h +// +// Copyright (c) 2002 Aram Greenman. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import <Foundation/NSObject.h> +#include <mach/mach_types.h> + +/*! +@constant AGProcessValueUnknown +Indicates that the value of a statistic couldn't be determined. */ +enum { + AGProcessValueUnknown = 0xffffffff +}; + +/*! +@enum AGProcessState +Possible return values for -[AGProcess state]. +@constant AGProcessStateUnknown The state couldn't be determined. +@constant AGProcessStateRunnable The process is runnable. +@constant AGProcessStateUninterruptible The process is in disk or other uninterruptible wait. +@constant AGProcessStateSleeping The process has been sleeping for 20 seconds or less. +@constant AGProcessStateIdle The process has been sleeping for more than 20 seconds. +@constant AGProcessStateSuspended The process is suspended. +@constant AGProcessStateZombie The process has exited but the parent has not yet waited for it. +@constant AGProcessStateExited The process has exited. +*/ +typedef enum _AGProcessState { + AGProcessStateUnknown, + AGProcessStateRunnable, + AGProcessStateUninterruptible, + AGProcessStateSleeping, + AGProcessStateIdle, + AGProcessStateSuspended, + AGProcessStateZombie, + AGProcessStateExited +} AGProcessState; + +@class NSString, NSArray, NSDictionary; + +/*! +@class AGProcess +@abstract A class for reporting Unix process statistics. +@discussion AGProcess is a class for reporting Unix process statistics. It is similar to NSProcessInfo except that it provides more information, and can represent any process, not just the current process. Additionally it provides methods for sending signals to processes. + +Instances are created with -initWithProcessIdentifier: or +processForProcessIdentifier:, but several convenience methods exist for obtaining instances based on other information, the most useful being +currentProcess, +allProcesses, and +userProcess. + +The level of information an AGProcess can return depends on the user's permission. In general, a user can obtain general information like the arguments or process ID for any process, but can only obtain CPU and memory usage statistics for their own processes, unless they are root. Also, no information is available after the process has exited except the process ID and the state (AGProcessStateZombie or AGProcessStateExited). Methods which return a numerical value will return AGProcessValueUnknown if the statistic can't be obtained. +*/ +@interface AGProcess : NSObject { + int process; + task_t task; + NSString *command; + NSArray *arguments; + NSDictionary *environment; +} + +/*! +@method initWithProcessIdentifier: +Initializes the receiver with the given process identifier. Returns nil if no such process exists. */ +- (id)initWithProcessIdentifier:(int)pid; + +/*! +@method currentProcess +Returns the current process. */ ++ (AGProcess *)currentProcess; + +/*! +@method allProcesses +Returns an array of all processes. */ ++ (NSArray *)allProcesses; + +/*! +@method userProcesses +Returns an array of all processes running for the current user. */ ++ (NSArray *)userProcesses; + +/*! +@method processForProcessIdentifier: +Returns the process for the given process identifier, or nil if no such process exists. */ ++ (AGProcess *)processForProcessIdentifier:(int)pid; + +/*! +@method processesForProcessGroup: +Returns an array of all processes in the given process group. */ ++ (NSArray *)processesForProcessGroup:(int)pgid; + +/*! +@method processesForTerminal: +Returns an array of all processes running on the given terminal. Takes a terminal device number. */ ++ (NSArray *)processesForTerminal:(int)tdev; + +/*! +@method processesForUser: +Returns an array of all processes for the given user. */ ++ (NSArray *)processesForUser:(int)uid; + +/*! +@method processesForRealUser: +Returns an array of all processes for the given real user. */ ++ (NSArray *)processesForRealUser:(int)ruid; + +/*! +@method processForCommand: +Returns the process for the given command, or nil if no such process exists. If there is more than one process with the same command, there is no guarantee which will be returned. */ ++ (AGProcess *)processForCommand:(NSString *)comm; + +/*! +@method processesForCommand: +Returns an array of all processes for the given command. */ ++ (NSArray *)processesForCommand:(NSString *)comm; + +/*! +@method processIdentifier +Returns the process identifier. */ +- (int)processIdentifier; + +/*! +@method parentProcessIdentifier +Returns the parent process identifier. */ +- (int)parentProcessIdentifier; + +/*! +@method processGroup +Returns the process group. */ +- (int)processGroup; + +/*! +@method terminal +Returns the terminal device number. */ +- (int)terminal; + +/*! +@method terminalProcessGroup +Returns the terminal process group. */ +- (int)terminalProcessGroup; + +/*! +@method userIdentifier +Returns the user identifier. */ +- (int)userIdentifier; + +/*! +@method realUserIdentifier +Returns the real user identifier. */ +- (int)realUserIdentifier; + +/*! +@method percentCPUUsage +Returns the current CPU usage in the range 0.0 - 1.0. */ +- (double)percentCPUUsage; + +/*! +@method totalCPUTime +Returns the accumulated CPU time in seconds. */ +- (double)totalCPUTime; + +/*! +@method userCPUTime +Returns the accumulated user CPU time in seconds. */ +- (double)userCPUTime; + +/*! +@method systemCPUTime +Returns the accumulated system CPU time in seconds. */ +- (double)systemCPUTime; + +/*! +@method percentMemoryUsage +Returns resident memory usage as a fraction of the host's physical memory in the range 0.0 - 1.0. */ +- (double)percentMemoryUsage; + +/*! +@method virtualMemorySize +Returns the virtual memory size in bytes. */ +- (unsigned)virtualMemorySize; + +/*! +@method residentMemorySize +Returns the resident memory size in bytes. */ +- (unsigned)residentMemorySize; + +/*! +@method state +Returns the current state. Possible values are defined by AGProcessState. */ +- (AGProcessState)state; + +/*! +@method priority +Returns the current priority. */ +- (int)priority; + +/*! +@method basePriority +Returns the base priority. */ +- (int)basePriority; + +/*! +@method threadCount +Returns the number of threads. */ +- (int)threadCount; + +/*! +@method command +Attempts to return the command that was called to execute the process. If that fails, attempts to return the accounting name. If that fails, returns an empty string. */ +- (NSString *)command; + +/*! +@method arguments +Returns an array containing the command line arguments called to execute the process. This method is not perfectly reliable. */ +- (NSArray *)arguments; + +/*! +@method environment +Returns a dictionary containing the environment variables of the process. This method is not perfectly reliable. */ +- (NSDictionary *)environment; + +/*! +@method parent +Returns the parent process. */ +- (AGProcess *)parent; + +/*! +@method children +Returns an array containing the process's children, if any. */ +- (NSArray *)children; + +/*! +@method siblings +Returns an array containing the process's siblings, if any. */ +- (NSArray *)siblings; + +@end + +@interface AGProcess (Signals) + +/*! +@method suspend +Sends SIGSTOP. */ +- (BOOL)suspend; + +/*! +@method resume +Sends SIGCONT. */ +- (BOOL)resume; + +/*! +@method interrupt +Sends SIGINT. */ +- (BOOL)interrupt; + +/*! +@method terminate +Sends SIGTERM. */ +- (BOOL)terminate; + +/* +@method kill: +Sends the given signal, see man 3 signal for possible values. Returns NO if the signal couldn't be sent. */ +- (BOOL)kill:(int)signal; + +@end + +@interface AGProcess (MachTaskEvents) + +/*! +@method faults +Returns the number of page faults. */ +- (int)faults; + +/*! +@method pageins +Returns the number of pageins. */ +- (int)pageins; + +/*! +@method copyOnWriteFaults +Returns the number of copy on write faults. */ +- (int)copyOnWriteFaults; + +/*! +@method messagesSent +Returns the number of Mach messages sent. */ +- (int)messagesSent; + +/*! +@method messagesReceived +Returns the number of Mach messages received. */ +- (int)messagesReceived; + +/*! +@method machSystemCalls +Returns the number of Mach system calls. */ +- (int)machSystemCalls; + +/*! +@method unixSystemCalls +Returns the number of Unix system calls. */ +- (int)unixSystemCalls; + +/*! +@method contextSwitches +Returns the number of context switches. */ +- (int)contextSwitches; + +@end Added: trunk/PreferencePane/PostgreSQL Server/AGProcess.m =================================================================== --- trunk/PreferencePane/PostgreSQL Server/AGProcess.m (rev 0) +++ trunk/PreferencePane/PostgreSQL Server/AGProcess.m 2008-10-30 18:17:07 UTC (rev 209) @@ -0,0 +1,842 @@ +// AGProcess.m +// +// Copyright (c) 2002 Aram Greenman. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Version History: +// +// 0.1 - February 13, 2003 +// Initial release - Aram Greenman +// +// 0.2 - August 4, 2003 +// Added code to check OS versions in computations for task memory usage - Aram Greenman +// Added methods to retrieve task events (pageins, faults, etc.) - Craig Hockenberry +// Fixed compilation warnings in AGGetMachThreadPriority - Craig Hockenberry +// Fixed -siblings to exclude the receiver - Steve Gehrman + +#import "AGProcess.h" +#import <Foundation/Foundation.h> +#include <mach/mach_host.h> +#include <mach/mach_port.h> +#include <mach/mach_traps.h> +#include <mach/shared_memory_server.h> +#include <mach/task.h> +#include <mach/thread_act.h> +#include <mach/vm_map.h> +#include <sys/param.h> +#include <sys/sysctl.h> +#include <sys/types.h> +#include <signal.h> +#include <unistd.h> + +static unsigned global_shared_text_segment; +static unsigned shared_data_region_size; +static unsigned shared_text_region_size; + +// call this before any of the AGGetMach... functions +// sets the correct split library segment for running kernel +// should work at least through Darwin 6.6 (Mac OS X 10.2.6) +static kern_return_t +AGMachStatsInit() { + int mib[2] = {CTL_KERN, KERN_OSRELEASE}; + size_t len = 256; + char rel[len]; + + if (sysctl(mib, 2, &rel, &len, NULL, 0) < 0) + return KERN_FAILURE; + + // kernel version < 6.0 (Mac OS X 10.2) + if (strcmp(rel, "6") < 0) { + global_shared_text_segment = 0x70000000; + shared_data_region_size = 0x10000000; + shared_text_region_size = 0x10000000; + } + // use values defined for the kernel we built under + else { + global_shared_text_segment = GLOBAL_SHARED_TEXT_SEGMENT; + shared_data_region_size = SHARED_DATA_REGION_SIZE; + shared_text_region_size = SHARED_TEXT_REGION_SIZE; + } + + return KERN_SUCCESS; +} + +static kern_return_t +AGGetMachTaskMemoryUsage(task_t task, unsigned *virtual_size, unsigned *resident_size, double *percent) { + kern_return_t error; + struct task_basic_info t_info; + struct host_basic_info h_info; + struct vm_region_basic_info_64 vm_info; + mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT, h_info_count = HOST_BASIC_INFO_COUNT, vm_info_count = VM_REGION_BASIC_INFO_COUNT_64; + vm_address_t address = global_shared_text_segment; + vm_size_t size; + mach_port_t object_name; + + if ((error = task_info(task, TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count)) != KERN_SUCCESS) + return error; + if ((error = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&h_info, &h_info_count)) != KERN_SUCCESS) + return error; + + // check for firmware split libraries + // this is copied from the ps source code + if ((error = vm_region_64(task, &address, &size, VM_REGION_BASIC_INFO, (vm_region_info_t)&vm_info, &vm_info_count, &object_name)) != KERN_SUCCESS) + return error; + + if (vm_info.reserved && size == shared_text_region_size && t_info.virtual_size > (shared_text_region_size + shared_data_region_size)) + t_info.virtual_size -= (shared_text_region_size + shared_data_region_size); + + if (virtual_size != NULL) *virtual_size = t_info.virtual_size; + if (resident_size != NULL) *resident_size = t_info.resident_size; + if (percent != NULL) *percent = (double)t_info.resident_size / h_info.memory_size; + + return error; +} + +static kern_return_t +AGGetMachThreadCPUUsage(thread_t thread, double *user_time, double *system_time, double *percent) { + kern_return_t error; + struct thread_basic_info th_info; + mach_msg_type_number_t th_info_count = THREAD_BASIC_INFO_COUNT; + + if ((error = thread_info(thread, THREAD_BASIC_INFO, (thread_info_t)&th_info, &th_info_count)) != KERN_SUCCESS) + return error; + + if (user_time != NULL) *user_time = th_info.user_time.seconds + th_info.user_time.microseconds / 1e6; + if (system_time != NULL) *system_time = th_info.system_time.seconds + th_info.system_time.microseconds / 1e6; + if (percent != NULL) *percent = (double)th_info.cpu_usage / TH_USAGE_SCALE; + + return error; +} + +static kern_return_t +AGGetMachTaskCPUUsage(task_t task, double *user_time, double *system_time, double *percent) { + kern_return_t error; + struct task_basic_info t_info; + thread_array_t th_array; + mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT, th_count; + int i; + double my_user_time = 0, my_system_time = 0, my_percent = 0; + + if ((error = task_info(task, TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count)) != KERN_SUCCESS) + return error; + if ((error = task_threads(task, &th_array, &th_count)) != KERN_SUCCESS) + return error; + + // sum time for live threads + for (i = 0; i < th_count; i++) { + double th_user_time, th_system_time, th_percent; + if ((error = AGGetMachThreadCPUUsage(th_array[i], &th_user_time, &th_system_time, &th_percent)) != KERN_SUCCESS) + break; + my_user_time += th_user_time; + my_system_time += th_system_time; + my_percent += th_percent; + } + + // destroy thread array + for (i = 0; i < th_count; i++) + mach_port_deallocate(mach_task_self(), th_array[i]); + vm_deallocate(mach_task_self(), (vm_address_t)th_array, sizeof(thread_t) * th_count); + + // check last error + if (error != KERN_SUCCESS) + return error; + + // add time for dead threads + my_user_time += t_info.user_time.seconds + t_info.user_time.microseconds / 1e6; + my_system_time += t_info.system_time.seconds + t_info.system_time.microseconds / 1e6; + + if (user_time != NULL) *user_time = my_user_time; + if (system_time != NULL) *system_time = my_system_time; + if (percent != NULL) *percent = my_percent; + + return error; +} + +static kern_return_t +AGGetMachThreadPriority(thread_t thread, int *current_priority, int *base_priority) { + kern_return_t error; + struct thread_basic_info th_info; + mach_msg_type_number_t th_info_count = THREAD_BASIC_INFO_COUNT; + int my_current_priority = 0, my_base_priority = 0; + + if ((error = thread_info(thread, THREAD_BASIC_INFO, (thread_info_t)&th_info, &th_info_count)) != KERN_SUCCESS) + return error; + + switch (th_info.policy) { + case POLICY_TIMESHARE: { + struct policy_timeshare_info pol_info; + mach_msg_type_number_t pol_info_count = POLICY_TIMESHARE_INFO_COUNT; + + if ((error = thread_info(thread, THREAD_SCHED_TIMESHARE_INFO, (thread_info_t)&pol_info, &pol_info_count)) != KERN_SUCCESS) + return error; + my_current_priority = pol_info.cur_priority; + my_base_priority = pol_info.base_priority; + break; + } case POLICY_RR: { + struct policy_rr_info pol_info; + mach_msg_type_number_t pol_info_count = POLICY_RR_INFO_COUNT; + + if ((error = thread_info(thread, THREAD_SCHED_RR_INFO, (thread_info_t)&pol_info, &pol_info_count)) != KERN_SUCCESS) + return error; + my_current_priority = my_base_priority = pol_info.base_priority; + break; + } case POLICY_FIFO: { + struct policy_fifo_info pol_info; + mach_msg_type_number_t pol_info_count = POLICY_FIFO_INFO_COUNT; + + if ((error = thread_info(thread, THREAD_SCHED_FIFO_INFO, (thread_info_t)&pol_info, &pol_info_count)) != KERN_SUCCESS) + return error; + my_current_priority = my_base_priority = pol_info.base_priority; + break; + } + } + + if (current_priority != NULL) *current_priority = my_current_priority; + if (base_priority != NULL) *base_priority = my_base_priority; + + return error; +} + +static kern_return_t +AGGetMachTaskPriority(task_t task, int *current_priority, int *base_priority) { + kern_return_t error; + thread_array_t th_array; + mach_msg_type_number_t th_count; + int i; + int my_current_priority = 0, my_base_priority = 0; + + if ((error = task_threads(task, &th_array, &th_count)) != KERN_SUCCESS) + return error; + + for (i = 0; i < th_count; i++) { + int th_current_priority, th_base_priority; + if ((error = AGGetMachThreadPriority(th_array[i], &th_current_priority, &th_base_priority)) != KERN_SUCCESS) + break; + if (th_current_priority > my_current_priority) + my_current_priority = th_current_priority; + if (th_base_priority > my_base_priority) + my_base_priority = th_base_priority; + } + + // destroy thread array + for (i = 0; i < th_count; i++) + mach_port_deallocate(mach_task_self(), th_array[i]); + vm_deallocate(mach_task_self(), (vm_address_t)th_array, sizeof(thread_t) * th_count); + + // check last error + if (error != KERN_SUCCESS) + return error; + + if (current_priority != NULL) *current_priority = my_current_priority; + if (base_priority != NULL) *base_priority = my_base_priority; + + return error; +} + +static kern_return_t +AGGetMachThreadState(thread_t thread, int *state) { + kern_return_t error; + struct thread_basic_info th_info; + mach_msg_type_number_t th_info_count = THREAD_BASIC_INFO_COUNT; + int my_state; + + if ((error = thread_info(thread, THREAD_BASIC_INFO, (thread_info_t)&th_info, &th_info_count)) != KERN_SUCCESS) + return error; + + switch (th_info.run_state) { + case TH_STATE_RUNNING: + my_state = AGProcessStateRunnable; + break; + case TH_STATE_UNINTERRUPTIBLE: + my_state = AGProcessStateUninterruptible; + break; + case TH_STATE_WAITING: + my_state = th_info.sleep_time > 20 ? AGProcessStateIdle : AGProcessStateSleeping; + break; + case TH_STATE_STOPPED: + my_state = AGProcessStateSuspended; + break; + case TH_STATE_HALTED: + my_state = AGProcessStateZombie; + break; + default: + my_state = AGProcessStateUnknown; + } + + if (state != NULL) *state = my_state; + + return error; +} + +static kern_return_t +AGGetMachTaskState(task_t task, int *state) { + kern_return_t error; + thread_array_t th_array; + mach_msg_type_number_t th_count; + int i; + int my_state = INT_MAX; + + if ((error = task_threads(task, &th_array, &th_count)) != KERN_SUCCESS) + return error; + + for (i = 0; i < th_count; i++) { + int th_state; + if ((error = AGGetMachThreadState(th_array[i], &th_state)) != KERN_SUCCESS) + break; + // most active state takes precedence + if (th_state < my_state) + my_state = th_state; + } + + // destroy thread array + for (i = 0; i < th_count; i++) + mach_port_deallocate(mach_task_self(), th_array[i]); + vm_deallocate(mach_task_self(), (vm_address_t)th_array, sizeof(thread_t) * th_count); + + // check last error + if (error != KERN_SUCCESS) + return error; + + if (state != NULL) *state = my_state; + + return error; +} + +static kern_return_t +AGGetMachTaskThreadCount(task_t task, int *count) { + kern_return_t error; + thread_array_t th_array; + mach_msg_type_number_t th_count; + int i; + + if ((error = task_threads(task, &th_array, &th_count)) != KERN_SUCCESS) + return error; + + for (i = 0; i < th_count; i++) + mach_port_deallocate(mach_task_self(), th_array[i]); + vm_deallocate(mach_task_self(), (vm_address_t)th_array, sizeof(thread_t) * th_count); + + if (count != NULL) *count = th_count; + + return error; +} + +static kern_return_t +AGGetMachTaskEvents(task_t task, int *faults, int *pageins, int *cow_faults, int *messages_sent, int *messages_received, int *syscalls_mach, int *syscalls_unix, int *csw) { + kern_return_t error; + task_events_info_data_t t_events_info; + mach_msg_type_number_t t_events_info_count = TASK_EVENTS_INFO_COUNT; + + if ((error = task_info(task, TASK_EVENTS_INFO, (task_info_t)&t_events_info, &t_events_info_count)) != KERN_SUCCESS) + return error; + + if (faults != NULL) *faults = t_events_info.faults; + if (pageins != NULL) *pageins = t_events_info.pageins; + if (cow_faults != NULL) *cow_faults = t_events_info.cow_faults; + if (messages_sent != NULL) *messages_sent = t_events_info.messages_sent; + if (messages_received != NULL) *messages_received = t_events_info.messages_received; + if (syscalls_mach != NULL) *syscalls_mach = t_events_info.syscalls_mach; + if (syscalls_unix != NULL) *syscalls_unix = t_events_info.syscalls_unix; + if (csw != NULL) *csw = t_events_info.csw; + + return error; +} + +@interface AGProcess (Private) ++ (NSArray *)processesForThirdLevelName:(int)name value:(int)value; +- (void)doProcargs; +@end + +@implementation AGProcess (Private) + ++ (NSArray *)processesForThirdLevelName:(int)name value:(int)value { + AGProcess *proc; + NSMutableArray *processes = [NSMutableArray array]; + int mib[4] = { CTL_KERN, KERN_PROC, name, value }; + struct kinfo_proc *info; + size_t length; + int level, count, i; + + // KERN_PROC_ALL has 3 elements, all others have 4 + level = name == KERN_PROC_ALL ? 3 : 4; + + if (sysctl(mib, level, NULL, &length, NULL, 0) < 0) + return processes; + if (!(info = NSZoneMalloc(NULL, length))) + return processes; + if (sysctl(mib, level, info, &length, NULL, 0) < 0) { + NSZoneFree(NULL, info); + return processes; + } + + // number of processes + count = length / sizeof(struct kinfo_proc); + + for (i = 0; i < count; i++) { + if (proc = [[self alloc] initWithProcessIdentifier:info[i].kp_proc.p_pid]) + [processes addObject:proc]; + [proc release]; + } + + NSZoneFree(NULL, info); + return processes; +} + +- (void)doProcargs { + id args = [NSMutableArray array]; + id env = [NSMutableDictionary dictionary]; + size_t length = 4096; // max buffer accepted by sysctl() KERN_PROCARGS + char buffer[length + 1]; + int mib[3] = { CTL_KERN, KERN_PROCARGS, process }; + int offset, last_offset, i; + BOOL word; + char c; + + // make sure this is only executed once for an instance + if (command) + return; + + if (sysctl(mib, 3, buffer, &length, NULL, 0) < 0) { + // probably a zombie or exited proc, try to at least get the accounting name + struct kinfo_proc info; + size_t length = sizeof(struct kinfo_proc); + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process }; + + if (sysctl(mib, 4, &info, &length, NULL, 0) < 0) + command = [[NSString alloc] init]; + else + command = [[NSString alloc] initWithCString:info.kp_proc.p_comm]; + } else { + // find the comm string, should be the first non-garbage string in the buffer + offset = last_offset = 0; + buffer[length] = NULL; // prevent buffer overrun + + do { + for ( ; offset < length; offset++) { + if (buffer[offset]) { // found a chunk of data + last_offset = offset; + word = YES; + for ( ; offset < length; offset++) { + if (!(c = buffer[offset])) // reached end of data + break; + if (!(isprint(c))) // found a non-printing character + word = NO; + } + if (word) + break; + } + } + command = [[NSString stringWithCString:buffer + last_offset] lastPathComponent]; + } while ([command isEqualToString:@"LaunchCFMApp"]); // skip LaunchCFMApp + + [command retain]; + + // get rest of args and env + for ( ; offset < length; offset++) { + if (buffer[offset]) { + NSString *string = [NSString stringWithCString:buffer + offset]; + [args addObject:string]; + offset += [string cStringLength]; + } + } + + // count backwards past env + // first string which does not contain an '=' should usually be the last arg + for (i = [args count] - 1; i > 0; i--) { + NSString *string = [args objectAtIndex:i]; + int index = [string rangeOfString:@"="].location; + if (index == NSNotFound) + break; + [env setObject:[string substringFromIndex:index + 1] forKey:[string substringToIndex:index]]; + } + args = [args subarrayWithRange:NSMakeRange(0, i + 1)]; + } + + if (![args count]) + args = [NSArray arrayWithObject:command]; + arguments = [args retain]; + environment = [env retain]; +} + +@end + +@implementation AGProcess + ++ (void)initialize { + AGMachStatsInit(); + [super initialize]; +} + +- (id)initWithProcessIdentifier:(int)pid { + if (self = [super init]) { + process = pid; + if (task_for_pid(mach_task_self(), process, &task) != KERN_SUCCESS) + task = MACH_PORT_NULL; + if ([self state] == AGProcessStateExited) { + [self release]; + return nil; + } + } + return self; +} + ++ (AGProcess *)currentProcess { + return [self processForProcessIdentifier:getpid()]; +} + ++ (NSArray *)allProcesses { + return [self processesForThirdLevelName:KERN_PROC_ALL value:0]; +} + ++ (NSArray *)userProcesses { + return [self processesForUser:geteuid()]; +} + ++ (AGProcess *)processForProcessIdentifier:(int)pid { + return [[[self alloc] initWithProcessIdentifier:pid] autorelease]; +} + ++ (NSArray *)processesForProcessGroup:(int)pgid { + return [self processesForThirdLevelName:KERN_PROC_PGRP value:pgid]; +} + ++ (NSArray *)processesForTerminal:(int)tty { + return [self processesForThirdLevelName:KERN_PROC_TTY value:tty]; +} + ++ (NSArray *)processesForUser:(int)uid { + return [self processesForThirdLevelName:KERN_PROC_UID value:uid]; +} + ++ (NSArray *)processesForRealUser:(int)ruid { + return [self processesForThirdLevelName:KERN_PROC_RUID value:ruid]; +} + ++ (NSArray *)processesForCommand:(NSString *)comm { + NSArray *all = [self allProcesses]; + NSMutableArray *result = [NSMutableArray array]; + int i, count = [all count]; + for (i = 0; i < count; i++) + if ([[[all objectAtIndex:i] command] isEqualToString:comm]) + [result addObject:[all objectAtIndex:i]]; + return result; +} + ++ (AGProcess *)processForCommand:(NSString *)comm { + NSArray *processes = [self processesForCommand:comm]; + if ([processes count]) + return [processes objectAtIndex:0]; + return nil; +} + +- (int)processIdentifier { + return process; +} + +- (int)parentProcessIdentifier { + struct kinfo_proc info; + size_t length = sizeof(struct kinfo_proc); + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process }; + if (sysctl(mib, 4, &info, &length, NULL, 0) < 0) + return AGProcessValueUnknown; + if (length == 0) + return AGProcessValueUnknown; + return info.kp_eproc.e_ppid; +} + +- (int)processGroup { + struct kinfo_proc info; + size_t length = sizeof(struct kinfo_proc); + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process }; + if (sysctl(mib, 4, &info, &length, NULL, 0) < 0) + return AGProcessValueUnknown; + if (length == 0) + return AGProcessValueUnknown; + return info.kp_eproc.e_pgid; +} + +- (int)terminal { + struct kinfo_proc info; + size_t length = sizeof(struct kinfo_proc); + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process }; + if (sysctl(mib, 4, &info, &length, NULL, 0) < 0) + return AGProcessValueUnknown; + if (length == 0 || info.kp_eproc.e_tdev == 0) + return AGProcessValueUnknown; + return info.kp_eproc.e_tdev; +} + +- (int)terminalProcessGroup { + struct kinfo_proc info; + size_t length = sizeof(struct kinfo_proc); + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process }; + if (sysctl(mib, 4, &info, &length, NULL, 0) < 0) + return AGProcessValueUnknown; + if (length == 0 || info.kp_eproc.e_tpgid == 0) + return AGProcessValueUnknown; + return info.kp_eproc.e_tpgid; +} + +- (int)userIdentifier { + struct kinfo_proc info; + size_t length = sizeof(struct kinfo_proc); + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process }; + if (sysctl(mib, 4, &info, &length, NULL, 0) < 0) + return AGProcessValueUnknown; + if (length == 0) + return AGProcessValueUnknown; + return info.kp_eproc.e_ucred.cr_uid; +} + +- (int)realUserIdentifier { + struct kinfo_proc info; + size_t length = sizeof(struct kinfo_proc); + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process }; + if (sysctl(mib, 4, &info, &length, NULL, 0) < 0) + return AGProcessValueUnknown; + if (length == 0) + return AGProcessValueUnknown; + return info.kp_eproc.e_pcred.p_ruid; +} + +- (NSString *)command { + [self doProcargs]; + return command; +} + +- (NSArray *)arguments { + [self doProcargs]; + return arguments; +} + +- (NSDictionary *)environment { + [self doProcargs]; + return environment; +} + +- (AGProcess *)parent { + return [[self class] processForProcessIdentifier:[self parentProcessIdentifier]]; +} + +- (NSArray *)children { + NSArray *all = [[self class] allProcesses]; + NSMutableArray *children = [NSMutableArray array]; + int i, count = [all count]; + for (i = 0; i < count; i++) + if ([[all objectAtIndex:i] parentProcessIdentifier] == process) + [children addObject:[all objectAtIndex:i]]; + return children; +} + +- (NSArray *)siblings { + NSArray *all = [[self class] allProcesses]; + NSMutableArray *siblings = [NSMutableArray array]; + int i, count = [all count], ppid = [self parentProcessIdentifier]; + for (i = 0; i < count; i++) { + AGProcess *p = [all objectAtIndex:i]; + if ([p parentProcessIdentifier] == ppid && [p processIdentifier] != process) + [siblings addObject:p]; + } + return siblings; +} + +- (double)percentCPUUsage { + double percent; + if (AGGetMachTaskCPUUsage(task, NULL, NULL, &percent) != KERN_SUCCESS) + return AGProcessValueUnknown; + return percent; +} + +- (double)totalCPUTime { + double user, system; + if (AGGetMachTaskCPUUsage(task, &user, &system, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return user + system; +} + +- (double)userCPUTime { + double user; + if (AGGetMachTaskCPUUsage(task, &user, NULL, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return user; +} + +- (double)systemCPUTime { + double system; + if (AGGetMachTaskCPUUsage(task, NULL, &system, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return system; +} + +- (double)percentMemoryUsage { + double percent; + if (AGGetMachTaskMemoryUsage(task, NULL, NULL, &percent) != KERN_SUCCESS) + return AGProcessValueUnknown; + return percent; +} + +- (unsigned)virtualMemorySize { + unsigned size; + if (AGGetMachTaskMemoryUsage(task, &size, NULL, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return size; +} + +- (unsigned)residentMemorySize { + unsigned size; + if (AGGetMachTaskMemoryUsage(task, NULL, &size, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return size; +} + +- (AGProcessState)state { + int state; + struct kinfo_proc info; + size_t length = sizeof(struct kinfo_proc); + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process }; + if (sysctl(mib, 4, &info, &length, NULL, 0) < 0) + return AGProcessStateExited; + if (length == 0) + return AGProcessStateExited; + if (info.kp_proc.p_stat == SZOMB) + return AGProcessStateZombie; + if (AGGetMachTaskState(task, &state) != KERN_SUCCESS) + return AGProcessStateUnknown; + return state; +} + +- (int)priority { + int priority; + if (AGGetMachTaskPriority(task, &priority, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return priority; +} + +- (int)basePriority { + int priority; + if (AGGetMachTaskPriority(task, NULL, &priority) != KERN_SUCCESS) + return AGProcessValueUnknown; + return priority; +} + +- (int)threadCount { + int count; + if (AGGetMachTaskThreadCount(task, &count) != KERN_SUCCESS) + return AGProcessValueUnknown; + return count; +} + +- (unsigned)hash { + return process; +} + +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[self class]]) + return NO; + return process == [(AGProcess *)object processIdentifier]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ process = %d, task = %u, command = %@, arguments = %@, environment = %@", [super description], process, task, [self command], [self arguments], [self environment]]; +} + +- (void)dealloc { + mach_port_deallocate(mach_task_self(), task); + [command release]; + [arguments release]; + [environment release]; + [super dealloc]; +} + +@end + +@implementation AGProcess (Signals) + +- (BOOL)suspend { + return [self kill:SIGSTOP]; +} + +- (BOOL)resume { + return [self kill:SIGCONT]; +} + +- (BOOL)interrupt { + return [self kill:SIGINT]; +} + +- (BOOL)terminate { + return [self kill:SIGTERM]; +} + +- (BOOL)kill:(int)signal { + return kill(process, signal) == 0; +} + +@end + +@implementation AGProcess (MachTaskEvents) + +- (int)faults { + unsigned faults; + if (AGGetMachTaskEvents(task, &faults, NULL, NULL, NULL, NULL, NULL, NULL, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return faults; +} + +- (int)pageins { + int pageins; + if (AGGetMachTaskEvents(task, NULL, &pageins, NULL, NULL, NULL, NULL, NULL, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return pageins; +} + +- (int)copyOnWriteFaults { + int cow_faults; + if (AGGetMachTaskEvents(task, NULL, NULL, &cow_faults, NULL, NULL, NULL, NULL, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return cow_faults; +} + +- (int)messagesSent { + int messages_sent; + if (AGGetMachTaskEvents(task, NULL, NULL, NULL, &messages_sent, NULL, NULL, NULL, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return messages_sent; +} + +- (int)messagesReceived { + int messages_received; + if (AGGetMachTaskEvents(task, NULL, NULL, NULL, NULL, &messages_received, NULL, NULL, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return messages_received; +} + +- (int)machSystemCalls { + int syscalls_mach; + if (AGGetMachTaskEvents(task, NULL, NULL, NULL, NULL, NULL, &syscalls_mach, NULL, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return syscalls_mach; +} + +- (int)unixSystemCalls { + int syscalls_unix; + if (AGGetMachTaskEvents(task, NULL, NULL, NULL, NULL, NULL, NULL, &syscalls_unix, NULL) != KERN_SUCCESS) + return AGProcessValueUnknown; + return syscalls_unix; +} + +- (int)contextSwitches { + int csw; + if (AGGetMachTaskEvents(task, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &csw) != KERN_SUCCESS) + return AGProcessValueUnknown; + return csw; +} + +@end Property changes on: trunk/PreferencePane/PostgreSQL Server/AGProcess.m ___________________________________________________________________ Added: svn:executable + * Added: trunk/PreferencePane/PostgreSQL Server/English.lproj/InfoPlist.strings =================================================================== (Binary files differ) Property changes on: trunk/PreferencePane/PostgreSQL Server/English.lproj/InfoPlist.strings ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/PreferencePane/PostgreSQL Server/English.lproj/PostgreSQL_ServerPref.xib =================================================================== --- trunk/PreferencePane/PostgreSQL Server/English.lproj/PostgreSQL_ServerPref.xib (rev 0) +++ trunk/PreferencePane/PostgreSQL Server/English.lproj/PostgreSQL_ServerPref.xib 2008-10-30 18:17:07 UTC (rev 209) @@ -0,0 +1,1419 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.02"> + <data> + <int key="IBDocument.SystemTarget">1050</int> + <string key="IBDocument.SystemVersion">9E17</string> + <string key="IBDocument.InterfaceBuilderVersion">670</string> + <string key="IBDocument.AppKitVersion">949.33</string> + <string key="IBDocument.HIToolboxVersion">352.00</string> + <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="6"/> + </object> + <object class="NSArray" key="IBDocument.PluginDependencies"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + <object class="NSMutableArray" key="IBDocument.RootObjects" id="409411428"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomObject" id="294453543"> + <string key="NSClassName">PostgreSQL_ServerPref</string> + </object> + <object class="NSCustomObject" id="308860122"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="278121016"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSWindowTemplate" id="660800786"> + <int key="NSWindowStyleMask">7</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{-46, 463}, {661, 345}}</string> + <int key="NSWTFlags">1081606144</int> + <string type="base64-UTF8" key="NSWindowTitle">PDwgZG8gbm90IGxvY2FsaXplID4+A</string> + <string key="NSWindowClass">NSWindow</string> + <object class="NSMutableString" key="NSViewClass"> + <characters key="NS.bytes">View</characters> + </object> + <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string> + <string key="NSWindowContentMinSize">{224.664, 10}</string> + <object class="NSView" key="NSWindowView" id="1037298196"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSImageView" id="627609165"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">268</int> + <object class="NSMutableSet" key="NSDragTypes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="set.sortedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>Apple PDF pasteboard type</string> + <string>Apple PICT pasteboard type</string> + <string>Apple PNG pasteboard type</string> + <string>NSFilenamesPboardType</string> + <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string> + <string>NeXT TIFF v4.0 pasteboard type</string> + </object> + </object> + <string key="NSFrame">{{0, 94}, {289, 251}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <double key="NSViewAlphaValue">4.577465e-01</double> + <bool key="NSEnabled">YES</bool> + <object class="NSImageCell" key="NSCell" id="357708450"> + <int key="NSCellFlags">130560</int> + <int key="NSCellFlags2">33554432</int> + <object class="NSCustomResource" key="NSContents"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">postgres-logo</string> + </object> + <int key="NSAlign">0</int> + <int key="NSScale">0</int> + <int key="NSStyle">0</int> + <bool key="NSAnimates">NO</bool> + </object> + <bool key="NSEditable">YES</bool> + </object> + <object class="NSImageView" id="171549217"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">256</int> + <object class="NSMutableSet" key="NSDragTypes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="set.sortedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>Apple PDF pasteboard type</string> + <string>Apple PICT pasteboard type</string> + <string>Apple PNG pasteboard type</string> + <string>NSFilenamesPboardType</string> + <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string> + <string>NeXT TIFF v4.0 pasteboard type</string> + </object> + </object> + <string key="NSFrame">{{20, 101}, {138, 138}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSImageCell" key="NSCell" id="947598781"> + <int key="NSCellFlags">130560</int> + <int key="NSCellFlags2">33554432</int> + <object class="NSCustomResource" key="NSContents"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">xserve-unknown</string> + </object> + <int key="NSAlign">0</int> + <int key="NSScale">2</int> + <int key="NSStyle">0</int> + <bool key="NSAnimates">NO</bool> + </object> + <bool key="NSEditable">YES</bool> + </object> + <object class="NSButton" id="304276232"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{180, 196}, {40, 42}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="221416573"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <object class="NSFont" key="NSSupport" id="24"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">1.000000e+01</double> + <int key="NSfFlags">16</int> + </object> + <reference key="NSControlView" ref="304276232"/> + <int key="NSButtonFlags">-2037628673</int> + <int key="NSButtonFlags2">2</int> + <object class="NSCustomResource" key="NSNormalImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">start</string> + </object> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </object> + <object class="NSButton" id="39267976"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{180, 152}, {40, 42}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="3864331"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="24"/> + <reference key="NSControlView" ref="39267976"/> + <int key="NSButtonFlags">-2037628673</int> + <int key="NSButtonFlags2">2</int> + <object class="NSCustomResource" key="NSNormalImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">stop</string> + </object> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </object> + <object class="NSButton" id="176611005"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{180, 108}, {40, 42}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="986865757"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="24"/> + <reference key="NSControlView" ref="176611005"/> + <int key="NSButtonFlags">-2037628673</int> + <int key="NSButtonFlags2">2</int> + <object class="NSCustomResource" key="NSNormalImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">restart</string> + </object> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </object> + <object class="NSButton" id="291656672"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{179, 81}, {175, 18}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="398026578"> + <int key="NSCellFlags">604110336</int> + <int key="NSCellFlags2">131072</int> + <string key="NSContents">Auto-start service at boot</string> + <object class="NSFont" key="NSSupport" id="26"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">1.100000e+01</double> + <int key="NSfFlags">3100</int> + </object> + <reference key="NSControlView" ref="291656672"/> + <int key="NSButtonFlags">1211912703</int> + <int key="NSButtonFlags2">2</int> + <object class="NSButtonImageSource" key="NSAlternateImage"> + <string key="NSImageName">NSSwitch</string> + </object> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSTextField" id="1054078456"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{20, 60}, {335, 11}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="295520004"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">4194304</int> + <string key="NSContents">Current Status: Unknown</string> + <object class="NSFont" key="NSSupport"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">9.000000e+00</double> + <int key="NSfFlags">3614</int> + </object> + <reference key="NSControlView" ref="1054078456"/> + <object class="NSColor" key="NSBackgroundColor" id="271454391"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MC41MDE5NjA4MSAwLjUwMTk2MDgxIDAuNTAxOTYwODEAA</bytes> + </object> + </object> + </object> + <object class="NSBox" id="135244490"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{23, 72}, {329, 5}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <string key="NSOffsets">{0, 0}</string> + <object class="NSTextFieldCell" key="NSTitleCell"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Box</string> + <object class="NSFont" key="NSSupport" id="834305099"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">1.300000e+01</double> + <int key="NSfFlags">1044</int> + </object> + <object class="NSColor" key="NSBackgroundColor" id="355701703"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textBackgroundColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MQA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + </object> + </object> + <int key="NSBorderType">3</int> + <int key="NSBoxType">2</int> + <int key="NSTitlePosition">0</int> + <bool key="NSTransparent">NO</bool> + </object> + <object class="NSTextField" id="979487735"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{223, 212}, {80, 13}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="967200391"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">4194304</int> + <string key="NSContents">Start</string> + <object class="NSFont" key="NSSupport" id="776402491"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">1.000000e+01</double> + <int key="NSfFlags">2843</int> + </object> + <reference key="NSControlView" ref="979487735"/> + <reference key="NSBackgroundColor" ref="271454391"/> + <object class="NSColor" key="NSTextColor" id="1027142172"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlTextColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + </object> + </object> + </object> + </object> + <object class="NSTextField" id="609154561"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{223, 168}, {80, 13}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="303770490"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">4194304</int> + <string key="NSContents">Stop</string> + <reference key="NSSupport" ref="776402491"/> + <reference key="NSControlView" ref="609154561"/> + <reference key="NSBackgroundColor" ref="271454391"/> + <reference key="NSTextColor" ref="1027142172"/> + </object> + </object> + <object class="NSTextField" id="140310987"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{223, 124}, {80, 13}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="566973395"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">4194304</int> + <string key="NSContents">Restart</string> + <reference key="NSSupport" ref="776402491"/> + <reference key="NSControlView" ref="140310987"/> + <reference key="NSBackgroundColor" ref="271454391"/> + <reference key="NSTextColor" ref="1027142172"/> + </object> + </object> + <object class="NSProgressIndicator" id="341207287"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">-2147482368</int> + <object class="NSPSMatrix" key="NSDrawMatrix"/> + <string key="NSFrame">{{109, 116}, {32, 32}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <int key="NSpiFlags">28682</int> + <double key="NSMaxValue">1.000000e+02</double> + </object> + <object class="NSTextField" id="582898452"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{57, 26}, {205, 17}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="912924051"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Click the lock to make changes.</string> + <reference key="NSSupport" ref="834305099"/> + <reference key="NSControlView" ref="582898452"/> + <reference key="NSBackgroundColor" ref="271454391"/> + <reference key="NSTextColor" ref="1027142172"/> + </object> + </object> + <object class="NSButton" id="487703545"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{619, 19}, {25, 25}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="520371744"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="834305099"/> + <reference key="NSControlView" ref="487703545"/> + <int key="NSButtonFlags">-2038415105</int> + <int key="NSButtonFlags2">161</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSTextField" id="58562495"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{20, 247}, {335, 78}}</string> + <reference key="NSSuperview" ref="1037298196"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="810169047"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">272891904</int> + <string key="NSContents">Manage PostgreSQL Server on the local host. Start, Stop, Restart as well as change fundamental configurations for the PostgreSQL instance.</string> + <object class="NSFont" key="NSSupport"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">1.300000e+01</double> + <int key="NSfFlags">16</int> + </object> + <reference key="NSControlView" ref="58562495"/> + <reference key="NSBackgroundColor" ref="271454391"/> + <reference key="NSTextColor" ref="1027142172"/> + </object> + </object> + <object class="NSBox" id="328183076"> + <reference key="NSNextResponder" ref="1037298196"/> + <int key="NSvFlags">12</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSView" id="524366641"> + <reference key="NSNextResponder" ref="328183076"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + ... [truncated message content] |