Blame


1 6f4d00ee 2013-09-23 0intro #include "stdinc.h"
2 6f4d00ee 2013-09-23 0intro
3 6f4d00ee 2013-09-23 0intro #include "9.h"
4 6f4d00ee 2013-09-23 0intro
5 6f4d00ee 2013-09-23 0intro static struct {
6 4b576658 2013-09-23 0intro QLock lock;
7 6f4d00ee 2013-09-23 0intro
8 6f4d00ee 2013-09-23 0intro Excl* head;
9 6f4d00ee 2013-09-23 0intro Excl* tail;
10 6f4d00ee 2013-09-23 0intro } ebox;
11 6f4d00ee 2013-09-23 0intro
12 6f4d00ee 2013-09-23 0intro struct Excl {
13 6f4d00ee 2013-09-23 0intro Fsys* fsys;
14 6f4d00ee 2013-09-23 0intro uvlong path;
15 6f4d00ee 2013-09-23 0intro ulong time;
16 6f4d00ee 2013-09-23 0intro
17 6f4d00ee 2013-09-23 0intro Excl* next;
18 6f4d00ee 2013-09-23 0intro Excl* prev;
19 6f4d00ee 2013-09-23 0intro };
20 6f4d00ee 2013-09-23 0intro
21 6f4d00ee 2013-09-23 0intro enum {
22 6f4d00ee 2013-09-23 0intro LifeTime = (5*60),
23 6f4d00ee 2013-09-23 0intro };
24 6f4d00ee 2013-09-23 0intro
25 6f4d00ee 2013-09-23 0intro int
26 6f4d00ee 2013-09-23 0intro exclAlloc(Fid* fid)
27 6f4d00ee 2013-09-23 0intro {
28 6f4d00ee 2013-09-23 0intro ulong t;
29 6f4d00ee 2013-09-23 0intro Excl *excl;
30 6f4d00ee 2013-09-23 0intro
31 6f4d00ee 2013-09-23 0intro assert(fid->excl == nil);
32 6f4d00ee 2013-09-23 0intro
33 6f4d00ee 2013-09-23 0intro t = time(0L);
34 4b576658 2013-09-23 0intro qlock(&ebox.lock);
35 6f4d00ee 2013-09-23 0intro for(excl = ebox.head; excl != nil; excl = excl->next){
36 6f4d00ee 2013-09-23 0intro if(excl->fsys != fid->fsys || excl->path != fid->qid.path)
37 6f4d00ee 2013-09-23 0intro continue;
38 6f4d00ee 2013-09-23 0intro /*
39 6f4d00ee 2013-09-23 0intro * Found it.
40 6f4d00ee 2013-09-23 0intro * Now, check if it's timed out.
41 6f4d00ee 2013-09-23 0intro * If not, return error, it's locked.
42 6f4d00ee 2013-09-23 0intro * If it has timed out, zap the old
43 6f4d00ee 2013-09-23 0intro * one and continue on to allocate a
44 6f4d00ee 2013-09-23 0intro * a new one.
45 6f4d00ee 2013-09-23 0intro */
46 6f4d00ee 2013-09-23 0intro if(excl->time >= t){
47 4b576658 2013-09-23 0intro qunlock(&ebox.lock);
48 4b576658 2013-09-23 0intro werrstr("exclusive lock");
49 6f4d00ee 2013-09-23 0intro return 0;
50 6f4d00ee 2013-09-23 0intro }
51 6f4d00ee 2013-09-23 0intro excl->fsys = nil;
52 6f4d00ee 2013-09-23 0intro }
53 6f4d00ee 2013-09-23 0intro
54 6f4d00ee 2013-09-23 0intro /*
55 6f4d00ee 2013-09-23 0intro * Not found or timed-out.
56 6f4d00ee 2013-09-23 0intro * Alloc a new one and initialise.
57 6f4d00ee 2013-09-23 0intro */
58 4b576658 2013-09-23 0intro excl = vtmallocz(sizeof(Excl));
59 6f4d00ee 2013-09-23 0intro excl->fsys = fid->fsys;
60 6f4d00ee 2013-09-23 0intro excl->path = fid->qid.path;
61 6f4d00ee 2013-09-23 0intro excl->time = t+LifeTime;
62 6f4d00ee 2013-09-23 0intro if(ebox.tail != nil){
63 6f4d00ee 2013-09-23 0intro excl->prev = ebox.tail;
64 6f4d00ee 2013-09-23 0intro ebox.tail->next = excl;
65 6f4d00ee 2013-09-23 0intro }
66 6f4d00ee 2013-09-23 0intro else{
67 6f4d00ee 2013-09-23 0intro ebox.head = excl;
68 6f4d00ee 2013-09-23 0intro excl->prev = nil;
69 6f4d00ee 2013-09-23 0intro }
70 6f4d00ee 2013-09-23 0intro ebox.tail = excl;
71 6f4d00ee 2013-09-23 0intro excl->next = nil;
72 4b576658 2013-09-23 0intro qunlock(&ebox.lock);
73 6f4d00ee 2013-09-23 0intro
74 6f4d00ee 2013-09-23 0intro fid->excl = excl;
75 6f4d00ee 2013-09-23 0intro return 1;
76 6f4d00ee 2013-09-23 0intro }
77 6f4d00ee 2013-09-23 0intro
78 6f4d00ee 2013-09-23 0intro int
79 6f4d00ee 2013-09-23 0intro exclUpdate(Fid* fid)
80 6f4d00ee 2013-09-23 0intro {
81 6f4d00ee 2013-09-23 0intro ulong t;
82 6f4d00ee 2013-09-23 0intro Excl *excl;
83 6f4d00ee 2013-09-23 0intro
84 6f4d00ee 2013-09-23 0intro excl = fid->excl;
85 6f4d00ee 2013-09-23 0intro
86 6f4d00ee 2013-09-23 0intro t = time(0L);
87 4b576658 2013-09-23 0intro qlock(&ebox.lock);
88 6f4d00ee 2013-09-23 0intro if(excl->time < t || excl->fsys != fid->fsys){
89 4b576658 2013-09-23 0intro qunlock(&ebox.lock);
90 4b576658 2013-09-23 0intro werrstr("exclusive lock broken");
91 6f4d00ee 2013-09-23 0intro return 0;
92 6f4d00ee 2013-09-23 0intro }
93 6f4d00ee 2013-09-23 0intro excl->time = t+LifeTime;
94 4b576658 2013-09-23 0intro qunlock(&ebox.lock);
95 6f4d00ee 2013-09-23 0intro
96 6f4d00ee 2013-09-23 0intro return 1;
97 6f4d00ee 2013-09-23 0intro }
98 6f4d00ee 2013-09-23 0intro
99 6f4d00ee 2013-09-23 0intro void
100 6f4d00ee 2013-09-23 0intro exclFree(Fid* fid)
101 6f4d00ee 2013-09-23 0intro {
102 6f4d00ee 2013-09-23 0intro Excl *excl;
103 6f4d00ee 2013-09-23 0intro
104 6f4d00ee 2013-09-23 0intro if((excl = fid->excl) == nil)
105 6f4d00ee 2013-09-23 0intro return;
106 6f4d00ee 2013-09-23 0intro fid->excl = nil;
107 6f4d00ee 2013-09-23 0intro
108 4b576658 2013-09-23 0intro qlock(&ebox.lock);
109 6f4d00ee 2013-09-23 0intro if(excl->prev != nil)
110 6f4d00ee 2013-09-23 0intro excl->prev->next = excl->next;
111 6f4d00ee 2013-09-23 0intro else
112 6f4d00ee 2013-09-23 0intro ebox.head = excl->next;
113 6f4d00ee 2013-09-23 0intro if(excl->next != nil)
114 6f4d00ee 2013-09-23 0intro excl->next->prev = excl->prev;
115 6f4d00ee 2013-09-23 0intro else
116 6f4d00ee 2013-09-23 0intro ebox.tail = excl->prev;
117 4b576658 2013-09-23 0intro qunlock(&ebox.lock);
118 6f4d00ee 2013-09-23 0intro
119 4b576658 2013-09-23 0intro vtfree(excl);
120 6f4d00ee 2013-09-23 0intro }
121 6f4d00ee 2013-09-23 0intro
122 6f4d00ee 2013-09-23 0intro void
123 6f4d00ee 2013-09-23 0intro exclInit(void)
124 6f4d00ee 2013-09-23 0intro {
125 6f4d00ee 2013-09-23 0intro }