svlogd: remove unused buffering, stop doing tons of memcpy
This commit is contained in:
parent
bde74b617f
commit
ca549c5e69
@ -286,12 +286,12 @@ uint64_t taia2millisec(const struct taia *t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void iopause(iopause_fd *x,unsigned len,struct taia *deadline,struct taia *stamp)
|
void iopause(iopause_fd *x, unsigned len, struct taia *deadline, struct taia *stamp)
|
||||||
{
|
{
|
||||||
int millisecs;
|
int millisecs;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (taia_less(deadline,stamp))
|
if (taia_less(deadline, stamp))
|
||||||
millisecs = 0;
|
millisecs = 0;
|
||||||
else {
|
else {
|
||||||
uint64_t m;
|
uint64_t m;
|
||||||
|
@ -35,7 +35,7 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
static unsigned verbose;
|
static unsigned verbose;
|
||||||
static int linemax = 1000;
|
static int linemax = 1000;
|
||||||
static int buflen = 1024;
|
////static int buflen = 1024;
|
||||||
static int linelen;
|
static int linelen;
|
||||||
|
|
||||||
static char **fndir;
|
static char **fndir;
|
||||||
@ -49,13 +49,13 @@ static unsigned rotateasap;
|
|||||||
static unsigned reopenasap;
|
static unsigned reopenasap;
|
||||||
static unsigned linecomplete = 1;
|
static unsigned linecomplete = 1;
|
||||||
static unsigned tmaxflag;
|
static unsigned tmaxflag;
|
||||||
static iopause_fd in;
|
static iopause_fd input;
|
||||||
|
|
||||||
static const char *replace = "";
|
static const char *replace = "";
|
||||||
static char repl;
|
static char repl;
|
||||||
|
|
||||||
static struct logdir {
|
static struct logdir {
|
||||||
char *btmp;
|
////char *btmp;
|
||||||
/* pattern list to match, in "aa\0bb\0\cc\0\0" form */
|
/* pattern list to match, in "aa\0bb\0\cc\0\0" form */
|
||||||
char *inst;
|
char *inst;
|
||||||
char *processor;
|
char *processor;
|
||||||
@ -373,7 +373,8 @@ static int buffer_pwrite(int n, char *s, unsigned len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (errno) pause2cannot("write to current", ld->name);
|
if (errno)
|
||||||
|
pause2cannot("write to current", ld->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
ld->size += i;
|
ld->size += i;
|
||||||
@ -621,7 +622,7 @@ static int buffer_pread(int fd, char *s, unsigned len)
|
|||||||
sig_unblock(SIGCHLD);
|
sig_unblock(SIGCHLD);
|
||||||
sig_unblock(SIGALRM);
|
sig_unblock(SIGALRM);
|
||||||
sig_unblock(SIGHUP);
|
sig_unblock(SIGHUP);
|
||||||
iopause(&in, 1, &trotate, &now);
|
iopause(&input, 1, &trotate, &now);
|
||||||
sig_block(SIGTERM);
|
sig_block(SIGTERM);
|
||||||
sig_block(SIGCHLD);
|
sig_block(SIGCHLD);
|
||||||
sig_block(SIGALRM);
|
sig_block(SIGALRM);
|
||||||
@ -732,6 +733,8 @@ int svlogd_main(int argc, char **argv)
|
|||||||
unsigned opt;
|
unsigned opt;
|
||||||
unsigned timestamp = 0;
|
unsigned timestamp = 0;
|
||||||
|
|
||||||
|
#define line bb_common_bufsiz1
|
||||||
|
|
||||||
opt_complementary = "tt:vv";
|
opt_complementary = "tt:vv";
|
||||||
opt = getopt32(argc, argv, "r:R:l:b:tv",
|
opt = getopt32(argc, argv, "r:R:l:b:tv",
|
||||||
&r, &replace, &l, &b, ×tamp, &verbose);
|
&r, &replace, &l, &b, ×tamp, &verbose);
|
||||||
@ -741,38 +744,40 @@ int svlogd_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
if (opt & 2) if (!repl) repl = '_'; // -R
|
if (opt & 2) if (!repl) repl = '_'; // -R
|
||||||
if (opt & 4) { // -l
|
if (opt & 4) { // -l
|
||||||
linemax = xatou_range(l, 0, 1000);
|
linemax = xatou_range(l, 0, BUFSIZ-26);
|
||||||
if (linemax == 0) linemax = 1000;
|
if (linemax == 0) linemax = BUFSIZ-26;
|
||||||
if (linemax < 256) linemax = 256;
|
if (linemax < 256) linemax = 256;
|
||||||
}
|
}
|
||||||
if (opt & 8) { // -b
|
if (opt & 8) { // -b
|
||||||
buflen = xatoi_u(b);
|
////buflen = xatoi_u(b);
|
||||||
if (buflen == 0) buflen = 1024;
|
////if (buflen == 0) buflen = 1024;
|
||||||
}
|
}
|
||||||
//if (opt & 0x10) timestamp++; // -t
|
//if (opt & 0x10) timestamp++; // -t
|
||||||
//if (opt & 0x20) verbose++; // -v
|
//if (opt & 0x20) verbose++; // -v
|
||||||
if (timestamp > 2) timestamp = 2;
|
//if (timestamp > 2) timestamp = 2;
|
||||||
argv += optind;
|
argv += optind;
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
|
|
||||||
dirn = argc;
|
dirn = argc;
|
||||||
if (dirn <= 0) usage();
|
if (dirn <= 0) usage();
|
||||||
if (buflen <= linemax) usage();
|
////if (buflen <= linemax) usage();
|
||||||
fdwdir = xopen(".", O_RDONLY|O_NDELAY);
|
fdwdir = xopen(".", O_RDONLY|O_NDELAY);
|
||||||
coe(fdwdir);
|
coe(fdwdir);
|
||||||
dir = xmalloc(dirn * sizeof(struct logdir));
|
dir = xmalloc(dirn * sizeof(struct logdir));
|
||||||
for (i = 0; i < dirn; ++i) {
|
for (i = 0; i < dirn; ++i) {
|
||||||
dir[i].fddir = -1;
|
dir[i].fddir = -1;
|
||||||
dir[i].fdcur = -1;
|
dir[i].fdcur = -1;
|
||||||
dir[i].btmp = xmalloc(buflen);
|
////dir[i].btmp = xmalloc(buflen);
|
||||||
dir[i].ppid = 0;
|
dir[i].ppid = 0;
|
||||||
}
|
}
|
||||||
line = xmalloc(linemax + (timestamp ? 26 : 0));
|
/* line = xmalloc(linemax + (timestamp ? 26 : 0)); */
|
||||||
fndir = argv;
|
fndir = argv;
|
||||||
in.fd = 0;
|
input.fd = 0;
|
||||||
in.events = IOPAUSE_READ;
|
input.events = IOPAUSE_READ;
|
||||||
ndelay_on(in.fd);
|
/* I be damned. Linux 2.6.18: this somehow affects
|
||||||
|
* OTHER processes! Konsole starts to redraw itself much slower!
|
||||||
|
* This persists even after svlogd exits */
|
||||||
|
ndelay_on(input.fd);
|
||||||
sig_block(SIGTERM);
|
sig_block(SIGTERM);
|
||||||
sig_block(SIGCHLD);
|
sig_block(SIGCHLD);
|
||||||
sig_block(SIGALRM);
|
sig_block(SIGALRM);
|
||||||
@ -786,14 +791,16 @@ int svlogd_main(int argc, char **argv)
|
|||||||
|
|
||||||
/* Each iteration processes one line */
|
/* Each iteration processes one line */
|
||||||
while (1) {
|
while (1) {
|
||||||
int printlen;
|
char stamp[FMT_PTIME];
|
||||||
char *lineptr = line;
|
char *lineptr;
|
||||||
|
char *printptr;
|
||||||
char *np;
|
char *np;
|
||||||
|
int printlen;
|
||||||
char ch;
|
char ch;
|
||||||
|
|
||||||
|
lineptr = line;
|
||||||
/* Prepare timestamp if needed */
|
/* Prepare timestamp if needed */
|
||||||
if (timestamp) {
|
if (timestamp) {
|
||||||
char stamp[FMT_PTIME];
|
|
||||||
taia_now(&now);
|
taia_now(&now);
|
||||||
switch (timestamp) {
|
switch (timestamp) {
|
||||||
case 1:
|
case 1:
|
||||||
@ -803,8 +810,6 @@ int svlogd_main(int argc, char **argv)
|
|||||||
fmt_ptime30nul(stamp, &now);
|
fmt_ptime30nul(stamp, &now);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memcpy(line, stamp, 25);
|
|
||||||
line[25] = ' ';
|
|
||||||
lineptr += 26;
|
lineptr += 26;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -819,8 +824,8 @@ int svlogd_main(int argc, char **argv)
|
|||||||
if (sz <= 0) /* EOF or error on stdin */
|
if (sz <= 0) /* EOF or error on stdin */
|
||||||
exitasap = 1;
|
exitasap = 1;
|
||||||
else {
|
else {
|
||||||
|
np = memchr(lineptr + stdin_cnt, '\n', sz);
|
||||||
stdin_cnt += sz;
|
stdin_cnt += sz;
|
||||||
np = memchr(lineptr, '\n', stdin_cnt);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (stdin_cnt <= 0 && exitasap)
|
if (stdin_cnt <= 0 && exitasap)
|
||||||
@ -828,21 +833,33 @@ int svlogd_main(int argc, char **argv)
|
|||||||
|
|
||||||
/* Search for '\n' (in fact, np already holds the result) */
|
/* Search for '\n' (in fact, np already holds the result) */
|
||||||
linelen = stdin_cnt;
|
linelen = stdin_cnt;
|
||||||
if (np) linelen = np - lineptr + 1;
|
if (np) {
|
||||||
|
print_to_nl: /* NB: starting from here lineptr may point
|
||||||
|
* farther out into line[] */
|
||||||
|
linelen = np - lineptr + 1;
|
||||||
|
}
|
||||||
/* linelen == no of chars incl. '\n' (or == stdin_cnt) */
|
/* linelen == no of chars incl. '\n' (or == stdin_cnt) */
|
||||||
ch = lineptr[linelen-1];
|
ch = lineptr[linelen-1];
|
||||||
|
|
||||||
printlen = linelen + (timestamp ? 26 : 0);
|
/* write out lineptr[0..linelen-1] to each log destination */
|
||||||
/* write out line[0..printlen-1] to each log destination */
|
/* (or lineptr[-26..linelen-1] if timestamping) */
|
||||||
|
printlen = linelen;
|
||||||
|
printptr = lineptr;
|
||||||
|
if (timestamp) {
|
||||||
|
printlen += 26;
|
||||||
|
printptr -= 26;
|
||||||
|
memcpy(printptr, stamp, 25);
|
||||||
|
printptr[25] = ' ';
|
||||||
|
}
|
||||||
for (i = 0; i < dirn; ++i) {
|
for (i = 0; i < dirn; ++i) {
|
||||||
struct logdir *ld = &dir[i];
|
struct logdir *ld = &dir[i];
|
||||||
if (ld->fddir == -1) continue;
|
if (ld->fddir == -1) continue;
|
||||||
if (ld->inst)
|
if (ld->inst)
|
||||||
logmatch(ld);
|
logmatch(ld);
|
||||||
if (ld->matcherr == 'e')
|
if (ld->matcherr == 'e')
|
||||||
full_write(2, line, printlen);
|
full_write(2, printptr, printlen);
|
||||||
if (ld->match != '+') continue;
|
if (ld->match != '+') continue;
|
||||||
buffer_pwrite(i, line, printlen);
|
buffer_pwrite(i, printptr, printlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we didn't see '\n' (long input line), */
|
/* If we didn't see '\n' (long input line), */
|
||||||
@ -851,9 +868,9 @@ int svlogd_main(int argc, char **argv)
|
|||||||
/* lineptr is emptied now, safe to use as buffer */
|
/* lineptr is emptied now, safe to use as buffer */
|
||||||
stdin_cnt = exitasap ? -1 : buffer_pread(0, lineptr, linemax);
|
stdin_cnt = exitasap ? -1 : buffer_pread(0, lineptr, linemax);
|
||||||
if (stdin_cnt <= 0) { /* EOF or error on stdin */
|
if (stdin_cnt <= 0) { /* EOF or error on stdin */
|
||||||
|
exitasap = 1;
|
||||||
lineptr[0] = ch = '\n';
|
lineptr[0] = ch = '\n';
|
||||||
linelen = 1;
|
linelen = 1;
|
||||||
exitasap = 1;
|
|
||||||
stdin_cnt = 1;
|
stdin_cnt = 1;
|
||||||
} else {
|
} else {
|
||||||
linelen = stdin_cnt;
|
linelen = stdin_cnt;
|
||||||
@ -871,10 +888,17 @@ int svlogd_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move unprocessed data to the front of line */
|
|
||||||
stdin_cnt -= linelen;
|
stdin_cnt -= linelen;
|
||||||
if (stdin_cnt > 0) /* TODO: slow if buffer is big */
|
if (stdin_cnt > 0) {
|
||||||
memmove(lineptr, &lineptr[linelen], stdin_cnt);
|
lineptr += linelen;
|
||||||
|
/* If we see another '\n', we don't need to read
|
||||||
|
* next piece of input: can print what we have */
|
||||||
|
np = memchr(lineptr, '\n', stdin_cnt);
|
||||||
|
if (np)
|
||||||
|
goto print_to_nl;
|
||||||
|
/* Move unprocessed data to the front of line */
|
||||||
|
memmove((timestamp ? line+26 : line), lineptr, stdin_cnt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < dirn; ++i) {
|
for (i = 0; i < dirn; ++i) {
|
||||||
|
Loading…
Reference in New Issue
Block a user