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);
45 std::map<unsigned long int, unsigned long int> thread_ids;
46 unsigned long int thread_no;
49 static ThreadId& getInstance();
55 unsigned long int get();
67 friend class ThreadData;
86 void Attach(std::string& key);
90 void Attach(
const std::string& key);
99 virtual void Dup(
void);
110 unsigned int waiting_;
113 : flag_(0), waiting_(0) {}
143 flag_ = waiting_?waiting_:1;
151 while (!flag_) cond_.wait(lock_);
160 while (!flag_) cond_.wait(lock_);
169 etime.assign_current_time();
170 etime.add_milliseconds(t);
174 res = cond_.timed_wait(lock_, etime);
210 virtual int inc(
void);
213 virtual int dec(
void);
215 virtual int get(void)
const;
218 virtual int set(
int v);
220 virtual void wait(
void)
const;
224 virtual bool wait(
int t)
const;
252 etime.assign_current_time();
253 etime.add_milliseconds(t);
255 if(!cond_.timed_wait(lock_, etime))
break;
292 unsigned int exclusive_;
293 Glib::Thread* thread_;
294 typedef std::map<Glib::Thread*,unsigned int> shared_list;
296 void add_shared_lock(
void);
297 void remove_shared_lock(
void);
298 bool have_shared_lock(
void);
299 inline bool have_exclusive_lock(
void) {
300 if(!exclusive_)
return false;
301 if(thread_ == Glib::Thread::self())
return false;
313 return (shared_.size() > 0);
321 return (exclusive_ > 0);
335 class ThreadedPointerBase {
342 ThreadedPointerBase(ThreadedPointerBase&);
343 ~ThreadedPointerBase(
void);
345 ThreadedPointerBase(
void *p);
346 ThreadedPointerBase* add(
void);
348 void* ptr(
void)
const {
return ptr_; };
349 void rel(
void) { released_ =
true; };
350 unsigned int cnt(
void)
const {
return cnt_; };
351 void lock(
void) { lock_.lock(); };
352 void unlock(
void) { lock_.unlock(); };
353 void wait(
void) { cond_.wait(lock_); };
354 bool wait(Glib::TimeVal etime) {
355 return cond_.timed_wait(lock_,etime);
369 ThreadedPointerBase *object_;
372 : object_(
new ThreadedPointerBase(p)) {}
374 : object_(p.object_->add()) {}
376 : object_(
new ThreadedPointerBase(NULL)) {}
378 delete((T*)(object_->rem()));
382 if (p != object_->ptr()) {
383 delete((T*)(object_->rem()));
384 object_ =
new ThreadedPointerBase(p);
390 if (p.object_->ptr() != object_->ptr()) {
391 delete((T*)(object_->rem()));
392 object_ = p.object_->add();
398 return *(T*)(object_->ptr());
402 return (T*)(object_->ptr());
405 operator bool(
void)
const {
406 return ((object_->ptr()) != NULL);
410 return ((object_->ptr()) == NULL);
414 return ((T*)(object_->ptr()) == (T*)(p.object_->ptr()));
418 return ((T*)(object_->ptr()) != (T*)(p.object_->ptr()));
422 return ((T*)(object_->ptr()) < (T*)(p.object_->ptr()));
426 return (T*)(object_->ptr());
432 T* tmp = (T*)(object_->ptr());
438 return object_->cnt();
447 if(r <= minThr)
break;
448 if(r >= maxThr)
break;
457 unsigned int WaitOutRange(
unsigned int minThr,
unsigned int maxThr,
int timeout) {
462 etime.assign_current_time();
463 etime.add_milliseconds(timeout);
466 if(r <= minThr)
break;
467 if(r >= maxThr)
break;
468 if(!object_->wait(etime))
break;
475 unsigned int WaitInRange(
unsigned int minThr,
unsigned int maxThr) {
480 if((r >= minThr) && (r <= maxThr))
break;
489 unsigned int WaitInRange(
unsigned int minThr,
unsigned int maxThr,
int timeout) {
490 if(timeout < 0)
return WaitInRange(minThr, maxThr);
494 etime.assign_current_time();
495 etime.add_milliseconds(timeout);
498 if((r >= minThr) && (r <= maxThr))
break;
499 if(!object_->wait(etime))
break;
543 void GlibThreadInitialize(
void);
551 GlibThreadInitialize();
569 static ThreadInitializer _local_thread_initializer;