BSD-Resource
view release on metacpan or search on metacpan
Resource.xs view on Meta::CPAN
#if defined(RUSAGE_CHILDREN) || defined(HAS_RUSAGE_CHILDREN)
return RUSAGE_CHILDREN;
#else
goto not_there;
#endif
if (strEQ(name, "RUSAGE_SELF"))
#if defined(RUSAGE_SELF) || defined(HAS_RUSAGE_SELF)
return RUSAGE_SELF;
#else
goto not_there;
#endif
if (strEQ(name, "RUSAGE_THREAD"))
#if defined(RUSAGE_THREAD) || defined(HAS_RUSAGE_THREAD)
return RUSAGE_THREAD;
#else
goto not_there;
#endif
break;
}
}
errno = EINVAL;
return 0;
not_there:
errno = ENOENT;
return 0;
}
#define HV_STORE_RES(h, l) (void)hv_store(h, #l, sizeof(#l)-1, newSViv(l), 0)
MODULE = BSD::Resource PACKAGE = BSD::Resource
PROTOTYPES: enable
double
constant(name,arg)
char * name
int arg
void
_getpriority(which = PRIO_PROCESS, who = 0)
int which
int who
CODE:
{
int prio;
ST(0) = sv_newmortal();
errno = 0; /* getpriority() can successfully return <= 0 */
prio = getpriority(which, who);
if (errno == 0)
sv_setiv(ST(0), prio);
else
ST(0) = &PL_sv_undef;
}
void
_getrlimit(resource)
int resource
PPCODE:
struct rlimit rl;
if (getrlimit(resource, &rl) == 0) {
EXTEND(sp, 2);
PUSHs(sv_2mortal(newSVnv((double)(rl.rlim_cur == RLIM_INFINITY ? -1.0 : rl.rlim_cur))));
PUSHs(sv_2mortal(newSVnv((double)(rl.rlim_max == RLIM_INFINITY ? -1.0 : rl.rlim_max))));
}
void
_getrusage(who = RUSAGE_SELF)
int who
PPCODE:
{
struct rusage ru;
#ifdef SOLARIS_PROCFS
Struct_psinfo psi;
Struct_pstatus pst;
struct prusage pru;
pid_t pid = getpid();
int res, fd;
char psib[40], pstb[40], prub[40];
ru.ru_utime.tv_sec = 0;
ru.ru_utime.tv_usec = 0;
ru.ru_stime.tv_sec = 0;
ru.ru_stime.tv_usec = 0;
ru.ru_maxrss = 0;
ru.ru_ixrss = 0;
ru.ru_idrss = 0;
ru.ru_isrss = 0;
ru.ru_minflt = 0;
ru.ru_majflt = 0;
ru.ru_nswap = 0;
ru.ru_inblock = 0;
ru.ru_oublock = 0;
ru.ru_msgsnd = 0;
ru.ru_msgrcv = 0;
ru.ru_nsignals = 0;
ru.ru_nvcsw = 0;
ru.ru_nivcsw = 0;
# ifndef SOLARIS_STRUCTURED_PROC
/* The time fields come okay from getrusage() but would be bad
* from PIOCUSAGE. Argh. */
res = getrusage(who, &ru);
if (res)
goto failed;
# endif
/* With 64-bit pids "/proc/18446744073709551616/psinfo" takes 34 bytes. */
sprintf(psib, "/proc/%d", pid);
sprintf(pstb, "/proc/%d", pid);
sprintf(prub, "/proc/%d", pid);
# ifdef SOLARIS_STRUCTURED_PROC
res = strlen(psib);
sprintf(psib + res, "/psinfo");
sprintf(pstb + res, "/status");
sprintf(prub + res, "/usage" );
# endif
fd = open(psib, O_RDONLY);
if (fd >= 0) {
# ifdef SOLARIS_STRUCTURED_PROC
res = read(fd, &psi, sizeof(psi));
if (res == sizeof(psi))
ru.ru_maxrss = psi.pr_rssize * 1024;
else
goto failed;
# else
res = ioctl(fd, PIOCPSINFO, &psi);
if (res != -1)
ru.ru_maxrss = psi.pr_byrssize;
else
goto failed;
# endif
close(fd);
( run in 0.793 second using v1.01-cache-2.11-cpan-71847e10f99 )