first usable version of kernel and commands
After an year of hard work, this is a first "usable" version of Jehanne.
This commit is contained in:
108
sys/src/kern/port/imagmem.c
Normal file
108
sys/src/kern/port/imagmem.c
Normal file
@ -0,0 +1,108 @@
|
||||
/*
|
||||
* This file is part of the UCB release of Plan 9. It is subject to the license
|
||||
* terms in the LICENSE file found in the top-level directory of this
|
||||
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
|
||||
* part of the UCB release of Plan 9, including this file, may be copied,
|
||||
* modified, propagated, or distributed except according to the terms contained
|
||||
* in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "u.h"
|
||||
#include "../port/lib.h"
|
||||
#include "mem.h"
|
||||
#include "dat.h"
|
||||
#include "fns.h"
|
||||
#include <pool.h>
|
||||
|
||||
static void poolprint(Pool*, char*, ...);
|
||||
static void ppanic(Pool*, char*, ...);
|
||||
static void plock(Pool*);
|
||||
static void punlock(Pool*);
|
||||
|
||||
typedef struct Private Private;
|
||||
struct Private {
|
||||
Lock lk;
|
||||
char* end;
|
||||
char msg[256]; /* a rock for messages to be printed at unlock */
|
||||
};
|
||||
|
||||
static Private pimagpriv;
|
||||
static Pool pimagmem = {
|
||||
.name= "Image",
|
||||
.maxsize= 16*1024*1024,
|
||||
.minarena= 2*1024*1024,
|
||||
.quantum= 32,
|
||||
.alloc= qmalloc,
|
||||
.merge= nil,
|
||||
.flags= 0,
|
||||
|
||||
.lock= plock,
|
||||
.unlock= punlock,
|
||||
.print= poolprint,
|
||||
.panic= ppanic,
|
||||
|
||||
.private= &pimagpriv,
|
||||
};
|
||||
|
||||
Pool* imagmem = &pimagmem;
|
||||
|
||||
/*
|
||||
* because we can't print while we're holding the locks,
|
||||
* we have the save the message and print it once we let go.
|
||||
*/
|
||||
static void
|
||||
poolprint(Pool *p, char *fmt, ...)
|
||||
{
|
||||
va_list v;
|
||||
Private *pv;
|
||||
|
||||
pv = p->private;
|
||||
va_start(v, fmt);
|
||||
pv->end = vseprint(pv->end, &pv->msg[sizeof pv->msg], fmt, v);
|
||||
va_end(v);
|
||||
}
|
||||
|
||||
static void
|
||||
ppanic(Pool *p, char *fmt, ...)
|
||||
{
|
||||
va_list v;
|
||||
Private *pv;
|
||||
char msg[sizeof pv->msg];
|
||||
|
||||
pv = p->private;
|
||||
va_start(v, fmt);
|
||||
vseprint(pv->end, &pv->msg[sizeof pv->msg], fmt, v);
|
||||
va_end(v);
|
||||
memmove(msg, pv->msg, sizeof msg);
|
||||
iunlock(&pv->lk);
|
||||
panic("%s", msg);
|
||||
}
|
||||
|
||||
static void
|
||||
plock(Pool *p)
|
||||
{
|
||||
Private *pv;
|
||||
|
||||
pv = p->private;
|
||||
ilock(&pv->lk);
|
||||
//pv->lk.pc = getcallerpc(); // TODO: mcslocks handles pc differently, add this back introducing ilockat(l, pc)
|
||||
pv->end = pv->msg;
|
||||
}
|
||||
|
||||
static void
|
||||
punlock(Pool *p)
|
||||
{
|
||||
Private *pv;
|
||||
char msg[sizeof pv->msg];
|
||||
|
||||
pv = p->private;
|
||||
if(pv->end == pv->msg){
|
||||
iunlock(&pv->lk);
|
||||
return;
|
||||
}
|
||||
|
||||
memmove(msg, pv->msg, sizeof msg);
|
||||
pv->end = pv->msg;
|
||||
iunlock(&pv->lk);
|
||||
iprint("%.*s", sizeof pv->msg, msg);
|
||||
}
|
Reference in New Issue
Block a user