3 #ifndef __ARC_THREAD_H__
4 #define __ARC_THREAD_H__
8 #include <glibmm/thread.h>
15 class SimpleCondition;
29 const size_t thread_stacksize = (16 * 1024 * 1024);
48 friend class ThreadData;
67 void Attach(std::string& key);
71 void Attach(
const std::string& key);
80 virtual void Dup(
void);
91 unsigned int waiting_;
94 : flag_(0), waiting_(0) {}
124 flag_ = waiting_?waiting_:1;
132 while (!flag_) cond_.wait(lock_);
141 while (!flag_) cond_.wait(lock_);
150 etime.assign_current_time();
151 etime.add_milliseconds(t);
155 res = cond_.timed_wait(lock_, etime);
191 virtual int inc(
void);
194 virtual int dec(
void);
196 virtual int get(void)
const;
199 virtual int set(
int v);
201 virtual void wait(
void)
const;
205 virtual bool wait(
int t)
const;
233 etime.assign_current_time();
234 etime.add_milliseconds(t);
236 if(!cond_.timed_wait(lock_, etime))
break;
273 unsigned int exclusive_;
274 Glib::Thread* thread_;
275 typedef std::map<Glib::Thread*,unsigned int> shared_list;
277 void add_shared_lock(
void);
278 void remove_shared_lock(
void);
279 bool have_shared_lock(
void);
280 inline bool have_exclusive_lock(
void) {
281 if(!exclusive_)
return false;
282 if(thread_ == Glib::Thread::self())
return false;
294 return (shared_.size() > 0);
302 return (exclusive_ > 0);
316 class ThreadedPointerBase {
323 ThreadedPointerBase(ThreadedPointerBase&);
324 ~ThreadedPointerBase(
void);
326 ThreadedPointerBase(
void *p);
327 ThreadedPointerBase* add(
void);
329 void* ptr(
void)
const {
return ptr_; };
330 void rel(
void) { released_ =
true; };
331 unsigned int cnt(
void)
const {
return cnt_; };
332 void lock(
void) { lock_.lock(); };
333 void unlock(
void) { lock_.unlock(); };
334 void wait(
void) { cond_.wait(lock_); };
335 bool wait(Glib::TimeVal etime) {
336 return cond_.timed_wait(lock_,etime);
350 ThreadedPointerBase *object_;
353 : object_(
new ThreadedPointerBase(p)) {}
355 : object_(p.object_->add()) {}
357 : object_(
new ThreadedPointerBase(NULL)) {}
359 delete((T*)(object_->rem()));
362 if (p != object_->ptr()) {
363 delete((T*)(object_->rem()));
364 object_ =
new ThreadedPointerBase(p);
369 if (p.object_->ptr() != object_->ptr()) {
370 delete((T*)(object_->rem()));
371 object_ = p.object_->add();
377 return *(T*)(object_->ptr());
381 return (T*)(object_->ptr());
384 operator bool(
void)
const {
385 return ((object_->ptr()) != NULL);
389 return ((object_->ptr()) == NULL);
393 return ((T*)(object_->ptr()) == (T*)(p.object_->ptr()));
397 return ((T*)(object_->ptr()) != (T*)(p.object_->ptr()));
401 return ((T*)(object_->ptr()) < (T*)(p.object_->ptr()));
405 return (T*)(object_->ptr());
411 T* tmp = (T*)(object_->ptr());
417 return object_->cnt();
426 if(r <= minThr)
break;
427 if(r >= maxThr)
break;
436 unsigned int WaitOutRange(
unsigned int minThr,
unsigned int maxThr,
int timeout) {
441 etime.assign_current_time();
442 etime.add_milliseconds(timeout);
445 if(r <= minThr)
break;
446 if(r >= maxThr)
break;
447 if(!object_->wait(etime))
break;
454 unsigned int WaitInRange(
unsigned int minThr,
unsigned int maxThr) {
459 if((r >= minThr) && (r <= maxThr))
break;
468 unsigned int WaitInRange(
unsigned int minThr,
unsigned int maxThr,
int timeout) {
469 if(timeout < 0)
return WaitInRange(minThr, maxThr);
473 etime.assign_current_time();
474 etime.add_milliseconds(timeout);
477 if((r >= minThr) && (r <= maxThr))
break;
478 if(!object_->wait(etime))
break;
522 void GlibThreadInitialize(
void);
530 GlibThreadInitialize();
548 static ThreadInitializer _local_thread_initializer;