Author: tabish
Date: Thu Sep 3 23:54:57 2009
New Revision: 811174
URL: http://svn.apache.org/viewvc?rev=811174&view=rev
Log:
More Thread Refactorings and cleanups, added skeleton ThreadGroup class.
Added:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.cpp
(with props)
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.h
(with props)
Modified:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.cpp
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.h
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am
URL:
http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am?rev=811174&r1=811173&r2=811174&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am Thu Sep 3
23:54:57 2009
@@ -1113,6 +1113,7 @@
decaf/io/OutputStream.h \
decaf/io/Reader.h \
decaf/io/UTFDataFormatException.h \
+ decaf/io/UnsupportedEncodingException.h \
decaf/io/Writer.h \
decaf/lang/Appendable.h \
decaf/lang/Boolean.h \
Modified:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.cpp
URL:
http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.cpp?rev=811174&r1=811173&r2=811174&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.cpp
(original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.cpp Thu
Sep 3 23:54:57 2009
@@ -27,6 +27,8 @@
#include <apr_thread_proc.h>
#include <decaf/internal/DecafRuntime.h>
+#include <decaf/lang/Integer.h>
+#include <decaf/lang/Long.h>
#include <decaf/lang/Exception.h>
#include <decaf/lang/exceptions/RuntimeException.h>
#include <decaf/lang/exceptions/NullPointerException.h>
@@ -65,13 +67,33 @@
*/
bool joined;
- public:
+ /**
+ * The Assigned name of this thread.
+ */
+ std::string name;
- ThreadProperties() : task( NULL ), threadHandle( NULL ), started(
false ), joined( false ) {
- }
+ /**
+ * The currently assigned priority
+ */
+ int priority;
- ThreadProperties( Runnable* task ) : task( task ), threadHandle( NULL
), started( false ), joined( false ) {
- }
+ /**
+ * static value that holds the incrementing Thread ID for unnamed
threads.
+ */
+ static unsigned int id;
+
+ /**
+ * The handler to invoke if the thread terminates due to an exception
that
+ * was not caught in the user's run method.
+ */
+ Thread::UncaughtExceptionHandler* exHandler;
+
+ /**
+ * The Thread that created this Object.
+ */
+ Thread* parent;
+
+ public:
static void* APR_THREAD_FUNC runCallback( apr_thread_t* self, void*
param ) {
@@ -81,11 +103,24 @@
// Invoke run on the task.
try{
properties->task->run();
- } catch( ... ){
- RuntimeException ex(
+ } catch( decaf::lang::Throwable& error ){
+
+ if( properties->exHandler != NULL ) {
+ properties->exHandler->uncaughtException(
properties->parent, error );
+ }
+
+ error.printStackTrace();
+
+ } catch( ... ) {
+ RuntimeException error(
__FILE__, __LINE__,
"unhandled exception bubbled up to Thread::run");
- ex.printStackTrace();
+
+ if( properties->exHandler != NULL ) {
+ properties->exHandler->uncaughtException(
properties->parent, error );
+ }
+
+ error.printStackTrace();
}
// Indicate we are done.
@@ -98,27 +133,46 @@
}}
////////////////////////////////////////////////////////////////////////////////
-Thread::Thread() {
+unsigned int ThreadProperties::id = 0;
- this->initialize( this );
+////////////////////////////////////////////////////////////////////////////////
+Thread::Thread() {
+ this->initialize( this, "" );
}
////////////////////////////////////////////////////////////////////////////////
Thread::Thread( Runnable* task ) {
+ this->initialize( task, "" );
+}
- if( task == NULL ) {
- throw NullPointerException(
- __FILE__, __LINE__,
- "Thread::Thread( Runnable* ) Runnable instance passed was NULL" );
- }
+////////////////////////////////////////////////////////////////////////////////
+Thread::Thread( const std::string& name ) {
+ this->initialize( this, name );
+}
- this->initialize( task );
+////////////////////////////////////////////////////////////////////////////////
+Thread::Thread( Runnable* task, const std::string& name ) {
+ this->initialize( task, name );
}
////////////////////////////////////////////////////////////////////////////////
-void Thread::initialize( Runnable* task ) {
+void Thread::initialize( Runnable* task, const std::string& name ) {
+
+ this->properties.reset( new ThreadProperties() );
+
+ if( name == "" ) {
+ this->properties->name = std::string( "Thread-" ) + Integer::toString(
++ThreadProperties::id );
+ } else {
+ this->properties->name = name;
+ }
- this->properties.reset( new ThreadProperties( task ) );
+ this->properties->joined = false;
+ this->properties->started = false;
+ this->properties->priority = Thread::NORM_PRIORITY;
+ this->properties->task = task;
+ this->properties->threadHandle = NULL;
+ this->properties->exHandler = NULL;
+ this->properties->parent = this;
}
////////////////////////////////////////////////////////////////////////////////
@@ -173,7 +227,18 @@
}
////////////////////////////////////////////////////////////////////////////////
-void Thread::sleep( int millisecs ) {
+void Thread::sleep( long long millisecs )
+ throw( lang::exceptions::InterruptedException,
+ lang::exceptions::IllegalArgumentException ) {
+
+ Thread::sleep( millisecs, 0 );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void Thread::sleep( long long millisecs, unsigned int nanos )
+ throw( lang::exceptions::InterruptedException,
+ lang::exceptions::IllegalArgumentException ) {
+
apr_sleep( (apr_interval_time_t)(millisecs * 1000) );
}
@@ -186,3 +251,50 @@
unsigned long Thread::getId() {
return (unsigned long)( apr_os_thread_current() );
}
+
+////////////////////////////////////////////////////////////////////////////////
+void Thread::setName( const std::string& name ) {
+ this->properties->name = name;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+std::string Thread::getName() const {
+ return this->properties->name;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void Thread::setPriority( int value ) throw(
decaf::lang::exceptions::IllegalArgumentException ) {
+
+ if( value < Thread::MIN_PRIORITY || value > Thread::MAX_PRIORITY ) {
+ throw IllegalArgumentException(
+ __FILE__, __LINE__,
+ "Thread::setPriority - Specified value {%d} is out of range",
value );
+ }
+
+ this->properties->priority = value;
+
+ // TODO - Alter Threads actual priority.
+}
+
+////////////////////////////////////////////////////////////////////////////////
+int Thread::getPriority() const {
+ return this->properties->priority;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void Thread::setUncaughtExceptionHandler( UncaughtExceptionHandler* handler ) {
+ this->properties->exHandler = handler;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+const Thread::UncaughtExceptionHandler* Thread::getUncaughtExceptionHandler()
const {
+ return this->properties->exHandler;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+std::string Thread::toString() const {
+
+ return this->properties->name + ": Priority=" +
+ Integer::toString( this->properties->priority ) + ", ThreadID=" +
+ Long::toString( Thread::getId() );
+}
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.h
URL:
http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.h?rev=811174&r1=811173&r2=811174&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.h
(original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.h Thu
Sep 3 23:54:57 2009
@@ -17,6 +17,8 @@
#ifndef _DECAF_LANG_THREAD_H_
#define _DECAF_LANG_THREAD_H_
+#include <decaf/lang/exceptions/IllegalArgumentException.h>
+#include <decaf/lang/exceptions/InterruptedException.h>
#include <decaf/lang/Exception.h>
#include <decaf/lang/Runnable.h>
#include <decaf/util/Config.h>
@@ -25,6 +27,7 @@
namespace decaf{
namespace lang{
+ class ThreadGroup;
class ThreadProperties;
/**
@@ -63,17 +66,77 @@
public:
+ /** The minimum priority that a thread can have. */
+ static const int MIN_PRIORITY = 1;
+
+ /** The default priority that a thread is given at create time. */
+ static const int NORM_PRIORITY = 5;
+
+ /** The maximum priority that a thread can have. */
+ static const int MAX_PRIORITY = 10;
+
+ public:
+
/**
- * default Constructor
+ * Interface for handlers invoked when a Thread abruptly terminates
due to an
+ * uncaught exception.
+ */
+ class UncaughtExceptionHandler {
+ public:
+
+ /**
+ * Method invoked when the given thread terminates due to the
given uncaught exception.
+ *
+ * This method is defined to indicate that it will not throw an
exception, throwing
+ * and exception from this method will on most systems result in a
segmentation fault.
+ */
+ virtual void uncaughtException( const Thread* thread, const
Throwable& error ) throw() = 0;
+
+ };
+
+ public:
+
+ /**
+ * Constructs a new Thread. This constructor has the same effect as
+ * Thread( NULL, NULL, GIVEN_NAME ), where GIVEN_NAME is a newly
generated name.
+ * When no name is given the name is automatically generated and are
of the form
+ * "Thread-"+n, where n is an integer.
*/
Thread();
/**
- * Constructor
- * @param task the Runnable that this thread manages
+ * Constructs a new Thread with the given target Runnable task. This
constructor
+ * has the same effect as Thread( NULL, task, GIVEN_NAME ), where
GIVEN_NAME is a
+ * newly generated name. When no name is given the name is
automatically generated
+ * and are of the form "Thread-"+n, where n is an integer.
+ *
+ * @param task the Runnable that this thread manages, if the task is
NULL the Thread's
+ * run method is used instead.
*/
Thread( Runnable* task );
+ /**
+ * Constructs a new Thread with the given name. This constructor has
the same effect
+ * as Thread( NULL, NULL, GIVEN_NAME ), where GIVEN_NAME is a newly
generated name.
+ * When no name is given the name is automatically generated and are
of the form
+ * "Thread-"+n, where n is an integer.
+ *
+ * @param name the name to assign to this Thread.
+ */
+ Thread( const std::string& name );
+
+ /**
+ * Constructs a new Thread with the given target Runnable task and
name. This constructor
+ * has the same effect as Thread( NULL, task, GIVEN_NAME ), where
GIVEN_NAME is a
+ * newly generated name. When no name is given the name is
automatically generated
+ * and are of the form "Thread-"+n, where n is an integer.
+ *
+ * @param task the Runnable that this thread manages, if the task is
NULL the Thread's
+ * run method is used instead.
+ * @param name the name to assign to this Thread.
+ */
+ Thread( Runnable* task, const std::string& name );
+
virtual ~Thread();
/**
@@ -97,16 +160,94 @@
*/
virtual void run(){};
+ /**
+ * Returns the Thread's assigned name.
+ * @returns the Name of the Thread.
+ */
+ std::string getName() const;
+
+ /**
+ * Sets the name of the Thread to the new Name given by the argument
<em>name</em>
+ *
+ * @paran name the new name of the Thread.
+ */
+ void setName( const std::string& name );
+
+ /**
+ * Gets the currently set priority for this Thread.
+ *
+ * @return an int value representing the Thread's current priority.
+ */
+ int getPriority() const;
+
+ /**
+ * Sets the current Thread's priority to the newly specified value.
The given value
+ * must be within the rane Thread::MIN_PRIORITY and
Thread::MAX_PRIORITY.
+ *
+ * @param value the new priority value to assign to this Thread.
+ *
+ * @throws IllegalArgumentException if the value is out of range.
+ */
+ void setPriority( int value ) throw(
decaf::lang::exceptions::IllegalArgumentException );
+
+ /**
+ * Set the handler invoked when this thread abruptly terminates due to
an uncaught exception.
+ *
+ * @returns a pointer to the set UncaughtExceptionHandler.
+ */
+ const UncaughtExceptionHandler* getUncaughtExceptionHandler() const;
+
+ /**
+ * Set the handler invoked when this thread abruptly terminates due to
an uncaught exception.
+ *
+ * @param handler the UncaightExceptionHandler to invoke when the
Thread terminates due
+ * to an uncaught exception.
+ */
+ void setUncaughtExceptionHandler( UncaughtExceptionHandler* handler );
+
+ /**
+ * Returns a string that describes the Thread.
+ *
+ * @return string describing the Thread.
+ */
+ std::string toString() const;
+
public:
/**
- * Halts execution of the calling thread for a specified no of
millisec.
+ * Causes the currently executing thread to halt execution for the
specified number of
+ * milliseconds, subject to the precision and accuracy of system
timers and schedulers.
+ *
+ * Note that this method is a static method that applies to the
+ * calling thread and not to the thread object.
+ *
+ * @param millisecs time in milliseconds to halt execution.
+ *
+ * @throws IllegalArgumentException if the milliseconds parameter is
negative.
+ * @throws InterruptedException if the Thread was interrupted while
sleeping.
+ */
+ static void sleep( long long millisecs )
+ throw( lang::exceptions::InterruptedException,
+ lang::exceptions::IllegalArgumentException );
+
+ /**
+ * Causes the currently executing thread to halt execution for the
specified number of
+ * milliseconds plus any additionally specified nanoseconds given,
subject to the precision
+ * and accuracy of system timers and schedulers.
*
* Note that this method is a static method that applies to the
* calling thread and not to the thread object.
- * @param millisecs time in milliseconds to sleep
+ *
+ * @param millisecs time in milliseconds to halt execution.
+ * @param nanos 0-999999 extra nanoseconds to sleep.
+ *
+ * @throws IllegalArgumentException if the nanoseconds parameter is
out of range
+ * or the milliseconds paramter is negative.
+ * @throws InterruptedException if the Thread was interrupted while
sleeping.
*/
- static void sleep( int millisecs );
+ static void sleep( long long millisecs, unsigned int nanos )
+ throw( lang::exceptions::InterruptedException,
+ lang::exceptions::IllegalArgumentException );
/**
* Causes the currently executing thread object to temporarily pause
@@ -123,7 +264,7 @@
private:
// Initialize the Threads internal state
- void initialize( Runnable* task );
+ void initialize( Runnable* task, const std::string& name );
};
Added:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.cpp
URL:
http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.cpp?rev=811174&view=auto
==============================================================================
---
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.cpp
(added)
+++
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.cpp
Thu Sep 3 23:54:57 2009
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ThreadGroup.h"
+
+using namespace decaf;
+using namespace decaf::lang;
+
+////////////////////////////////////////////////////////////////////////////////
+ThreadGroup::ThreadGroup() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+ThreadGroup::~ThreadGroup() {
+}
Propchange:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.h
URL:
http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.h?rev=811174&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.h
(added)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.h
Thu Sep 3 23:54:57 2009
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _DECAF_LANG_THREADGROUP_H_
+#define _DECAF_LANG_THREADGROUP_H_
+
+#include <decaf/util/Config.h>
+
+namespace decaf {
+namespace lang {
+
+ /**
+ *
+ * @since 1.0
+ */
+ class DECAF_API ThreadGroup {
+ public:
+
+ ThreadGroup();
+ virtual ~ThreadGroup();
+
+ };
+
+}}
+
+#endif /* _DECAF_LANG_THREADGROUP_H_ */
Propchange:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/ThreadGroup.h
------------------------------------------------------------------------------
svn:eol-style = native