31 #ifndef SUNOS_NO_IFADDRS
35 #include <net/if_dl.h>
36 #include <net/if_arp.h>
37 #include <sys/sockio.h>
39 #include <sys/loadavg.h>
48 #define PORT_FIRED 0x69
49 #define PORT_UNUSED 0x0
50 #define PORT_LOADED 0x99
51 #define PORT_DELETED -1
53 #if (!defined(_LP64)) && (_FILE_OFFSET_BITS - 0 == 64)
54 #define PROCFS_FILE_OFFSET_BITS_HACK 1
55 #undef _FILE_OFFSET_BITS
57 #define PROCFS_FILE_OFFSET_BITS_HACK 0
62 #if (PROCFS_FILE_OFFSET_BITS_HACK - 0 == 1)
63 #define _FILE_OFFSET_BITS 64
72 loop->backend_fd = -1;
83 loop->backend_fd = fd;
90 if (
loop->fs_fd != -1) {
95 if (
loop->backend_fd != -1) {
97 loop->backend_fd = -1;
103 #if defined(PORT_SOURCE_FILE)
104 if (
loop->fs_fd != -1) {
115 struct port_event* events;
119 assert(
loop->watchers != NULL);
122 events = (
struct port_event*)
loop->watchers[
loop->nwatchers];
128 for (
i = 0;
i < nfds;
i++)
129 if ((
int) events[
i].portev_object == fd)
130 events[
i].portev_object = -1;
135 if (port_associate(
loop->backend_fd, PORT_SOURCE_FD, fd, POLLIN, 0))
138 if (port_dissociate(
loop->backend_fd, PORT_SOURCE_FD, fd)) {
139 perror(
"(libuv) port_dissociate()");
148 struct port_event events[1024];
149 struct port_event* pe;
150 struct timespec
spec;
166 if (
loop->nfds == 0) {
179 if (port_associate(
loop->backend_fd,
184 perror(
"(libuv) port_associate()");
195 sigaddset(pset, SIGPROF);
209 events[0].portev_source = 0;
215 pthread_sigmask(SIG_BLOCK, pset, NULL);
217 err = port_getn(
loop->backend_fd,
224 pthread_sigmask(SIG_UNBLOCK, pset, NULL);
230 if (errno == EINTR || errno == ETIME) {
233 perror(
"(libuv) port_getn()");
244 if (events[0].portev_source == 0) {
262 assert(
loop->watchers != NULL);
263 loop->watchers[
loop->nwatchers] = (
void*) events;
265 for (
i = 0;
i < nfds;
i++) {
267 fd = pe->portev_object;
274 assert((
unsigned) fd < loop->nwatchers);
276 w =
loop->watchers[fd];
285 if (w == &
loop->signal_io_watcher)
288 w->
cb(
loop, w, pe->portev_events);
292 if (w !=
loop->watchers[fd])
300 if (have_signals != 0)
301 loop->signal_io_watcher.cb(
loop, &
loop->signal_io_watcher, POLLIN);
303 loop->watchers[
loop->nwatchers] = NULL;
304 loop->watchers[
loop->nwatchers + 1] = NULL;
306 if (have_signals != 0)
318 if (saved_errno == ETIME) {
358 snprintf(
buf,
sizeof(
buf),
"/proc/%lu/path/a.out", (
unsigned long) getpid());
374 return (
uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_AVPHYS_PAGES);
379 return (
uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES);
389 (void) getloadavg(avg, 3);
393 #if defined(PORT_SOURCE_FILE)
399 if (port_associate(
handle->loop->fs_fd,
402 FILE_ATTRIB | FILE_MODIFIED,
414 unsigned int revents) {
439 while (
r == -1 && errno == EINTR);
441 if ((
r == -1 && errno == ETIME) ||
n == 0)
445 assert((
r == 0) &&
"unexpected port_get() error");
448 if (pe.portev_events & (FILE_ATTRIB | FILE_MODIFIED))
450 if (pe.portev_events & ~(FILE_ATTRIB | FILE_MODIFIED))
457 r = uv__fs_event_rearm(
handle);
475 unsigned int flags) {
484 if (
handle->loop->fs_fd == -1) {
485 portfd = port_create();
488 handle->loop->fs_fd = portfd;
519 port_dissociate(
handle->loop->fs_fd,
527 handle->fo.fo_name = NULL;
547 unsigned int flags) {
569 fd =
open(
"/proc/self/psinfo", O_RDONLY);
575 if (
read(fd, &psinfo,
sizeof(psinfo)) ==
sizeof(psinfo)) {
576 *rss = (size_t)psinfo.pr_rssize * 1024;
590 long hz = sysconf(_SC_CLK_TCK);
596 ksp = kstat_lookup(kc, (
char*)
"unix", 0, (
char*)
"system_misc");
597 if (kstat_read(kc, ksp, NULL) == -1) {
600 knp = (kstat_named_t*) kstat_data_lookup(ksp, (
char*)
"clk_intr");
601 *uptime = knp->value.ul / hz;
622 while ((ksp = kstat_lookup(kc, (
char*)
"cpu_info", lookup_instance, NULL))) {
626 *cpu_infos =
uv__malloc(lookup_instance *
sizeof(**cpu_infos));
632 *
count = lookup_instance;
634 cpu_info = *cpu_infos;
636 while ((ksp = kstat_lookup(kc, (
char*)
"cpu_info", lookup_instance, NULL))) {
637 if (kstat_read(kc, ksp, NULL) == -1) {
639 cpu_info->
model = NULL;
641 knp = kstat_data_lookup(ksp, (
char*)
"clock_MHz");
642 assert(knp->data_type == KSTAT_DATA_INT32 ||
643 knp->data_type == KSTAT_DATA_INT64);
644 cpu_info->
speed = (knp->data_type == KSTAT_DATA_INT32) ? knp->value.i32
647 knp = kstat_data_lookup(ksp, (
char*)
"brand");
648 assert(knp->data_type == KSTAT_DATA_STRING);
656 cpu_info = *cpu_infos;
659 ksp = kstat_lookup(kc, (
char*)
"cpu", lookup_instance, (
char*)
"sys");
664 if (kstat_read(kc, ksp, NULL) == -1) {
671 knp = kstat_data_lookup(ksp, (
char*)
"cpu_ticks_user");
672 assert(knp->data_type == KSTAT_DATA_UINT64);
675 knp = kstat_data_lookup(ksp, (
char*)
"cpu_ticks_kernel");
676 assert(knp->data_type == KSTAT_DATA_UINT64);
679 knp = kstat_data_lookup(ksp, (
char*)
"cpu_ticks_idle");
680 assert(knp->data_type == KSTAT_DATA_UINT64);
683 knp = kstat_data_lookup(ksp, (
char*)
"intr");
684 assert(knp->data_type == KSTAT_DATA_UINT64);
699 #ifdef SUNOS_NO_IFADDRS
714 struct sockaddr_dl* sa_addr;
717 struct arpreq arpreq;
720 sa_addr = (
struct sockaddr_dl*)(ent->
ifa_addr);
727 memset(&arpreq, 0,
sizeof(arpreq));
729 struct sockaddr_in* sin = ((
struct sockaddr_in*)&arpreq.arp_pa);
740 sockfd =
socket(AF_INET, SOCK_DGRAM, 0);
744 if (ioctl(sockfd, SIOCGARP, (
char*)&arpreq) == -1) {
759 if (ent->
ifa_addr->sa_family != AF_INET &&
777 for (ent = addrs; ent != NULL; ent = ent->
ifa_next) {
794 address = *addresses;
796 for (ent = addrs; ent != NULL; ent = ent->
ifa_next) {