mirror of https://github.com/lukechilds/node.git
Ryan Dahl
15 years ago
7 changed files with 244 additions and 207 deletions
@ -0,0 +1,13 @@ |
|||||
|
#ifndef NODE_PLATFORM_H_ |
||||
|
#define NODE_PLATFORM_H_ |
||||
|
|
||||
|
namespace node { |
||||
|
|
||||
|
class OS { |
||||
|
public: |
||||
|
static int GetMemory(size_t *rss, size_t *vsize); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
} // namespace node
|
||||
|
#endif // NODE_PLATFORM_H_
|
@ -0,0 +1,29 @@ |
|||||
|
#include "node.h" |
||||
|
#include "platform.h" |
||||
|
|
||||
|
#include <mach/task.h> |
||||
|
#include <mach/mach_init.h> |
||||
|
|
||||
|
namespace node { |
||||
|
|
||||
|
// Researched by Tim Becker and Michael Knight
|
||||
|
// http://blog.kuriositaet.de/?p=257
|
||||
|
int OS::GetMemory(size_t *rss, size_t *vsize) { |
||||
|
struct task_basic_info t_info; |
||||
|
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT; |
||||
|
|
||||
|
int r = task_info(mach_task_self(), |
||||
|
TASK_BASIC_INFO, |
||||
|
(task_info_t)&t_info, |
||||
|
&t_info_count); |
||||
|
|
||||
|
if (r != KERN_SUCCESS) return -1; |
||||
|
|
||||
|
*rss = t_info.resident_size; |
||||
|
*vsize = t_info.virtual_size; |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} // namespace node
|
@ -0,0 +1,45 @@ |
|||||
|
#include "node.h" |
||||
|
#include "platform.h" |
||||
|
|
||||
|
#include <kvm.h> |
||||
|
#include <sys/param.h> |
||||
|
#include <sys/sysctl.h> |
||||
|
#include <sys/user.h> |
||||
|
#include <paths.h> |
||||
|
#include <fcntl.h> |
||||
|
#include <unistd.h> |
||||
|
|
||||
|
|
||||
|
namespace node { |
||||
|
|
||||
|
|
||||
|
int OS::GetMemory(size_t *rss, size_t *vsize) { |
||||
|
kvm_t *kd = NULL; |
||||
|
struct kinfo_proc *kinfo = NULL; |
||||
|
pid_t pid; |
||||
|
int nprocs; |
||||
|
size_t page_size = getpagesize(); |
||||
|
|
||||
|
pid = getpid(); |
||||
|
|
||||
|
kd = kvm_open(NULL, _PATH_DEVNULL, NULL, O_RDONLY, "kvm_open"); |
||||
|
if (kd == NULL) goto error; |
||||
|
|
||||
|
kinfo = kvm_getprocs(kd, KERN_PROC_PID, pid, &nprocs); |
||||
|
if (kinfo == NULL) goto error; |
||||
|
|
||||
|
*rss = kinfo->ki_rssize * page_size; |
||||
|
*vsize = kinfo->ki_size; |
||||
|
|
||||
|
kvm_close(kd); |
||||
|
|
||||
|
return 0; |
||||
|
|
||||
|
error: |
||||
|
if (kd) kvm_close(kd); |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
} // namespace node
|
@ -0,0 +1,91 @@ |
|||||
|
#include "node.h" |
||||
|
#include "platform.h" |
||||
|
|
||||
|
# include <sys/param.h> /* for MAXPATHLEN */ |
||||
|
|
||||
|
|
||||
|
namespace node { |
||||
|
|
||||
|
|
||||
|
int OS::GetMemory(size_t *rss, size_t *vsize) { |
||||
|
FILE *f = fopen("/proc/self/stat", "r"); |
||||
|
if (!f) return -1; |
||||
|
|
||||
|
int itmp; |
||||
|
char ctmp; |
||||
|
char buffer[MAXPATHLEN]; |
||||
|
size_t page_size = getpagesize(); |
||||
|
|
||||
|
/* PID */ |
||||
|
if (fscanf(f, "%d ", &itmp) == 0) goto error; |
||||
|
/* Exec file */ |
||||
|
if (fscanf (f, "%s ", &buffer[0]) == 0) goto error; |
||||
|
/* State */ |
||||
|
if (fscanf (f, "%c ", &ctmp) == 0) goto error; |
||||
|
/* Parent process */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
/* Process group */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
/* Session id */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
/* TTY */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
/* TTY owner process group */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
/* Flags */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
/* Minor faults (no memory page) */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
/* Minor faults, children */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
/* Major faults (memory page faults) */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
/* Major faults, children */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
/* utime */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
/* stime */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
/* utime, children */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
/* stime, children */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
/* jiffies remaining in current time slice */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
/* 'nice' value */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
/* jiffies until next timeout */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
/* jiffies until next SIGALRM */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
/* start time (jiffies since system boot) */ |
||||
|
if (fscanf (f, "%d ", &itmp) == 0) goto error; |
||||
|
|
||||
|
/* Virtual memory size */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
*vsize = (size_t) itmp; |
||||
|
|
||||
|
/* Resident set size */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
*rss = (size_t) itmp * page_size; |
||||
|
|
||||
|
/* rlim */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
/* Start of text */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
/* End of text */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
/* Start of stack */ |
||||
|
if (fscanf (f, "%u ", &itmp) == 0) goto error; |
||||
|
|
||||
|
fclose (f); |
||||
|
|
||||
|
return 0; |
||||
|
|
||||
|
error: |
||||
|
fclose (f); |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} // namespace node
|
@ -0,0 +1,52 @@ |
|||||
|
#include "node.h" |
||||
|
#include "platform.h" |
||||
|
|
||||
|
|
||||
|
#include <unistd.h> /* getpagesize() */ |
||||
|
|
||||
|
#if (!defined(_LP64)) && (_FILE_OFFSET_BITS - 0 == 64) |
||||
|
#define PROCFS_FILE_OFFSET_BITS_HACK 1 |
||||
|
#undef _FILE_OFFSET_BITS |
||||
|
#else |
||||
|
#define PROCFS_FILE_OFFSET_BITS_HACK 0 |
||||
|
#endif |
||||
|
|
||||
|
#include <procfs.h> |
||||
|
|
||||
|
#if (PROCFS_FILE_OFFSET_BITS_HACK - 0 == 1) |
||||
|
#define _FILE_OFFSET_BITS 64 |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
namespace node { |
||||
|
|
||||
|
|
||||
|
int OS::GetMemory(size_t *rss, size_t *vsize) { |
||||
|
pid_t pid = getpid(); |
||||
|
|
||||
|
size_t page_size = getpagesize(); |
||||
|
char pidpath[1024]; |
||||
|
sprintf(pidpath, "/proc/%d/psinfo", pid); |
||||
|
|
||||
|
psinfo_t psinfo; |
||||
|
FILE *f = fopen(pidpath, "r"); |
||||
|
if (!f) return -1; |
||||
|
|
||||
|
if (fread(&psinfo, sizeof(psinfo_t), 1, f) != 1) { |
||||
|
fclose (f); |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
/* XXX correct? */ |
||||
|
|
||||
|
*vsize = (size_t) psinfo.pr_size * page_size; |
||||
|
*rss = (size_t) psinfo.pr_rssize * 1024; |
||||
|
|
||||
|
fclose (f); |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} // namespace node
|
||||
|
|
Loading…
Reference in new issue