summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorruki <[email protected]>2022-07-29 00:47:30 +0800
committerruki <[email protected]>2022-07-29 00:47:30 +0800
commit07ef7c8da6a58bd22a4cd8dc3c80f915771c02e2 (patch)
tree2d19e81777a647c68ce009b8bd1c5663958cbe82 /core/src
parente60aa2dd105a14da59e1fedbcdbf3bc4adb7ba36 (diff)
add cpu usage
Diffstat (limited to 'core/src')
-rw-r--r--core/src/xmake/os/cpuinfo.c71
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;
}