commit d4ccb0a943fb312d949726827d4e4e71e6a7a0bb from: Ties Bos via: Russ Cox date: Tue Sep 11 02:07:26 2012 UTC 9pfuse: fix memory leak, avoid memory explosion Change is to handle FUSE_FORGET in main loop instead of separate thread for each as 10s of thousands can come in at once. Fixes issue 104. R=0intro, rsc http://codereview.appspot.com/6498081 commit - ba3110263311be872f4d1d1e11735d7afee1f61a commit + d4ccb0a943fb312d949726827d4e4e71e6a7a0bb blob - 4f9ea2c7baac2cc51335496e9fbda427b6d539c8 blob + 67d90a5ea8970a51b59da904c9d4cbcf128f3664 --- CONTRIBUTORS +++ CONTRIBUTORS @@ -35,6 +35,7 @@ Rob Kroeger Rob Pike Russ Cox Sean McKean +Ties Bos Tim Newsham Tony Lainson Venkatesh Srinivas blob - 97783fb5c6dcf107fe258c86bca09ba224d337f5 blob + 8fa56ff45d44a3f67589c70e4278bf2da00f6f6f --- src/cmd/9pfuse/main.c +++ src/cmd/9pfuse/main.c @@ -257,6 +257,7 @@ allocfh(CFid *fid) { return _alloc(fid, 0); } + uvlong allocnodeid(CFid *fid) { @@ -412,6 +413,7 @@ fuseforget(FuseMsg *m) fprint(2, "bad count in forget\n"); ff->ref = 1; freefusefid(ff); + freefusemsg(m); } /* @@ -1255,8 +1257,15 @@ fusedispatch(void *v) fusehandlers[fuselist[i].op] = fuselist[i].fn; } - while((m = recvp(fusechan)) != nil) - threadcreate(fusethread, m, STACK); + while((m = recvp(fusechan)) != nil) { + switch(m->hdr->opcode) { + case FUSE_FORGET: + fusehandlers[m->hdr->opcode](m); + break; + default: + threadcreate(fusethread, m, STACK); + } + } } void*