3 #include "../memory/safe_ptr.h"
\r
6 #include <concurrent_queue.h>
\r
7 #include <tbb/atomic.h>
\r
9 #include <boost/noncopyable.hpp>
\r
17 typedef std::vector<safe_ptr<int>> ticket_t;
\r
19 class governor : boost::noncopyable
\r
21 struct impl : std::enable_shared_from_this<impl>
\r
23 tbb::atomic<int> count_;
\r
24 tbb::atomic<int> is_running_;
\r
25 Concurrency::concurrent_queue<Concurrency::Context*> waiting_contexts_;
\r
27 void acquire_ticket()
\r
33 Concurrency::Context::Yield();
\r
37 auto context = Concurrency::Context::CurrentContext();
\r
38 waiting_contexts_.push(context);
\r
43 void release_ticket()
\r
50 Concurrency:: Context* waiting = NULL;
\r
51 while(!waiting_contexts_.try_pop(waiting))
\r
52 Concurrency::Context::Yield();
\r
59 impl(size_t capacity)
\r
69 auto self = shared_from_this();
\r
71 ticket.push_back(safe_ptr<int>(new int, [this, self](int* p)
\r
81 is_running_ = false;
\r
82 Concurrency::Context* waiting = NULL;
\r
83 while(waiting_contexts_.try_pop(waiting))
\r
89 governor(size_t capacity) : impl_(new impl(capacity))
\r
95 return impl_->acquire();
\r
104 safe_ptr<impl> impl_;
\r