libuv-svace-build
240 строк · 7.6 Кб
1/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2*
3* Permission is hereby granted, free of charge, to any person obtaining a copy
4* of this software and associated documentation files (the "Software"), to
5* deal in the Software without restriction, including without limitation the
6* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7* sell copies of the Software, and to permit persons to whom the Software is
8* furnished to do so, subject to the following conditions:
9*
10* The above copyright notice and this permission notice shall be included in
11* all copies or substantial portions of the Software.
12*
13* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19* IN THE SOFTWARE.
20*/
21
22#include "uv.h"23#include "task.h"24#include <string.h>25
26
27TEST_IMPL(platform_output) {28char buffer[512];29size_t rss;30size_t size;31double uptime;32uv_pid_t pid;33uv_pid_t ppid;34uv_rusage_t rusage;35uv_cpu_info_t* cpus;36uv_interface_address_t* interfaces;37uv_passwd_t pwd;38uv_group_t grp;39uv_utsname_t uname;40unsigned par;41char* const* member;42int count;43int i;44int err;45
46err = uv_get_process_title(buffer, sizeof(buffer));47ASSERT_OK(err);48printf("uv_get_process_title: %s\n", buffer);49
50size = sizeof(buffer);51err = uv_cwd(buffer, &size);52ASSERT_OK(err);53printf("uv_cwd: %s\n", buffer);54
55err = uv_resident_set_memory(&rss);56#if defined(__MSYS__)57ASSERT_EQ(err, UV_ENOSYS);58#else59ASSERT_OK(err);60printf("uv_resident_set_memory: %llu\n", (unsigned long long) rss);61#endif62
63err = uv_uptime(&uptime);64#if defined(__PASE__)65ASSERT_EQ(err, UV_ENOSYS);66#else67ASSERT_OK(err);68ASSERT_GT(uptime, 0);69printf("uv_uptime: %f\n", uptime);70#endif71
72err = uv_getrusage(&rusage);73ASSERT_OK(err);74ASSERT_GE(rusage.ru_utime.tv_sec, 0);75ASSERT_GE(rusage.ru_utime.tv_usec, 0);76ASSERT_GE(rusage.ru_stime.tv_sec, 0);77ASSERT_GE(rusage.ru_stime.tv_usec, 0);78printf("uv_getrusage:\n");79printf(" user: %llu sec %llu microsec\n",80(unsigned long long) rusage.ru_utime.tv_sec,81(unsigned long long) rusage.ru_utime.tv_usec);82printf(" system: %llu sec %llu microsec\n",83(unsigned long long) rusage.ru_stime.tv_sec,84(unsigned long long) rusage.ru_stime.tv_usec);85printf(" page faults: %llu\n", (unsigned long long) rusage.ru_majflt);86printf(" maximum resident set size: %llu\n",87(unsigned long long) rusage.ru_maxrss);88
89par = uv_available_parallelism();90ASSERT_GE(par, 1);91printf("uv_available_parallelism: %u\n", par);92
93#ifdef __linux__94FILE* file;95int cgroup_version = 0;96unsigned int cgroup_par = 0;97uint64_t quota, period;98
99// Attempt to parse cgroup v2 to deduce parallelism constraints100file = fopen("/sys/fs/cgroup/cpu.max", "r");101if (file) {102if (fscanf(file, "%lu %lu", "a, &period) == 2 && quota > 0) {103cgroup_version = 2;104cgroup_par = (unsigned int)(quota / period);105}106fclose(file);107}108
109// If cgroup v2 wasn't present, try parsing cgroup v1110if (cgroup_version == 0) {111file = fopen("/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us", "r");112if (file) {113if (fscanf(file, "%lu", "a) == 1 && quota > 0 && quota < ~0ULL) {114fclose(file);115file = fopen("/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us", "r");116if (file && fscanf(file, "%lu", &period) == 1) {117cgroup_version = 1;118cgroup_par = (unsigned int)(quota / period);119}120}121if (file) fclose(file);122}123}124
125// If we found cgroup parallelism constraints, assert and print them126if (cgroup_par > 0) {127ASSERT_GE(par, cgroup_par);128printf("cgroup v%d available parallelism: %u\n", cgroup_version, cgroup_par);129}130#endif131
132err = uv_cpu_info(&cpus, &count);133#if defined(__CYGWIN__) || defined(__MSYS__)134ASSERT_EQ(err, UV_ENOSYS);135#else136ASSERT_OK(err);137
138printf("uv_cpu_info:\n");139for (i = 0; i < count; i++) {140printf(" model: %s\n", cpus[i].model);141printf(" speed: %d\n", cpus[i].speed);142printf(" times.sys: %llu\n", (unsigned long long) cpus[i].cpu_times.sys);143printf(" times.user: %llu\n",144(unsigned long long) cpus[i].cpu_times.user);145printf(" times.idle: %llu\n",146(unsigned long long) cpus[i].cpu_times.idle);147printf(" times.irq: %llu\n", (unsigned long long) cpus[i].cpu_times.irq);148printf(" times.nice: %llu\n",149(unsigned long long) cpus[i].cpu_times.nice);150}151#endif152uv_free_cpu_info(cpus, count);153
154err = uv_interface_addresses(&interfaces, &count);155ASSERT_OK(err);156
157printf("uv_interface_addresses:\n");158for (i = 0; i < count; i++) {159printf(" name: %s\n", interfaces[i].name);160printf(" internal: %d\n", interfaces[i].is_internal);161printf(" physical address: ");162printf("%02x:%02x:%02x:%02x:%02x:%02x\n",163(unsigned char)interfaces[i].phys_addr[0],164(unsigned char)interfaces[i].phys_addr[1],165(unsigned char)interfaces[i].phys_addr[2],166(unsigned char)interfaces[i].phys_addr[3],167(unsigned char)interfaces[i].phys_addr[4],168(unsigned char)interfaces[i].phys_addr[5]);169
170if (interfaces[i].address.address4.sin_family == AF_INET) {171uv_ip4_name(&interfaces[i].address.address4, buffer, sizeof(buffer));172} else if (interfaces[i].address.address4.sin_family == AF_INET6) {173uv_ip6_name(&interfaces[i].address.address6, buffer, sizeof(buffer));174}175
176printf(" address: %s\n", buffer);177
178if (interfaces[i].netmask.netmask4.sin_family == AF_INET) {179uv_ip4_name(&interfaces[i].netmask.netmask4, buffer, sizeof(buffer));180printf(" netmask: %s\n", buffer);181} else if (interfaces[i].netmask.netmask4.sin_family == AF_INET6) {182uv_ip6_name(&interfaces[i].netmask.netmask6, buffer, sizeof(buffer));183printf(" netmask: %s\n", buffer);184} else {185printf(" netmask: none\n");186}187}188uv_free_interface_addresses(interfaces, count);189
190err = uv_os_get_passwd(&pwd);191ASSERT_OK(err);192
193err = uv_os_get_group(&grp, pwd.gid);194#if defined(_WIN32)195ASSERT_EQ(err, UV_ENOTSUP);196ASSERT_EQ(pwd.uid, (unsigned long) -1);197ASSERT_EQ(pwd.gid, (unsigned long) -1);198(void) member;199grp.groupname = "ENOTSUP";200#else201ASSERT_OK(err);202ASSERT_EQ(pwd.gid, grp.gid);203#endif204
205printf("uv_os_get_passwd:\n");206printf(" euid: %ld\n", pwd.uid);207printf(" gid: %ld (%s)\n", pwd.gid, grp.groupname);208#if !defined(_WIN32)209printf(" members: [");210for (member = grp.members; *member != NULL; member++) {211printf(" %s", *member);212}213printf(" ]\n");214#endif215printf(" username: %s\n", pwd.username);216if (pwd.shell != NULL) /* Not set on Windows */217printf(" shell: %s\n", pwd.shell);218printf(" home directory: %s\n", pwd.homedir);219uv_os_free_passwd(&pwd);220#if !defined(_WIN32)221uv_os_free_group(&grp);222#endif223
224pid = uv_os_getpid();225ASSERT_GT(pid, 0);226printf("uv_os_getpid: %d\n", (int) pid);227ppid = uv_os_getppid();228ASSERT_GT(ppid, 0);229printf("uv_os_getppid: %d\n", (int) ppid);230
231err = uv_os_uname(&uname);232ASSERT_OK(err);233printf("uv_os_uname:\n");234printf(" sysname: %s\n", uname.sysname);235printf(" release: %s\n", uname.release);236printf(" version: %s\n", uname.version);237printf(" machine: %s\n", uname.machine);238
239return 0;240}
241