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