#ifndef _SYS_RESOURCEVAR_H_
#define _SYS_RESOURCEVAR_H_
#include <sys/resource.h>
#include <sys/queue.h>
#ifdef _KERNEL
#include <sys/_lock.h>
#include <sys/_mutex.h>
#endif
struct pstats {
#define pstat_startzero p_cru
struct rusage p_cru;
struct itimerval p_timer[3];
#define pstat_endzero pstat_startcopy
#define pstat_startcopy p_prof
struct uprof {
caddr_t pr_base;
u_long pr_size;
u_long pr_off;
u_long pr_scale;
} p_prof;
#define pstat_endcopy p_start
struct timeval p_start;
};
#ifdef _KERNEL
struct plimit {
struct rlimit pl_rlimit[RLIM_NLIMITS];
int pl_refcnt;
};
struct limbatch {
struct plimit *limp;
int count;
};
static inline void
limbatch_prep(struct limbatch *lb)
{
lb->limp = NULL;
lb->count = 0;
}
void limbatch_add(struct limbatch *lb, struct thread *td);
static inline void
limbatch_process(struct limbatch *lb __unused)
{
}
void limbatch_final(struct limbatch *lb);
struct racct;
struct uidinfo {
LIST_ENTRY(uidinfo) ui_hash;
u_long ui_vmsize;
long ui_sbsize;
long ui_proccnt;
long ui_ptscnt;
long ui_kqcnt;
long ui_umtxcnt;
long ui_pipecnt;
long ui_inotifycnt;
long ui_inotifywatchcnt;
long ui_vmmcnt;
uid_t ui_uid;
u_int ui_ref;
#ifdef RACCT
struct racct *ui_racct;
#endif
};
struct proc;
struct rusage_ext;
struct thread;
void addupc_intr(struct thread *td, uintfptr_t pc, u_int ticks);
void addupc_task(struct thread *td, uintfptr_t pc, u_int ticks);
void calccru(struct proc *p, struct timeval *up, struct timeval *sp);
void calcru(struct proc *p, struct timeval *up, struct timeval *sp);
int chgkqcnt(struct uidinfo *uip, int diff, rlim_t max);
int chgproccnt(struct uidinfo *uip, int diff, rlim_t maxval);
int chgsbsize(struct uidinfo *uip, u_int *hiwat, u_int to,
rlim_t maxval);
int chgptscnt(struct uidinfo *uip, int diff, rlim_t maxval);
int chgumtxcnt(struct uidinfo *uip, int diff, rlim_t maxval);
int chgpipecnt(struct uidinfo *uip, int diff, rlim_t max);
int chginotifycnt(struct uidinfo *uip, int diff, rlim_t maxval);
int chginotifywatchcnt(struct uidinfo *uip, int diff, rlim_t maxval);
int chgvmmcnt(struct uidinfo *uip, int diff, rlim_t max);
int kern_proc_setrlimit(struct thread *td, struct proc *p, u_int which,
struct rlimit *limp);
struct plimit
*lim_alloc(void);
void lim_copy(struct plimit *dst, struct plimit *src);
rlim_t lim_cur(struct thread *td, int which);
#define lim_cur(td, which) ({ \
rlim_t _rlim; \
struct thread *_td = (td); \
int _which = (which); \
if (__builtin_constant_p(which) && which != RLIMIT_DATA && \
which != RLIMIT_STACK && which != RLIMIT_VMEM) { \
_rlim = _td->td_limit->pl_rlimit[_which].rlim_cur; \
} else { \
_rlim = lim_cur(_td, _which); \
} \
_rlim; \
})
rlim_t lim_cur_proc(struct proc *p, int which);
void lim_fork(struct proc *p1, struct proc *p2);
void lim_free(struct plimit *limp);
void lim_freen(struct plimit *limp, int n);
struct plimit
*lim_hold(struct plimit *limp);
struct plimit
*lim_cowsync(void);
rlim_t lim_max(struct thread *td, int which);
rlim_t lim_max_proc(struct proc *p, int which);
void lim_rlimit(struct thread *td, int which, struct rlimit *rlp);
void lim_rlimit_proc(struct proc *p, int which, struct rlimit *rlp);
void ruadd(struct rusage *ru, struct rusage_ext *rux, struct rusage *ru2,
struct rusage_ext *rux2);
void rucollect(struct rusage *ru, struct rusage *ru2);
void rufetch(struct proc *p, struct rusage *ru);
void rufetchcalc(struct proc *p, struct rusage *ru, struct timeval *up,
struct timeval *sp);
void rufetchtd(struct thread *td, struct rusage *ru);
void ruxagg(struct proc *p, struct thread *td);
void ruxagg_locked(struct proc *p, struct thread *td);
struct uidinfo
*uifind(uid_t uid);
void uifree(struct uidinfo *uip);
void uihashinit(void);
void uihold(struct uidinfo *uip);
#ifdef RACCT
void ui_racct_foreach(void (*callback)(struct racct *racct,
void *arg2, void *arg3), void (*pre)(void), void (*post)(void),
void *arg2, void *arg3);
#endif
#endif
#endif