]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/u_lock.cpp
update
[l4.git] / kernel / fiasco / src / kern / u_lock.cpp
1 INTERFACE:
2
3 #include "kobject.h"
4 #include "mapping_tree.h"
5 #include "obj_helping_lock.h"
6 #include "kmem_slab.h"
7
8 class Ram_quota;
9
10 class U_lock : public Kobject
11 {
12   FIASCO_DECLARE_KOBJ();
13
14 private:
15   typedef slab_cache_anon Allocator;
16
17   Ram_quota *_q;
18   unsigned long _cnt;
19   mutable Obj_helping_lock _l;
20 public:
21   Context *lockers;
22
23 public:
24   virtual ~U_lock() {}
25 };
26
27
28 IMPLEMENTATION:
29
30 FIASCO_DEFINE_KOBJ(U_lock);
31
32 PUBLIC inline
33 U_lock::U_lock(Ram_quota *q) : _q(q), _cnt(0), lockers(0) {}
34
35 PUBLIC inline
36 Obj_helping_lock::Status 
37 U_lock::lock()
38 { return _l.lock(); }
39
40 PUBLIC inline
41 void
42 U_lock::clear()
43 { _l.clear(); }
44
45 PUBLIC inline
46 unsigned
47 U_lock::dec_ref_cnt()
48 {
49   Lock_guard<Cpu_lock> guard(&cpu_lock);
50   --_cnt;
51   if (_cnt == 0 && Mappable::no_mappings())
52     return 0;
53   else
54     return 1;
55 }
56
57 PUBLIC inline
58 void
59 U_lock::inc_ref_cnt()
60 { ++_cnt; }
61
62 PUBLIC inline
63 bool 
64 U_lock::no_mappings() const
65 {
66   Lock_guard<Cpu_lock> guard(&cpu_lock);
67   if (Mappable::no_mappings())
68     {
69       _l.invalidate();
70       return !_cnt;
71     }
72   return 0;
73 }
74
75
76
77 PUBLIC static
78 U_lock*
79 U_lock::alloc(Ram_quota *q)
80 {
81   void *nq;
82   if (q->alloc(sizeof(U_lock)) && (nq = allocator()->alloc()))
83     return new (nq) U_lock(q);
84
85   return 0;
86 }
87
88 PUBLIC
89 void *
90 U_lock::operator new (size_t, void *p)
91 { return p; }
92
93 PUBLIC 
94 void
95 U_lock::operator delete (void *_l)
96 {
97   U_lock *l = reinterpret_cast<U_lock*>(_l);
98   if (l->_q)
99     l->_q->free(sizeof(U_lock));
100
101   allocator()->free(l);
102 }
103
104 static Kmem_slab_t<U_lock> _ulock_allocator("U_lock");
105
106 PRIVATE static
107 U_lock::Allocator *
108 U_lock::allocator()
109 { return &_ulock_allocator; }
110
111 PUBLIC
112 void
113 U_lock::invoke(Syscall_frame *, Utcb *)
114 {
115   printf("hoooo\n");
116 }