]> git.lizzy.rs Git - plan9front.git/blob - sys/src/lib9p/req.c
pc: replace duplicated and broken mmu flush code in vunmap()
[plan9front.git] / sys / src / lib9p / req.c
1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
4 #include <fcall.h>
5 #include <thread.h>
6 #include <9p.h>
7
8 static void
9 increqref(void *v)
10 {
11         Req *r;
12
13         r = v;
14         if(r){
15 if(chatty9p > 1)
16         fprint(2, "increfreq %p %ld\n", r, r->ref.ref);
17                 incref(&r->ref);
18         }
19 }
20
21 Reqpool*
22 allocreqpool(void (*destroy)(Req*))
23 {
24         Reqpool *f;
25
26         f = emalloc9p(sizeof *f);
27         f->map = allocmap(increqref);
28         f->destroy = destroy;
29         return f;
30 }
31
32 void
33 freereqpool(Reqpool *p)
34 {
35         freemap(p->map, (void(*)(void*))p->destroy);
36         free(p);
37 }       
38
39 Req*
40 allocreq(Reqpool *pool, ulong tag)
41 {
42         Req *r;
43
44         r = emalloc9p(sizeof *r);
45         r->tag = tag;
46         r->pool = pool;
47
48         increqref(r);
49         increqref(r);
50         if(caninsertkey(pool->map, tag, r) == 0){
51                 closereq(r);
52                 closereq(r);
53                 return nil;
54         }
55
56         return r;
57 }
58
59 Req*
60 lookupreq(Reqpool *pool, ulong tag)
61 {
62 if(chatty9p > 1)
63         fprint(2, "lookupreq %lud\n", tag);
64         return lookupkey(pool->map, tag);
65 }
66
67 void
68 closereq(Req *r)
69 {
70         int i;
71
72         if(r == nil)
73                 return;
74
75 if(chatty9p > 1)
76         fprint(2, "closereq %p %ld\n", r, r->ref.ref);
77
78         if(decref(&r->ref) == 0){
79                 if(r->fid)
80                         closefid(r->fid);
81                 if(r->newfid)
82                         closefid(r->newfid);
83                 if(r->afid)
84                         closefid(r->afid);
85                 if(r->oldreq)
86                         closereq(r->oldreq);
87                 for(i=0; i<r->nflush; i++)
88                         respond(r->flush[i], nil);
89                 free(r->flush);
90                 switch(r->ifcall.type){
91                 case Tstat:
92                         free(r->ofcall.stat);
93                         free(r->d.name);
94                         free(r->d.uid);
95                         free(r->d.gid);
96                         free(r->d.muid);
97                         break;
98                 }
99                 if(r->pool->destroy)
100                         r->pool->destroy(r);
101                 free(r->buf);
102                 free(r->rbuf);
103                 free(r);
104         }
105 }
106
107 Req*
108 removereq(Reqpool *pool, ulong tag)
109 {
110 if(chatty9p > 1)
111         fprint(2, "removereq %lud\n", tag);
112         return deletekey(pool->map, tag);
113 }