free fuse messages

This commit is contained in:
rsc 2006-08-01 03:19:53 +00:00
parent 0d5f0a724b
commit be8b4b397a

View file

@ -5,6 +5,7 @@ int fuseeof;
int fusebufsize; int fusebufsize;
int fusemaxwrite; int fusemaxwrite;
FuseMsg *fusemsglist; FuseMsg *fusemsglist;
Lock fusemsglock;
int mountfuse(char *mtpt); int mountfuse(char *mtpt);
void unmountfuse(char *mtpt); void unmountfuse(char *mtpt);
@ -15,10 +16,13 @@ allocfusemsg(void)
FuseMsg *m; FuseMsg *m;
void *vbuf; void *vbuf;
lock(&fusemsglock);
if((m = fusemsglist) != nil){ if((m = fusemsglist) != nil){
fusemsglist = m->next; fusemsglist = m->next;
unlock(&fusemsglock);
return m; return m;
} }
unlock(&fusemsglock);
m = emalloc(sizeof(*m) + fusebufsize); m = emalloc(sizeof(*m) + fusebufsize);
vbuf = m+1; vbuf = m+1;
m->buf = vbuf; m->buf = vbuf;
@ -31,8 +35,10 @@ allocfusemsg(void)
void void
freefusemsg(FuseMsg *m) freefusemsg(FuseMsg *m)
{ {
lock(&fusemsglock);
m->next = fusemsglist; m->next = fusemsglist;
fusemsglist = m; fusemsglist = m;
unlock(&fusemsglock);
} }
FuseMsg* FuseMsg*
@ -234,6 +240,7 @@ replyfuse(FuseMsg *m, void *arg, int narg)
} }
if(writev(fusefd, vec, nvec) < 0) if(writev(fusefd, vec, nvec) < 0)
sysfatal("replyfuse: %r"); sysfatal("replyfuse: %r");
freefusemsg(m);
} }
/* /*
@ -251,6 +258,7 @@ replyfuseerrno(FuseMsg *m, int e)
fprint(2, "FUSE <- %#G\n", m->hdr, &hdr, 0); fprint(2, "FUSE <- %#G\n", m->hdr, &hdr, 0);
if(write(fusefd, &hdr, sizeof hdr) < 0) if(write(fusefd, &hdr, sizeof hdr) < 0)
sysfatal("replyfuseerror: %r"); sysfatal("replyfuseerror: %r");
freefusemsg(m);
} }
void void
@ -310,7 +318,6 @@ initfuse(char *mtpt)
rx.minor = FUSE_KERNEL_MINOR_VERSION; rx.minor = FUSE_KERNEL_MINOR_VERSION;
rx.max_write = fusemaxwrite; rx.max_write = fusemaxwrite;
replyfuse(m, &rx, sizeof rx); replyfuse(m, &rx, sizeof rx);
freefusemsg(m);
} }
/* /*