ref: 0a0c16460f953250153a4f12d4b6cb267c34a377
dir: /kern/postnote.c/
#include "u.h"
#include "lib.h"
#include "dat.h"
#include "fns.h"
#include "error.h"
void
freenote(Note *n)
{
if(n == nil || decref(&n->ref))
return;
free(n);
}
void
freenotes(Proc *p)
{
while(p->nnote > 0){
freenote(p->note[--p->nnote]);
up->note[p->nnote] = nil;
}
}
static Note*
mknote(char *msg, int flag)
{
Note *n;
n = smalloc(sizeof(Note));
kstrcpy(n->msg, msg, ERRMAX);
n->flag = flag;
n->ref.ref = 1;
return n;
}
static int
pushnote(Proc *p, Note *n)
{
if(p->state <= New || p->state == Broken || p->pid == 0){
freenote(n);
return 0;
}
assert(n->ref.ref > 0);
if(n->flag != NUser && (p->notify == nil || p->notified))
freenotes(p);
if(p->nnote < NNOTE){
p->note[p->nnote++] = n;
procinterrupt(p);
return 1;
}
freenote(n);
return 0;
}
int
postnote(Proc *p, int dolock, char *msg, int flag)
{
Note *n;
int ret;
if(p == nil)
return 0;
n = mknote(msg, flag);
if(dolock)
qlock(&p->debug);
ret = pushnote(p, n);
if(dolock)
qunlock(&p->debug);
return ret;
}