diff options
| author | ruki <[email protected]> | 2022-07-29 00:47:30 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2022-07-29 00:47:30 +0800 |
| commit | 07ef7c8da6a58bd22a4cd8dc3c80f915771c02e2 (patch) | |
| tree | 2d19e81777a647c68ce009b8bd1c5663958cbe82 /core/src | |
| parent | e60aa2dd105a14da59e1fedbcdbf3bc4adb7ba36 (diff) | |
add cpu usage
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/xmake/os/cpuinfo.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/core/src/xmake/os/cpuinfo.c b/core/src/xmake/os/cpuinfo.c index bec9aff2c..fce4495d1 100644 --- a/core/src/xmake/os/cpuinfo.c +++ b/core/src/xmake/os/cpuinfo.c @@ -29,6 +29,64 @@ * includes */ #include "prefix.h" +#if defined(TB_CONFIG_OS_MACOSX) +# include <sys/sysctl.h> +# include <sys/types.h> +# include <mach/mach.h> +# include <mach/processor_info.h> +# include <mach/mach_host.h> +#endif + +/* ////////////////////////////////////////////////////////////////////////////////////// + * macros + */ +#define XM_CPU_MAX (1024) + +/* ////////////////////////////////////////////////////////////////////////////////////// + * private implementation + */ +static tb_int_t xm_os_cpuinfo_stats(tb_float_t usages[XM_CPU_MAX]) +{ +#if defined(TB_CONFIG_OS_MACOSX) + natural_t cpu_count = 0; + processor_info_array_t cpuinfo; + mach_msg_type_number_t cpuinfo_count; + static tb_hong_t s_time = 0; + if (tb_mclock() - s_time > 1000 && host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &cpu_count, &cpuinfo, &cpuinfo_count) == KERN_SUCCESS) + { + if (cpuinfo_count > XM_CPU_MAX) + cpuinfo_count = XM_CPU_MAX; + + static processor_info_array_t s_cpuinfo_prev = tb_null; + static mach_msg_type_number_t s_cpuinfo_count_prev = 0; + for (tb_int_t i = 0; i < cpu_count; ++i) + { + tb_int_t use, total; + if (s_cpuinfo_prev) + { + use = (cpuinfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] - s_cpuinfo_prev[(CPU_STATE_MAX * i) + CPU_STATE_USER]) + + (cpuinfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] - s_cpuinfo_prev[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM]) + + (cpuinfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE] - s_cpuinfo_prev[(CPU_STATE_MAX * i) + CPU_STATE_NICE]); + total = use + (cpuinfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE] - s_cpuinfo_prev[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]); + } + else + { + use = cpuinfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] + cpuinfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] + cpuinfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]; + total = use + cpuinfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]; + } + usages[i] = total > 0? ((tb_float_t)use / (tb_float_t)total) : 0; + } + if (s_cpuinfo_prev) + vm_deallocate(mach_task_self(), (vm_address_t)s_cpuinfo_prev, sizeof(integer_t) * s_cpuinfo_count_prev); + s_time = tb_mclock(); + s_cpuinfo_prev = cpuinfo; + s_cpuinfo_count_prev = cpuinfo_count; + } + return cpu_count; +#else + return 0; +#endif +} /* ////////////////////////////////////////////////////////////////////////////////////// * implementation @@ -54,5 +112,18 @@ tb_int_t xm_os_cpuinfo(lua_State* lua) lua_pushinteger(lua, ncpu > 0? ncpu : 1); lua_settable(lua, -3); + // get cpu usages + tb_float_t usages[XM_CPU_MAX]; + tb_int_t count = xm_os_cpuinfo_stats(usages); + if (count > 0) + { + tb_float_t usagerate = 0; + for (tb_int_t i = 0; i < count; i++) + usagerate += usages[i]; + usagerate /= count; + lua_pushstring(lua, "usagerate"); + lua_pushnumber(lua, usagerate); + lua_settable(lua, -3); + } return 1; } |
