X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fthreads%2Fthreadlist.hpp;h=4ca60a85dea0f13c5780d854c2ec4a3e29ec1e3f;hb=dd9e483108a6445825b7b0ec93bd58b6f3639983;hp=fdcdd6e5ffbb3019463e74e25d1f4981beda2bcc;hpb=6661612c5b436511fdc0caf372587fa6a6225782;p=cacao.git diff --git a/src/threads/threadlist.hpp b/src/threads/threadlist.hpp index fdcdd6e5f..4ca60a85d 100644 --- a/src/threads/threadlist.hpp +++ b/src/threads/threadlist.hpp @@ -1,6 +1,6 @@ /* src/threads/threadlist.hpp - different thread-lists - Copyright (C) 2008, 2009 + Copyright (C) 1996-2011 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -74,8 +74,8 @@ private: public: static void lock() { _mutex.lock(); } static void unlock() { _mutex.unlock(); } + static void wait_cond(Condition *cond) { cond->wait(_mutex); } - // TODO make private static void add_to_active_thread_list(threadobject* t); // Thread management methods. @@ -84,7 +84,8 @@ public: static int32_t get_free_thread_index(); static threadobject* get_thread_by_index(int32_t index); static threadobject* get_thread_from_java_object(java_handle_t* h); - static void release_thread(threadobject* t); + static void release_thread(threadobject* t, bool needs_deactivate); + static void deactivate_thread(threadobject *t); // Thread listing methods. static void get_active_threads(List &list); @@ -113,7 +114,9 @@ struct ThreadListLocker { inline void ThreadList::add_to_active_thread_list(threadobject* t) { + lock(); _active_thread_list.push_back(t); + t->is_in_active_list = true; // Update counter variables. if ((t->flags & THREAD_FLAG_INTERNAL) == 0) { @@ -121,56 +124,81 @@ inline void ThreadList::add_to_active_thread_list(threadobject* t) _number_of_active_java_threads++; _peak_of_active_java_threads = MAX(_peak_of_active_java_threads, _number_of_active_java_threads); } + unlock(); } inline void ThreadList::remove_from_active_thread_list(threadobject* t) { + lock(); _active_thread_list.remove(t); + t->is_in_active_list = false; // Update counter variables. if ((t->flags & THREAD_FLAG_INTERNAL) == 0) { _number_of_active_java_threads--; } + unlock(); } inline void ThreadList::add_to_free_thread_list(threadobject* t) { + lock(); _free_thread_list.push_back(t); + unlock(); } inline void ThreadList::add_to_free_index_list(int32_t index) { + lock(); _free_index_list.push_back(index); + unlock(); } inline threadobject* ThreadList::get_main_thread() { - return _active_thread_list.front(); + lock(); + threadobject *r = _active_thread_list.front(); + unlock(); + return r; } inline int32_t ThreadList::get_number_of_active_threads() { - return _active_thread_list.size(); + lock(); + int32_t size = _active_thread_list.size(); + unlock(); + return size; } inline int32_t ThreadList::get_number_of_started_java_threads() { - return _number_of_started_java_threads; + lock(); + int32_t num = _number_of_started_java_threads; + unlock(); + return num; } inline int32_t ThreadList::get_number_of_active_java_threads() { - return _number_of_active_java_threads; + lock(); + int32_t num = _number_of_active_java_threads; + unlock(); + return num; } inline int32_t ThreadList::get_peak_of_active_java_threads() { - return _peak_of_active_java_threads; + lock(); + int32_t num = _peak_of_active_java_threads; + unlock(); + return num; } inline void ThreadList::reset_peak_of_active_java_threads() { + lock(); _peak_of_active_java_threads = _number_of_active_java_threads; + unlock(); } #else @@ -180,7 +208,6 @@ typedef struct ThreadList ThreadList; void ThreadList_lock(); void ThreadList_unlock(); void ThreadList_dump_threads(); -void ThreadList_release_thread(threadobject* t); threadobject* ThreadList_get_free_thread(); int32_t ThreadList_get_free_thread_index(); void ThreadList_add_to_active_thread_list(threadobject* t);