Remove Darwin proc_mem.shared impl
This commit is contained in:
		
							parent
							
								
									6d11590f61
								
							
						
					
					
						commit
						4c4a13570b
					
				@ -1,3 +1,8 @@
 | 
				
			|||||||
 | 
					2006-03-16  Doug MacEachern  <dougm@hyperic.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        * Remove Darwin proc_mem.shared impl.  More trouble that it is
 | 
				
			||||||
 | 
					          worth and the code did not compile on x86.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2006-03-14  Doug MacEachern  <dougm@hyperic.net>
 | 
					2006-03-14  Doug MacEachern  <dougm@hyperic.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        * Enhance native library finder to work with -jar foo.jar and
 | 
					        * Enhance native library finder to work with -jar foo.jar and
 | 
				
			||||||
 | 
				
			|||||||
@ -684,71 +684,6 @@ static int sigar_get_pinfo(sigar_t *sigar, sigar_pid_t pid)
 | 
				
			|||||||
    return SIGAR_OK;
 | 
					    return SIGAR_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DARWIN
 | 
					 | 
				
			||||||
/* this insanity if dervied from Apple's port of 'top' and libgtop patch */
 | 
					 | 
				
			||||||
#define SHARED_TABLE_SIZE   137
 | 
					 | 
				
			||||||
#define TEXT_SEGMENT_START  (GLOBAL_SHARED_TEXT_SEGMENT)
 | 
					 | 
				
			||||||
#define DATA_SEGMENT_END    (GLOBAL_SHARED_DATA_SEGMENT + SHARED_DATA_REGION_SIZE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct shared_info shared_table[SHARED_TABLE_SIZE];
 | 
					 | 
				
			||||||
typedef struct shared_info shared_info;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct shared_info {
 | 
					 | 
				
			||||||
    unsigned obj_id;
 | 
					 | 
				
			||||||
    unsigned share_mode;
 | 
					 | 
				
			||||||
    unsigned page_count;
 | 
					 | 
				
			||||||
    unsigned ref_count;
 | 
					 | 
				
			||||||
    unsigned task_ref_count;
 | 
					 | 
				
			||||||
    vm_size_t size;
 | 
					 | 
				
			||||||
    shared_info *next;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void shared_table_free(shared_table table)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (i=0; i<SHARED_TABLE_SIZE; i++) {
 | 
					 | 
				
			||||||
        shared_info *info = table[i].next;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        while (info) {
 | 
					 | 
				
			||||||
            shared_info *next = info->next;
 | 
					 | 
				
			||||||
            free(info);
 | 
					 | 
				
			||||||
            info = next;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void shared_table_register(shared_table table,
 | 
					 | 
				
			||||||
                                  vm_region_top_info_data_t *top,
 | 
					 | 
				
			||||||
                                  vm_size_t size)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    shared_info *info, *last;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    info = last = &table[top->obj_id % SHARED_TABLE_SIZE];
 | 
					 | 
				
			||||||
    while (info) {
 | 
					 | 
				
			||||||
        if (info->obj_id == top->obj_id) {
 | 
					 | 
				
			||||||
            info->task_ref_count++;
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        last = info;
 | 
					 | 
				
			||||||
        info = info->next;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    info = malloc(sizeof(shared_info));
 | 
					 | 
				
			||||||
    if (info) {
 | 
					 | 
				
			||||||
        info->obj_id = top->obj_id;
 | 
					 | 
				
			||||||
        info->share_mode = top->share_mode;
 | 
					 | 
				
			||||||
        info->page_count = top->shared_pages_resident;
 | 
					 | 
				
			||||||
        info->ref_count = top->ref_count;
 | 
					 | 
				
			||||||
        info->task_ref_count = 1;
 | 
					 | 
				
			||||||
        info->size = size;
 | 
					 | 
				
			||||||
        info->next = NULL;
 | 
					 | 
				
			||||||
        last->next = info;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* DARWIN */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
 | 
					int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
 | 
				
			||||||
                       sigar_proc_mem_t *procmem)
 | 
					                       sigar_proc_mem_t *procmem)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -758,10 +693,6 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
 | 
				
			|||||||
    task_basic_info_data_t info;
 | 
					    task_basic_info_data_t info;
 | 
				
			||||||
    task_events_info_data_t events;
 | 
					    task_events_info_data_t events;
 | 
				
			||||||
    mach_msg_type_number_t count;
 | 
					    mach_msg_type_number_t count;
 | 
				
			||||||
    vm_size_t vsize, private, vprivate, shared;
 | 
					 | 
				
			||||||
    shared_table table;
 | 
					 | 
				
			||||||
    vm_address_t address = 0;
 | 
					 | 
				
			||||||
    int i, split = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    status = task_for_pid(self, pid, &task);
 | 
					    status = task_for_pid(self, pid, &task);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -775,8 +706,6 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
 | 
				
			|||||||
        return errno;
 | 
					        return errno;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    vsize = info.virtual_size;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    count = TASK_EVENTS_INFO_COUNT;
 | 
					    count = TASK_EVENTS_INFO_COUNT;
 | 
				
			||||||
    status = task_info(task, TASK_EVENTS_INFO, (task_info_t)&events, &count);
 | 
					    status = task_info(task, TASK_EVENTS_INFO, (task_info_t)&events, &count);
 | 
				
			||||||
    if (status == KERN_SUCCESS) {
 | 
					    if (status == KERN_SUCCESS) {
 | 
				
			||||||
@ -789,98 +718,13 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
 | 
				
			|||||||
    procmem->minor_faults = SIGAR_FIELD_NOTIMPL;
 | 
					    procmem->minor_faults = SIGAR_FIELD_NOTIMPL;
 | 
				
			||||||
    procmem->major_faults = SIGAR_FIELD_NOTIMPL;
 | 
					    procmem->major_faults = SIGAR_FIELD_NOTIMPL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private = vprivate = shared = 0;
 | 
					 | 
				
			||||||
    memset(table, 0, sizeof(table));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (1) {
 | 
					 | 
				
			||||||
        vm_region_basic_info_data_64_t basic;
 | 
					 | 
				
			||||||
        vm_region_top_info_data_t top;
 | 
					 | 
				
			||||||
        mach_port_t object_name;
 | 
					 | 
				
			||||||
        vm_size_t size;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        count = VM_REGION_BASIC_INFO_COUNT_64;
 | 
					 | 
				
			||||||
        if (vm_region_64(task, &address, &size, VM_REGION_BASIC_INFO,
 | 
					 | 
				
			||||||
                         (vm_region_info_t)&basic,
 | 
					 | 
				
			||||||
                         &count, &object_name))
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        count = VM_REGION_TOP_INFO_COUNT;
 | 
					 | 
				
			||||||
        if (vm_region_64(task, &address, &size, VM_REGION_TOP_INFO,
 | 
					 | 
				
			||||||
                         (vm_region_info_t)&top,
 | 
					 | 
				
			||||||
                         &count, &object_name))
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if ((address >= TEXT_SEGMENT_START) &&
 | 
					 | 
				
			||||||
            (address < DATA_SEGMENT_END))
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if (!split && (top.share_mode == SM_EMPTY)) {
 | 
					 | 
				
			||||||
                if (basic.reserved) {
 | 
					 | 
				
			||||||
                    split = 1;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            if (top.share_mode != SM_PRIVATE) {
 | 
					 | 
				
			||||||
                address += size;
 | 
					 | 
				
			||||||
                continue;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        switch (top.share_mode) {
 | 
					 | 
				
			||||||
          case SM_COW:
 | 
					 | 
				
			||||||
            if (top.ref_count == 1) {
 | 
					 | 
				
			||||||
                private += top.private_pages_resident * vm_page_size;
 | 
					 | 
				
			||||||
                private += top.shared_pages_resident * vm_page_size;
 | 
					 | 
				
			||||||
                vprivate += size;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else {
 | 
					 | 
				
			||||||
                shared_table_register(table, &top, size);
 | 
					 | 
				
			||||||
                vprivate += top.private_pages_resident * vm_page_size;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
          case SM_PRIVATE:
 | 
					 | 
				
			||||||
            private += top.private_pages_resident * vm_page_size;
 | 
					 | 
				
			||||||
            vprivate += size;
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
          case SM_SHARED:
 | 
					 | 
				
			||||||
            shared_table_register(table, &top, size);
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        address += size;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (i=0; i<SHARED_TABLE_SIZE; i++) {
 | 
					 | 
				
			||||||
        shared_info *sinfo = &table[i];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        while (sinfo) {
 | 
					 | 
				
			||||||
            if ((sinfo->share_mode == SM_SHARED) &&
 | 
					 | 
				
			||||||
                (sinfo->ref_count == sinfo->task_ref_count))
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                private += sinfo->page_count * vm_page_size;
 | 
					 | 
				
			||||||
                vprivate += sinfo->size;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else {
 | 
					 | 
				
			||||||
                shared += sinfo->page_count * vm_page_size;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            sinfo = sinfo->next;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    shared_table_free(table);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (split) {
 | 
					 | 
				
			||||||
        vsize -= (DATA_SEGMENT_END - TEXT_SEGMENT_START);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (task != self) {
 | 
					    if (task != self) {
 | 
				
			||||||
        mach_port_deallocate(self, task);
 | 
					        mach_port_deallocate(self, task);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    procmem->size     = info.virtual_size;
 | 
					    procmem->size     = info.virtual_size;
 | 
				
			||||||
    procmem->resident = info.resident_size;
 | 
					    procmem->resident = info.resident_size;
 | 
				
			||||||
    procmem->share    = shared;
 | 
					    procmem->share    = SIGAR_FIELD_NOTIMPL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return SIGAR_OK;
 | 
					    return SIGAR_OK;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user