123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- #include "u.h"
- #include "../port/lib.h"
- #include "mem.h"
- #include "dat.h"
- #include "fns.h"
- #include "../port/error.h"
- static char Ebadlogctl[] = "unknown log ctl message";
- void
- logopen(Log *alog)
- {
- Proc *up = externup();
- lock(&alog->l);
- if(waserror()){
- unlock(&alog->l);
- nexterror();
- }
- if(alog->opens == 0){
- if(alog->nlog == 0)
- alog->nlog = 4*1024;
- if(alog->minread == 0)
- alog->minread = 1;
- if(alog->buf == nil && (alog->buf = malloc(alog->nlog)) == nil)
- error(Enomem);
- alog->rptr = alog->buf;
- alog->end = alog->buf + alog->nlog;
- alog->len = 0;
- }
- alog->opens++;
- unlock(&alog->l);
- poperror();
- }
- void
- logclose(Log *alog)
- {
- lock(&alog->l);
- alog->opens--;
- if(alog->opens == 0){
- free(alog->buf);
- alog->buf = nil;
- }
- unlock(&alog->l);
- }
- int
- logready(void *a)
- {
- Log *alog = a;
- return alog->len >= alog->minread;
- }
- int32_t
- logread(Log *alog, void *a, int32_t n, int64_t _)
- {
- Proc *up = externup();
- int i, d;
- char *p, *rptr;
- qlock(&alog->readq);
- if(waserror()){
- qunlock(&alog->readq);
- nexterror();
- }
- for(;;){
- lock(&alog->l);
- if(alog->len >= alog->minread || alog->len >= n){
- if(n > alog->len)
- n = alog->len;
- d = 0;
- rptr = alog->rptr;
- alog->rptr += n;
- if(alog->rptr >= alog->end){
- d = alog->rptr - alog->end;
- alog->rptr = alog->buf + d;
- }
- alog->len -= n;
- unlock(&alog->l);
- i = n-d;
- p = a;
- memmove(p, rptr, i);
- memmove(p+i, alog->buf, d);
- break;
- }
- else
- unlock(&alog->l);
- sleep(&alog->readr, logready, alog);
- }
- qunlock(&alog->readq);
- poperror();
- return n;
- }
- char*
- logctl(Log *alog, int argc, char *argv[], Logflag *flags)
- {
- int i, set;
- Logflag *fp;
- if(argc < 2)
- return Ebadlogctl;
- if(strcmp("set", argv[0]) == 0)
- set = 1;
- else if(strcmp("clear", argv[0]) == 0)
- set = 0;
- else
- return Ebadlogctl;
- for(i = 1; i < argc; i++){
- for(fp = flags; fp->name; fp++)
- if(strcmp(fp->name, argv[i]) == 0)
- break;
- if(fp->name == nil)
- continue;
- if(set)
- alog->logmask |= fp->mask;
- else
- alog->logmask &= ~fp->mask;
- }
- return nil;
- }
- void
- logn(Log *alog, int mask, void *buf, int n)
- {
- char *fp, *t;
- int dowake, i;
- if(!(alog->logmask & mask))
- return;
- if(alog->opens == 0)
- return;
- if(n > alog->nlog)
- return;
- lock(&alog->l);
- i = alog->len + n - alog->nlog;
- if(i > 0){
- alog->len -= i;
- alog->rptr += i;
- if(alog->rptr >= alog->end)
- alog->rptr = alog->buf + (alog->rptr - alog->end);
- }
- t = alog->rptr + alog->len;
- fp = buf;
- alog->len += n;
- while(n-- > 0){
- if(t >= alog->end)
- t = alog->buf + (t - alog->end);
- *t++ = *fp++;
- }
- dowake = alog->len >= alog->minread;
- unlock(&alog->l);
- if(dowake)
- wakeup(&alog->readr);
- }
- void
- log(Log *alog, int mask, char *fmt, ...)
- {
- int n;
- va_list arg;
- char buf[128];
- if(!(alog->logmask & mask))
- return;
- if(alog->opens == 0)
- return;
- va_start(arg, fmt);
- n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf;
- va_end(arg);
- logn(alog, mask, buf, n);
- }
|