|  | 
|  | 1 | +#include <mach/mach_init.h> | 
|  | 2 | +#include <mach/task.h> | 
|  | 3 | +// Compiler warns shared_memory_server.h is deprecated, use this instead. | 
|  | 4 | +// But this doesn't define SHARED_XXX_REGION_SIZE. | 
|  | 5 | +//#include <mach/shared_region.h> | 
|  | 6 | +#include <mach/shared_memory_server.h>  // SHARED_DATA_REGION_SIZE, SHARED_TEXT_REGION_SIZE | 
|  | 7 | +#include <mach/mach_vm.h> | 
|  | 8 | +#include <stdio.h> | 
|  | 9 | + | 
|  | 10 | +int getmem (unsigned long long *rss, unsigned long long *vs) | 
|  | 11 | +{ | 
|  | 12 | +    // https://github.com/apple-oss-distributions/adv_cmds/blob/8744084ea0ff41ca4bb96b0f9c22407d0e48e9b7/ps/tasks.c#L109 | 
|  | 13 | + | 
|  | 14 | +    kern_return_t error; | 
|  | 15 | +    task_t task = MACH_PORT_NULL; | 
|  | 16 | +    struct task_basic_info t_info; | 
|  | 17 | +    mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT; | 
|  | 18 | + | 
|  | 19 | +    error = task_info(mach_task_self(), | 
|  | 20 | +       TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count); | 
|  | 21 | + | 
|  | 22 | +    if( error != KERN_SUCCESS ) | 
|  | 23 | +    { | 
|  | 24 | +        return error; | 
|  | 25 | +    } | 
|  | 26 | + | 
|  | 27 | +    *rss = t_info.resident_size; | 
|  | 28 | +    *vs  = t_info.virtual_size;     | 
|  | 29 | + | 
|  | 30 | +    { | 
|  | 31 | +        vm_region_basic_info_data_64_t    b_info; | 
|  | 32 | +        mach_vm_address_t                 address = GLOBAL_SHARED_TEXT_SEGMENT; | 
|  | 33 | +        mach_vm_size_t                    size; | 
|  | 34 | +        mach_port_t                       object_name; | 
|  | 35 | + | 
|  | 36 | +        /* | 
|  | 37 | +         * try to determine if this task has the split libraries | 
|  | 38 | +         * mapped in... if so, adjust its virtual size down by | 
|  | 39 | +         * the 2 segments that are used for split libraries | 
|  | 40 | +         */ | 
|  | 41 | +        t_info_count = VM_REGION_BASIC_INFO_COUNT_64; | 
|  | 42 | +        error = mach_vm_region(mach_task_self(), &address, &size, VM_REGION_BASIC_INFO, | 
|  | 43 | +             (vm_region_info_t)&b_info, &t_info_count, &object_name); | 
|  | 44 | + | 
|  | 45 | +        if (error == KERN_SUCCESS) { | 
|  | 46 | +            if (b_info.reserved && size == (SHARED_TEXT_REGION_SIZE) && | 
|  | 47 | +                *vs > (SHARED_TEXT_REGION_SIZE + SHARED_DATA_REGION_SIZE)) { | 
|  | 48 | +                    *vs -= (SHARED_TEXT_REGION_SIZE + SHARED_DATA_REGION_SIZE); | 
|  | 49 | +            } | 
|  | 50 | +        } | 
|  | 51 | +    } | 
|  | 52 | + | 
|  | 53 | +    // `ps -o rss,vsize,command` prints values in KB | 
|  | 54 | +    printf("rss is %qd (%qd KB)\n", *rss, (unsigned long long) (*rss / 1024)); | 
|  | 55 | +    printf("vs is %qd (%qd KB)\n", *vs, (unsigned long long) (*vs / 1024)); | 
|  | 56 | + | 
|  | 57 | +    return 0; | 
|  | 58 | +} | 
0 commit comments