#if !defined(VOCAL_THREAD_HXX)
#define VOCAL_THREAD_HXX

/* ====================================================================
 * The Vovida Software License, Version 1.0 
 * 
 * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 
 * 3. The names "VOCAL", "Vovida Open Communication Application Library",
 *    and "Vovida Open Communication Application Library (VOCAL)" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact vocal@vovida.org.
 *
 * 4. Products derived from this software may not be called "VOCAL", nor
 *    may "VOCAL" appear in their name, without prior written
 *    permission of Vovida Networks, Inc.
 * 
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
 * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
 * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
 * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 * 
 * ====================================================================
 * 
 * This software consists of voluntary contributions made by Vovida
 * Networks, Inc. and many individuals on behalf of Vovida Networks,
 * Inc.  For more information on Vovida Networks, Inc., please see
 * <http://www.vovida.org/>.
 *
 */


static const char* const Thread_hxx_Version = 
    "$Id: Thread.hxx,v 1.4 2001/06/29 03:41:33 bko Exp $";


#include "Writer.hxx"
#include "VocalCommon.hxx"
#include "VThread.hxx"
#include "Mutex.hxx"
#include <map>


/** Infrastructure common to VOCAL.
 */
namespace Vocal 
{


// Forward declarations
//
class Runnable;

namespace Signals
{
    class SignalHandler;
}

/** Infrastructure common to VOCAL to create and manage processes.
 */
namespace Threads
{


using Vocal::Signals::SignalHandler;


/** Executes a Runnable in it's own thread of execution.<br><br>
 *
 *  Each thread creates a SignalHandler.
 *
 *  @see    Vocal::Runnable
 *  @see    Vocal::Signals::SignalHandler
 *  @see    Vocal::ReturnCode
 */
class Thread : public Vocal::IO::Writer
{
    public:
    
    	/** Globally initialize the Thread facility. This should be done
	 *  in Application::init on the context of the initial thread. 
	 *  When called, the current thread is added to the ThreadMap so 
	 *  that self() will work in the initial thread.
	 */
    	static	void	    	    init();


    	/** Globally uninitialize the Thread facility. This should be done
	 *  in Application::uninit.
	 */
	static	void	    	    uninit();


    	/** Returns the Thread class associated with the calling thread.
	 */
    	static	Thread *    	    self();


    	/** Globally initialize the Thread facility. This should be done
	 *  in Application::init
	 */
    	static	vthread_t   	    selfId();
	

    	/** Start a new thread. The thread starts running during construction.
	 */
    	Thread(Runnable &, const char * name = 0);
				    

	/** Delete Thread object. This does not stop the thread from executing.
	 */
    	~Thread();


    	/** Join the thread. Must be called from outside the thread of
	 *  execution. Returns the result of the Runnable's run() method.
	 */
	ReturnCode  	    	    join();
	

	/** Exit the thread. Must be called from within the thread
	 *  of execution.
	 */
	void	    	    	    exit();
	

	/** Return the runnable associated with this thread. If called in the
	 *  initializing thread, the Application is returned.
	 */
	Runnable &  	    	    runnable();
	

	/** Return the signalHandler associated with this thread.
	 */
	SignalHandler &     	    signalHandler();
	

    	/** Write thread information to stream. See Writer.
	 */
	ostream &           	    writeTo(ostream &) const;
	

        static void *   threadMain(void *);		
	
    private:

    	/** Default constructor for main (Application's) thread. Called
	 *  from init().
	 */
    	Thread();


	typedef map<vthread_t, Thread *>	    ThreadMap;
	
    	static	ThreadMap   			*   myThreadMap;
    	static	Mutex	    	    	    	    myThreadMapMutex;
	static	Thread      	    	     	*   myMainThread;
	
	    	VThread     	    	    	*   myThread;
		Runnable    	    	    	&   myRunnable;
		SignalHandler	    	    	*   mySignalHandler;
		string	    	    	    	    myName;
};


} // namespace Process
} // namespace Vocal


#include "DeprecatedThread.hxx"


#endif // !defined(VOCAL_THREAD_HXX)


syntax highlighted by Code2HTML, v. 0.9.1