]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ref_ptr.cpp
update
[l4.git] / kernel / fiasco / src / kern / ref_ptr.cpp
1 INTERFACE:
2
3 #include "kdb_ke.h"
4 #include "context.h"
5 #include "cpu_lock.h"
6 #include "globals.h"
7
8
9 template<typename T>
10 class Ref_ptr
11 {
12 public:
13   Ref_ptr(T *o = 0) : _p(o)
14   { __take_ref(); }
15
16   T *ptr() const
17   {
18     // assert_kdb (cpu_lock.test());
19     return _p;
20   }
21
22   ~Ref_ptr()
23   { __drop_ref(); }
24
25   Ref_ptr(Ref_ptr<T> const &o)
26   {
27     __drop_ref();
28     _p = o._p;
29     __take_ref();
30   }
31
32   void operator = (Ref_ptr<T> const &o)
33   {
34     __drop_ref();
35     _p = o._p;
36     __take_ref();
37   }
38   
39   void operator = (T *o)
40   {
41     __drop_ref();
42     _p = o;
43     __take_ref();
44   }
45
46   T *operator -> () const { return _p; }
47
48   struct Null_type;
49
50   operator Null_type const * () const
51   { return reinterpret_cast<Null_type const *>(_p); }
52
53 private:
54   void __drop_ref()
55   {
56     if (_p && (_p->dec_ref() == 0))
57       {
58         current()->rcu_wait();
59         delete _p;
60       }
61   }
62
63   void __take_ref()
64   {
65     if (_p)
66       _p->inc_ref();
67   }
68
69   T *_p;
70 };