Blame


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