void ftw_resource_usage(double *user_cpu_time, double *system_cpu_time, double *uptime, uint64_t *hi_res_relative_time, uint64_t *peak_working_set, uint64_t *lv_dataspace_size, uint64_t *hard_page_faults) { uv_rusage_t rusage; double up; MemStatRec stats; MgErr lvrc; int rc; lvrc = DSMemStats(&stats); if (lvrc == mgNoErr) { *lv_dataspace_size = (uint64_t)stats.totAllocSize; } rc = uv_getrusage(&rusage); if (rc == 0) { *user_cpu_time = (double)rusage.ru_utime.tv_sec + rusage.ru_utime.tv_usec * 1e-6; *system_cpu_time = (double)rusage.ru_stime.tv_sec + rusage.ru_stime.tv_usec * 1e-6; *peak_working_set = rusage.ru_maxrss; *hard_page_faults = rusage.ru_majflt; } rc = uv_uptime(&up); if (rc == 0) { *uptime = up; } *hi_res_relative_time = uv_hrtime(); return; }
static int luv_getrusage(lua_State* L) { uv_rusage_t rusage; int ret = uv_getrusage(&rusage); if (ret < 0) return luv_error(L, ret); lua_createtable(L, 0, 16); // user CPU time used luv_push_timeval_table(L, &rusage.ru_utime); lua_setfield(L, -2, "utime"); // system CPU time used luv_push_timeval_table(L, &rusage.ru_stime); lua_setfield(L, -2, "stime"); // maximum resident set size lua_pushinteger(L, rusage.ru_maxrss); lua_setfield(L, -2, "maxrss"); // integral shared memory size lua_pushinteger(L, rusage.ru_ixrss); lua_setfield(L, -2, "ixrss"); // integral unshared data size lua_pushinteger(L, rusage.ru_idrss); lua_setfield(L, -2, "idrss"); // integral unshared stack size lua_pushinteger(L, rusage.ru_isrss); lua_setfield(L, -2, "isrss"); // page reclaims (soft page faults) lua_pushinteger(L, rusage.ru_minflt); lua_setfield(L, -2, "minflt"); // page faults (hard page faults) lua_pushinteger(L, rusage.ru_majflt); lua_setfield(L, -2, "majflt"); // swaps lua_pushinteger(L, rusage.ru_nswap); lua_setfield(L, -2, "nswap"); // block input operations lua_pushinteger(L, rusage.ru_inblock); lua_setfield(L, -2, "inblock"); // block output operations lua_pushinteger(L, rusage.ru_oublock); lua_setfield(L, -2, "oublock"); // IPC messages sent lua_pushinteger(L, rusage.ru_msgsnd); lua_setfield(L, -2, "msgsnd"); // IPC messages received lua_pushinteger(L, rusage.ru_msgrcv); lua_setfield(L, -2, "msgrcv"); // signals received lua_pushinteger(L, rusage.ru_nsignals); lua_setfield(L, -2, "nsignals"); // voluntary context switches lua_pushinteger(L, rusage.ru_nvcsw); lua_setfield(L, -2, "nvcsw"); // involuntary context switches lua_pushinteger(L, rusage.ru_nivcsw); lua_setfield(L, -2, "nivcsw"); return 1; }
static PyObject * Util_func_getrusage(PyObject *obj) { int err; uv_rusage_t ru; PyObject *result; UNUSED_ARG(obj); err = uv_getrusage(&ru); if (err < 0) { RAISE_UV_EXCEPTION(err, PyExc_UVError); return NULL; } result = PyStructSequence_New(&RusageResultType); if (!result) return NULL; #define pyuv__doubletime(TV) ((double)(TV).tv_sec + 1e-6*(TV).tv_usec) PyStructSequence_SET_ITEM(result, 0, PyFloat_FromDouble(pyuv__doubletime(ru.ru_utime))); PyStructSequence_SET_ITEM(result, 1, PyFloat_FromDouble(pyuv__doubletime(ru.ru_stime))); PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong(ru.ru_maxrss)); PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong(ru.ru_ixrss)); PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong(ru.ru_idrss)); PyStructSequence_SET_ITEM(result, 5, PyLong_FromLong(ru.ru_isrss)); PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(ru.ru_minflt)); PyStructSequence_SET_ITEM(result, 7, PyLong_FromLong(ru.ru_majflt)); PyStructSequence_SET_ITEM(result, 8, PyLong_FromLong(ru.ru_nswap)); PyStructSequence_SET_ITEM(result, 9, PyLong_FromLong(ru.ru_inblock)); PyStructSequence_SET_ITEM(result, 10, PyLong_FromLong(ru.ru_oublock)); PyStructSequence_SET_ITEM(result, 11, PyLong_FromLong(ru.ru_msgsnd)); PyStructSequence_SET_ITEM(result, 12, PyLong_FromLong(ru.ru_msgrcv)); PyStructSequence_SET_ITEM(result, 13, PyLong_FromLong(ru.ru_nsignals)); PyStructSequence_SET_ITEM(result, 14, PyLong_FromLong(ru.ru_nvcsw)); PyStructSequence_SET_ITEM(result, 15, PyLong_FromLong(ru.ru_nivcsw)); #undef pyuv__doubletime if (PyErr_Occurred()) { Py_DECREF(result); return NULL; } return result; }