1: /*
2: * Copyright (c) 1986 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)kern_acct.c 3.1 (2.11BSD) 1999/4/29
7: *
8: * This module is a shadow of its former self. This comment:
9: *
10: * SHOULD REPLACE THIS WITH A DRIVER THAT CAN BE READ TO SIMPLIFY.
11: *
12: * is all that is left of the original kern_acct.c module.
13: */
14:
15: #include "param.h"
16: #include "systm.h"
17: #include "user.h"
18: #include "msgbuf.h"
19: #include "kernel.h"
20: #include "acct.h"
21:
22: comp_t compress();
23: int Acctthresh = 10;
24:
25: /*
26: * On exit, write a record on the accounting file.
27: */
28: acct()
29: {
30: struct acct acctbuf;
31: register struct acct *ap = &acctbuf;
32: static short acctcnt = 0;
33:
34: bcopy(u.u_comm, ap->ac_comm, sizeof(acctbuf.ac_comm));
35: /*
36: * The 'user' and 'system' times need to be converted from 'hz' (linefrequency)
37: * clockticks to the AHZ pseudo-tick unit of measure. The elapsed time is
38: * converted from seconds to AHZ ticks.
39: */
40: ap->ac_utime = compress(((u_long)u.u_ru.ru_utime * AHZ) / hz);
41: ap->ac_stime = compress(((u_long)u.u_ru.ru_stime * AHZ) / hz);
42: ap->ac_etime = compress((u_long)(time.tv_sec - u.u_start) * AHZ);
43: ap->ac_btime = u.u_start;
44: ap->ac_uid = u.u_ruid;
45: ap->ac_gid = u.u_rgid;
46: ap->ac_mem = (u.u_dsize+u.u_ssize) / 16; /* fast ctok() */
47: /*
48: * Section 3.9 of the 4.3BSD book says that I/O is measured in 1/AHZ units too.
49: */
50: ap->ac_io = compress((u_long)(u.u_ru.ru_inblock+u.u_ru.ru_oublock)*AHZ);
51: if (u.u_ttyp)
52: ap->ac_tty = u.u_ttyd;
53: else
54: ap->ac_tty = NODEV;
55: ap->ac_flag = u.u_acflag;
56: /*
57: * Not a lot that can be done if logwrt fails so ignore any errors. Every
58: * few (10 by default) commands call the wakeup routine. This isn't perfect
59: * but does cut down the overhead of issuing a wakeup to the accounting daemon
60: * every single accounting record. The threshold is settable via sysctl(8)
61: */
62: logwrt(ap, sizeof (*ap), logACCT);
63: if (++acctcnt >= Acctthresh)
64: {
65: logwakeup(logACCT);
66: acctcnt = 0;
67: }
68: }
69:
70: /*
71: * Raise exponent and drop bits off the right of the mantissa until the
72: * mantissa fits. If we run out of exponent space, return max value (all
73: * one bits). With AHZ set to 64 this is good for close to 8.5 years:
74: * (8191 * (1 << (3*7)) / 64 / 60 / 60 / 24 / 365 ~= 8.5)
75: */
76:
77: #define MANTSIZE 13 /* 13 bit mantissa. */
78: #define EXPSIZE 3 /* Base 8 (3 bit) exponent. */
79:
80: comp_t
81: compress(mant)
82: u_long mant;
83: {
84: register int exp;
85:
86: for (exp = 0; exp < (1 << EXPSIZE); exp++, mant >>= EXPSIZE)
87: if (mant < (1L << MANTSIZE))
88: return(mant | (exp << MANTSIZE));
89: return(~0);
90: }
Defined functions
acct
defined in line
28; used 1 times
Defined variables
Defined macros