diff --git a/panda/src/pipeline/Sources.pp b/panda/src/pipeline/Sources.pp index a1648db096..2ce9eaef55 100644 --- a/panda/src/pipeline/Sources.pp +++ b/panda/src/pipeline/Sources.pp @@ -20,7 +20,6 @@ conditionVarFullDirect.h conditionVarFullDirect.I \ conditionVarFullWin32Impl.h conditionVarFullWin32Impl.I \ conditionVarImpl.h \ - conditionVarNsprImpl.h conditionVarNsprImpl.I \ conditionVarPosixImpl.h conditionVarPosixImpl.I \ conditionVarWin32Impl.h conditionVarWin32Impl.I \ conditionVarSpinlockImpl.h conditionVarSpinlockImpl.I \ @@ -51,7 +50,6 @@ reMutexDirect.h reMutexDirect.I \ reMutexHolder.I reMutexHolder.h \ threadDummyImpl.h threadDummyImpl.I thread.h thread.I threadImpl.h \ - threadNsprImpl.h threadNsprImpl.I \ threadPosixImpl.h threadPosixImpl.I \ threadWin32Impl.h threadWin32Impl.I \ threadPriority.h @@ -65,7 +63,6 @@ conditionVarFullDebug.cxx \ conditionVarFullDirect.cxx \ conditionVarFullWin32Impl.cxx \ - conditionVarNsprImpl.cxx \ conditionVarPosixImpl.cxx \ conditionVarWin32Impl.cxx \ conditionVarSpinlockImpl.cxx \ @@ -94,7 +91,6 @@ reMutexDirect.cxx \ reMutexHolder.cxx \ thread.cxx threadDummyImpl.cxx \ - threadNsprImpl.cxx \ threadPosixImpl.cxx \ threadWin32Impl.cxx @@ -108,7 +104,6 @@ conditionVarFullDirect.h conditionVarFullDirect.I \ conditionVarFullWin32Impl.h conditionVarFullWin32Impl.I \ conditionVarImpl.h \ - conditionVarNsprImpl.h conditionVarNsprImpl.I \ conditionVarPosixImpl.h conditionVarPosixImpl.I \ conditionVarWin32Impl.h conditionVarWin32Impl.I \ conditionVarSpinlockImpl.h conditionVarSpinlockImpl.I \ @@ -139,7 +134,6 @@ reMutexDirect.h reMutexDirect.I \ reMutexHolder.I reMutexHolder.h \ threadDummyImpl.h threadDummyImpl.I thread.h thread.I threadImpl.h \ - threadNsprImpl.h threadNsprImpl.I \ threadPosixImpl.h threadPosixImpl.I \ threadWin32Impl.h threadWin32Impl.I \ threadPriority.h diff --git a/panda/src/pipeline/conditionVarImpl.h b/panda/src/pipeline/conditionVarImpl.h index 97f068b50f..618be73fda 100644 --- a/panda/src/pipeline/conditionVarImpl.h +++ b/panda/src/pipeline/conditionVarImpl.h @@ -47,12 +47,6 @@ typedef ConditionVarFullWin32Impl ConditionVarFullImpl; typedef ConditionVarPosixImpl ConditionVarImpl; typedef ConditionVarPosixImpl ConditionVarFullImpl; -#elif defined(THREAD_NSPR_IMPL) - -#include "conditionVarNsprImpl.h" -typedef ConditionVarNsprImpl ConditionVarImpl; -typedef ConditionVarNsprImpl ConditionVarFullImpl; - #endif #endif diff --git a/panda/src/pipeline/conditionVarNsprImpl.I b/panda/src/pipeline/conditionVarNsprImpl.I deleted file mode 100644 index 01ec07c9c4..0000000000 --- a/panda/src/pipeline/conditionVarNsprImpl.I +++ /dev/null @@ -1,72 +0,0 @@ -// Filename: conditionVarNsprImpl.I -// Created by: drose (09Aug02) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////// -// Function: ConditionVarNsprImpl::Constructor -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE ConditionVarNsprImpl:: -ConditionVarNsprImpl(MutexNsprImpl &mutex) { - _cvar = PR_NewCondVar(mutex._lock); - nassertv(_cvar != (PRCondVar *)NULL); -} - -//////////////////////////////////////////////////////////////////// -// Function: ConditionVarNsprImpl::Destructor -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE ConditionVarNsprImpl:: -~ConditionVarNsprImpl() { - PR_DestroyCondVar(_cvar); -} - -//////////////////////////////////////////////////////////////////// -// Function: ConditionVarNsprImpl::wait -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE void ConditionVarNsprImpl:: -wait() { - int status = PR_WaitCondVar(_cvar, PR_INTERVAL_NO_TIMEOUT); - nassertv(status == PR_SUCCESS); -} - -//////////////////////////////////////////////////////////////////// -// Function: ConditionVarNsprImpl::signal -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE void ConditionVarNsprImpl:: -signal() { - int status = PR_NotifyCondVar(_cvar); - nassertv(status == PR_SUCCESS); -} - -//////////////////////////////////////////////////////////////////// -// Function: ConditionVarNsprImpl::signal_all -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE void ConditionVarNsprImpl:: -signal_all() { - int status = PR_NotifyAllCondVar(_cvar); - nassertv(status == PR_SUCCESS); -} diff --git a/panda/src/pipeline/conditionVarNsprImpl.cxx b/panda/src/pipeline/conditionVarNsprImpl.cxx deleted file mode 100644 index 302144653f..0000000000 --- a/panda/src/pipeline/conditionVarNsprImpl.cxx +++ /dev/null @@ -1,25 +0,0 @@ -// Filename: conditionVarNsprImpl.cxx -// Created by: drose (09Aug02) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// - -#include "selectThreadImpl.h" - -#ifdef HAVE_NSPR - -#include "conditionVarNsprImpl.h" - -#endif // HAVE_NSPR diff --git a/panda/src/pipeline/conditionVarNsprImpl.h b/panda/src/pipeline/conditionVarNsprImpl.h deleted file mode 100644 index 289ead6c79..0000000000 --- a/panda/src/pipeline/conditionVarNsprImpl.h +++ /dev/null @@ -1,55 +0,0 @@ -// Filename: conditionVarNsprImpl.h -// Created by: drose (09Aug02) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// - -#ifndef CONDITIONVARNSPRIMPL_H -#define CONDITIONVARNSPRIMPL_H - -#include "pandabase.h" -#include "selectThreadImpl.h" - -#ifdef HAVE_NSPR - -#include "mutexNsprImpl.h" -#include "pnotify.h" - -#include - -class MutexNsprImpl; - -//////////////////////////////////////////////////////////////////// -// Class : ConditionVarNsprImpl -// Description : Uses NSPR to implement a conditionVar. -//////////////////////////////////////////////////////////////////// -class EXPCL_PANDA ConditionVarNsprImpl { -public: - INLINE ConditionVarNsprImpl(MutexNsprImpl &mutex); - INLINE ~ConditionVarNsprImpl(); - - INLINE void wait(); - INLINE void signal(); - INLINE void signal_all(); - -private: - PRCondVar *_cvar; -}; - -#include "conditionVarNsprImpl.I" - -#endif // HAVE_NSPR - -#endif diff --git a/panda/src/pipeline/pipeline_composite1.cxx b/panda/src/pipeline/pipeline_composite1.cxx index c9f7cc963b..e0e3e353b6 100644 --- a/panda/src/pipeline/pipeline_composite1.cxx +++ b/panda/src/pipeline/pipeline_composite1.cxx @@ -5,7 +5,6 @@ #include "conditionVarFull.cxx" #include "conditionVarFullDebug.cxx" #include "conditionVarFullDirect.cxx" -#include "conditionVarNsprImpl.cxx" #include "conditionVarPosixImpl.cxx" #include "conditionVarWin32Impl.cxx" #include "conditionVarSpinlockImpl.cxx" diff --git a/panda/src/pipeline/pipeline_composite2.cxx b/panda/src/pipeline/pipeline_composite2.cxx index 5fbb351570..8833e6fa6d 100644 --- a/panda/src/pipeline/pipeline_composite2.cxx +++ b/panda/src/pipeline/pipeline_composite2.cxx @@ -15,6 +15,5 @@ #include "reMutexHolder.cxx" #include "thread.cxx" #include "threadDummyImpl.cxx" -#include "threadNsprImpl.cxx" #include "threadPosixImpl.cxx" #include "threadWin32Impl.cxx" diff --git a/panda/src/pipeline/pythonThread.h b/panda/src/pipeline/pythonThread.h index ca36de52fc..752446b93a 100644 --- a/panda/src/pipeline/pythonThread.h +++ b/panda/src/pipeline/pythonThread.h @@ -25,7 +25,6 @@ #ifdef HAVE_PYTHON -#undef HAVE_LONG_LONG // NSPR and Python both define this. #undef _POSIX_C_SOURCE #include diff --git a/panda/src/pipeline/thread.h b/panda/src/pipeline/thread.h index 5aa0bcbf47..ddcca540a5 100644 --- a/panda/src/pipeline/thread.h +++ b/panda/src/pipeline/thread.h @@ -132,7 +132,6 @@ private: friend class ThreadDummyImpl; friend class ThreadWin32Impl; friend class ThreadPosixImpl; - friend class ThreadNsprImpl; }; INLINE ostream &operator << (ostream &out, const Thread &thread); diff --git a/panda/src/pipeline/threadImpl.h b/panda/src/pipeline/threadImpl.h index 45925fb9b4..7df0565e4a 100644 --- a/panda/src/pipeline/threadImpl.h +++ b/panda/src/pipeline/threadImpl.h @@ -37,11 +37,6 @@ typedef ThreadWin32Impl ThreadImpl; #include "threadPosixImpl.h" typedef ThreadPosixImpl ThreadImpl; -#elif defined(THREAD_NSPR_IMPL) - -#include "threadNsprImpl.h" -typedef ThreadNsprImpl ThreadImpl; - #endif #endif diff --git a/panda/src/pipeline/threadNsprImpl.I b/panda/src/pipeline/threadNsprImpl.I deleted file mode 100644 index 8c131021e9..0000000000 --- a/panda/src/pipeline/threadNsprImpl.I +++ /dev/null @@ -1,90 +0,0 @@ -// Filename: threadNsprImpl.I -// Created by: drose (08Aug02) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::Constructor -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE ThreadNsprImpl:: -ThreadNsprImpl(Thread *parent_obj) : - _parent_obj(parent_obj) -{ - _thread = (PRThread *)NULL; - _joinable = false; -} - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::prepare_for_exit -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE void ThreadNsprImpl:: -prepare_for_exit() { - PR_Cleanup(); -} - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::get_current_thread -// Access: Public, Static -// Description: -//////////////////////////////////////////////////////////////////// -INLINE Thread *ThreadNsprImpl:: -get_current_thread() { - if (!_got_pt_ptr_index) { - init_pt_ptr_index(); - } - return (Thread *)PR_GetThreadPrivate(_pt_ptr_index); -} - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::bind_thread -// Access: Public, Static -// Description: Associates the indicated Thread object with the -// currently-executing thread. You should not call this -// directly; use Thread::bind_thread() instead. -//////////////////////////////////////////////////////////////////// -INLINE void ThreadNsprImpl:: -bind_thread(Thread *thread) { - if (!_got_pt_ptr_index) { - init_pt_ptr_index(); - } - PRStatus result = PR_SetThreadPrivate(_pt_ptr_index, thread); - nassertv(result == PR_SUCCESS); -} - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::is_threading_supported -// Access: Public, Static -// Description: -//////////////////////////////////////////////////////////////////// -INLINE bool ThreadNsprImpl:: -is_threading_supported() { - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::sleep -// Access: Public, Static -// Description: -//////////////////////////////////////////////////////////////////// -INLINE void ThreadNsprImpl:: -sleep(double seconds) { - PR_Sleep((int)(PR_TicksPerSecond() * seconds)); -} diff --git a/panda/src/pipeline/threadNsprImpl.cxx b/panda/src/pipeline/threadNsprImpl.cxx deleted file mode 100644 index 96adeb41f6..0000000000 --- a/panda/src/pipeline/threadNsprImpl.cxx +++ /dev/null @@ -1,234 +0,0 @@ -// Filename: threadNsprImpl.cxx -// Created by: drose (08Aug02) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// - -#include "threadNsprImpl.h" -#include "selectThreadImpl.h" - -#ifdef THREAD_NSPR_IMPL - -#include "pointerTo.h" -#include "config_pipeline.h" - -PRUintn ThreadNsprImpl::_pt_ptr_index = 0; -bool ThreadNsprImpl::_got_pt_ptr_index = false; - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::Destructor -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -ThreadNsprImpl:: -~ThreadNsprImpl() { - if (thread_cat.is_debug()) { - thread_cat.debug() << "Deleting thread " << _parent_obj->get_name() << "\n"; - } - - // If the thread object is destructing, it means the last pointer - // has gone away. This can happen in one of three cases: - - // (1) start() was never called, and the last user reference has - // gone away. In this case, we should do nothing. - - // (2) There are no more user references, and the thread is still - // running but is about to exit root_func(). In this case, no one - // will ever call join(). - - // (3) The thread terminated a while ago, and the last user - // reference has just gone away. In this case, we should call - // join() if no one else has, to clean up whatever internal - // structures NSPR might keep around for a non-detached thread. - - - if (_thread == (PRThread *)NULL) { - // Since the _thread pointer is still NULL, we must either be in - // case (1), or case (3) but someone else has already called - // join(). Do nothing. - return; - } - - PRThread *current_thread = PR_GetCurrentThread(); - if (current_thread == _thread) { - // Since we are currently executing *this* thread, we must be in - // case (2). Unfortunately, we cannot now indicate we need to - // clean up the thread, since NSPR doesn't have an interface to - // make a thread unjoinable after it has been created, and a - // thread can't join itself (can it?). - if (_joinable) { - thread_cat.warning() - << "thread " << _parent_obj->get_name() << " was never joined.\n"; - } - return; - } - - // This is case (3). The pointer went away and the thread has - // already terminated; furthermore, no one has called join() yet. - // We should do it. - join(); -} - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::start -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -bool ThreadNsprImpl:: -start(ThreadPriority priority, bool global, bool joinable) { - _mutex.lock(); - if (thread_cat.is_debug()) { - thread_cat.debug() << "Starting " << *_parent_obj << "\n"; - } - nassertd(_thread == (PRThread *)NULL) { - _mutex.release(); - return false; - } - - _joinable = joinable; - - if (!_got_pt_ptr_index) { - init_pt_ptr_index(); - } - - PRThreadPriority nspr_pri; - - switch (priority) { - case TP_low: - nspr_pri = PR_PRIORITY_LOW; - break; - - case TP_high: - nspr_pri = PR_PRIORITY_HIGH; - break; - - case TP_urgent: - nspr_pri = PR_PRIORITY_URGENT; - break; - - case TP_normal: - default: - nspr_pri = PR_PRIORITY_NORMAL; - } - - PRThreadScope nspr_scope = (global) ? PR_GLOBAL_THREAD : PR_LOCAL_THREAD; - - PRThreadState nspr_state = (_joinable) ? PR_JOINABLE_THREAD : PR_UNJOINABLE_THREAD; - - // Increment the parent object's reference count first. The thread - // will eventually decrement it when it terminates. - _parent_obj->ref(); - _thread = - PR_CreateThread(PR_USER_THREAD, &root_func, (void *)_parent_obj, - nspr_pri, nspr_scope, nspr_state, 0); - - if (_thread == (PRThread *)NULL) { - // Oops, we couldn't start the thread. Be sure to decrement the - // reference count we incremented above, and return false to - // indicate failure. - unref_delete(_parent_obj); - _mutex.release(); - return false; - } - - // Thread was successfully started. - _mutex.release(); - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::interrupt -// Access: Public -// Description: Sends an interrupt message to the thread. This will -// interrupt any blocking-type system calls the thread -// may be waiting on, such as I/O, so that the thread -// may continue some other processing. The specific -// behavior is implementation dependent. -//////////////////////////////////////////////////////////////////// -void ThreadNsprImpl:: -interrupt() { - if (_thread != (PRThread *)NULL) { - PR_Interrupt(_thread); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::join -// Access: Public -// Description: Blocks the calling process until the thread -// terminates. If the thread has already terminated, -// this returns immediately. -//////////////////////////////////////////////////////////////////// -void ThreadNsprImpl:: -join() { - _mutex.lock(); - if (_joinable && _thread != (PRThread *)NULL) { - PR_JoinThread(_thread); - _thread = (PRThread *)NULL; - } - _mutex.release(); -} - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::root_func -// Access: Private, Static -// Description: The entry point of each thread. -//////////////////////////////////////////////////////////////////// -void ThreadNsprImpl:: -root_func(void *data) { - Thread *parent_obj = (Thread *)data; - PRStatus result = PR_SetThreadPrivate(_pt_ptr_index, parent_obj); - nassertv(result == PR_SUCCESS); - parent_obj->thread_main(); - - if (thread_cat.is_debug()) { - thread_cat.debug() - << "Terminating thread " << parent_obj->get_name() - << ", count = " << parent_obj->get_ref_count() << "\n"; - } - - // Now drop the parent object reference that we grabbed in start(). - // This might delete the parent object, and in turn, delete the - // ThreadNsprImpl object. - unref_delete(parent_obj); -} - -//////////////////////////////////////////////////////////////////// -// Function: ThreadNsprImpl::init_pt_ptr_index -// Access: Private, Static -// Description: Allocate a new index to store the Thread parent -// pointer as a piece of per-thread private data. -//////////////////////////////////////////////////////////////////// -void ThreadNsprImpl:: -init_pt_ptr_index() { - nassertv(!_got_pt_ptr_index); - - PRStatus result = PR_NewThreadPrivateIndex(&_pt_ptr_index, NULL); - if (result != PR_SUCCESS) { - thread_cat.error() - << "Unable to associate Thread pointers with threads.\n"; - return; - } - - _got_pt_ptr_index = true; - - // Assume that we must be in the main thread, since this method must - // be called before the first thread is spawned. - Thread *main_thread_obj = Thread::get_main_thread(); - result = PR_SetThreadPrivate(_pt_ptr_index, main_thread_obj); - nassertv(result == PR_SUCCESS); -} - -#endif // THREAD_NSPR_IMPL diff --git a/panda/src/pipeline/threadNsprImpl.h b/panda/src/pipeline/threadNsprImpl.h deleted file mode 100644 index bd353d0e6d..0000000000 --- a/panda/src/pipeline/threadNsprImpl.h +++ /dev/null @@ -1,72 +0,0 @@ -// Filename: threadNsprImpl.h -// Created by: drose (08Aug02) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// - -#ifndef THREADNSPRIMPL_H -#define THREADNSPRIMPL_H - -#include "pandabase.h" -#include "selectThreadImpl.h" - -#ifdef THREAD_NSPR_IMPL - -#include "pnotify.h" -#include "threadPriority.h" -#include "mutexNsprImpl.h" - -#include -#include - -class Thread; - -//////////////////////////////////////////////////////////////////// -// Class : ThreadNsprImpl -// Description : Uses NSPR to implement a thread. -//////////////////////////////////////////////////////////////////// -class EXPCL_PANDA ThreadNsprImpl { -public: - INLINE ThreadNsprImpl(Thread *parent_obj); - ~ThreadNsprImpl(); - - bool start(ThreadPriority priority, bool global, bool joinable); - void interrupt(); - void join(); - - INLINE static void prepare_for_exit(); - - INLINE static Thread *get_current_thread(); - INLINE static void bind_thread(Thread *thread); - INLINE static bool is_threading_supported(); - INLINE static void sleep(double seconds); - -private: - static void root_func(void *data); - static void init_pt_ptr_index(); - - MutexNsprImpl _mutex; - Thread *_parent_obj; - PRThread *_thread; - bool _joinable; - static PRUintn _pt_ptr_index; - static bool _got_pt_ptr_index; -}; - -#include "threadNsprImpl.I" - -#endif // THREAD_NSPR_IMPL - -#endif