]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/obj_ref_ptr.cpp
update
[l4.git] / kernel / fiasco / src / kern / obj_ref_ptr.cpp
1 INTERFACE:
2
3 class Ram_quota;
4
5 template< typename T >
6 class Ref_ptr
7 {
8 public:
9   class Inv_ptr;
10   Ref_ptr(Ref_ptr<T> const &o) : _o(o._o)  { inc_ref_cnt(); }
11   Ref_ptr(T *o = 0) : _o(o)  { inc_ref_cnt(); }
12   ~Ref_ptr() { dec_ref_cnt(); }
13
14   void operator = (Ref_ptr<T> const &o)
15   { dec_ref_cnt(); _o = o._o; inc_ref_cnt(); }
16
17   void operator = (T *o)
18   { dec_ref_cnt(); _o = o; inc_ref_cnt(); }
19
20   T *operator -> () const { return _o; }
21   T *operator * () const { return _o; }
22   operator Inv_ptr const * () const 
23   { return reinterpret_cast<Inv_ptr const*>(_o); }
24
25 private:
26   T *_o;
27
28   void inc_ref_cnt()
29   {
30     if (_o) 
31       {
32         auto guard = lock_guard(cpu_lock);
33         _o->inc_ref_cnt();
34       }
35   }
36
37   void dec_ref_cnt() const
38   { 
39     if (_o && _o->dec_ref_cnt() == 0)
40       delete _o;
41   }
42
43 };
44