summaryrefslogtreecommitdiff
path: root/examples/Threads
diff options
context:
space:
mode:
authorschmidt <douglascraigschmidt@users.noreply.github.com>1997-01-08 00:06:10 +0000
committerschmidt <douglascraigschmidt@users.noreply.github.com>1997-01-08 00:06:10 +0000
commitc74f8ce745a8d81101b4da0be11f448704d53c46 (patch)
tree31e6b83e17ad25bbe82cd48f27eeca036e5dbe73 /examples/Threads
parentf9c477469e3c82edbf12a7e1f2eca7422e7f0d1f (diff)
downloadATCD-c74f8ce745a8d81101b4da0be11f448704d53c46.tar.gz
foo
Diffstat (limited to 'examples/Threads')
-rw-r--r--examples/Threads/future1.cpp26
-rw-r--r--examples/Threads/future2.cpp32
-rw-r--r--examples/Threads/tss1.cpp51
-rw-r--r--examples/Threads/tss2.cpp196
4 files changed, 146 insertions, 159 deletions
diff --git a/examples/Threads/future1.cpp b/examples/Threads/future1.cpp
index a83e72eb97a..9f541f7f013 100644
--- a/examples/Threads/future1.cpp
+++ b/examples/Threads/future1.cpp
@@ -247,7 +247,7 @@ Scheduler::name_i (void)
{
char *the_name;
- the_name = new char[ACE_OS::strlen (this->name_) + 1];
+ ACE_NEW_RETURN (the_name, char[ACE_OS::strlen (this->name_) + 1], 0);
ACE_OS::strcpy (the_name, this->name_);
return the_name;
@@ -302,15 +302,15 @@ main (int, char *[])
// Create active objects..
// @@ Should "open" be subsumed within the constructor of
// Scheduler()?
- andres = new Scheduler ("andres");
+ ACE_NEW_RETURN (andres, Scheduler ("andres"), -1);
andres->open ();
- peter = new Scheduler ("peter");
+ ACE_NEW_RETURN (peter, Scheduler ("peter"), -1);
peter->open ();
- helmut = new Scheduler ("helmut");
+ ACE_NEW_RETURN (helmut, Scheduler ("helmut"), -1);
helmut->open ();
// Matias passes all asynchronous method calls on to Andres...
- matias = new Scheduler ("matias", andres);
+ ACE_NEW_RETURN (matias, Scheduler ("matias", andres), -1);
matias->open ();
for (int i = 0; i < n_loops; i++)
@@ -371,10 +371,10 @@ main (int, char *[])
ACE_DEBUG ((LM_DEBUG,
"(%t) task_count %d future_count %d capsule_count %d methodobject_count %d\n",
- (u_long) task_count,
- (u_long) future_count,
- (u_long) capsule_count,
- (u_long) methodobject_count));
+ (int) task_count,
+ (int) future_count,
+ (int) capsule_count,
+ (int) methodobject_count));
}
// Close things down.
@@ -387,10 +387,10 @@ main (int, char *[])
ACE_DEBUG ((LM_DEBUG,
"(%t) task_count %d future_count %d capsule_count %d methodobject_count %d\n",
- (u_long) task_count,
- (u_long) future_count,
- (u_long) capsule_count,
- (u_long) methodobject_count));
+ (int) task_count,
+ (int) future_count,
+ (int) capsule_count,
+ (int) methodobject_count));
ACE_DEBUG ((LM_DEBUG,"(%t) th' that's all folks!\n"));
diff --git a/examples/Threads/future2.cpp b/examples/Threads/future2.cpp
index de7e741108d..5e22721e97d 100644
--- a/examples/Threads/future2.cpp
+++ b/examples/Threads/future2.cpp
@@ -250,7 +250,7 @@ Scheduler::name_i (void)
{
char *the_name;
- the_name = new char[ACE_OS::strlen (this->name_) + 1];
+ ACE_NEW_RETURN (the_name, char[ACE_OS::strlen (this->name_) + 1], 0);
ACE_OS::strcpy (the_name, this->name_);
return the_name;
@@ -315,7 +315,9 @@ determine_iterations (void)
int n_iterations;
ACE_DEBUG ((LM_DEBUG," (%t) determining the number of iterations...\n"));
- Scheduler *worker_a = new Scheduler ("worker A");
+ Scheduler *worker_a;
+
+ ACE_NEW_RETURN (worker_a, Scheduler ("worker A"), -1);
ACE_Time_Value tstart (ACE_OS::gettimeofday ());
ACE_Time_Value tend (ACE_OS::gettimeofday ());
@@ -335,7 +337,7 @@ determine_iterations (void)
}
ACE_DEBUG ((LM_DEBUG," (%t) n_iterations %d\n",
- (u_long) n_iterations));
+ (int) n_iterations));
worker_a->end ();
// @@ Can we safely delete worker_a here?
@@ -349,11 +351,14 @@ test_active_object (int n_iterations)
// A simple example for the use of the active object pattern and
// futures to return values from an active object.
- Scheduler *worker_a = new Scheduler ("worker A");
- Scheduler *worker_b = new Scheduler ("worker B");
+ Scheduler *worker_a;
+ Scheduler *worker_b;
+ Scheduler *worker_c;
+ ACE_NEW (worker_a, Scheduler ("worker A"));
+ ACE_NEW (worker_b, Scheduler ("worker B"));
// Have worker_c delegate his work to worker_a.
- Scheduler *worker_c = new Scheduler ("worker C", worker_a);
+ ACE_NEW (worker_c, Scheduler ("worker C", worker_a));
// loop 0:
// test the Schedulers when they are not active.
@@ -410,19 +415,19 @@ test_active_object (int n_iterations)
}
ACE_DEBUG ((LM_DEBUG, " (%t) scheduler_open_count %d before end ()\n",
- (u_long) scheduler_open_count));
+ (int) scheduler_open_count));
worker_a->end ();
worker_b->end ();
worker_c->end ();
ACE_DEBUG ((LM_DEBUG, " (%t) scheduler_open_count %d immediately after end ()\n",
- (u_long) scheduler_open_count));
+ (int) scheduler_open_count));
ACE_OS::sleep (2);
ACE_DEBUG ((LM_DEBUG, " (%t) scheduler_open_count %d after waiting\n",
- (u_long) scheduler_open_count));
+ (int) scheduler_open_count));
// @@ Can we safely delete worker_a, worker_b, and worker_c?
}
@@ -433,7 +438,8 @@ test_cancellation (int n_iterations)
// Now test the cancelling a future.
- Scheduler *worker_a = new Scheduler ("worker A");
+ Scheduler *worker_a;
+ ACE_NEW (worker_a, Scheduler ("worker A"));
worker_a->open ();
ACE_Future<double> fresulta = worker_a->work (0.01, n_iterations);
@@ -467,13 +473,15 @@ static void
test_timeout (int n_iterations)
{
ACE_DEBUG ((LM_DEBUG," (%t) testing timeout on waiting for the result...\n"));
- Scheduler *worker_a = new Scheduler ("worker A");
+ Scheduler *worker_a;
+ ACE_NEW (worker_a, Scheduler ("worker A"));
worker_a->open ();
ACE_Future<double> fresulta = worker_a->work (0.01, 2 * n_iterations);
// Should immediately return... and we should see an error...
- ACE_Time_Value *delay = new ACE_Time_Value (1);
+ ACE_Time_Value *delay;
+ ACE_NEW (delay, ACE_Time_Value (1));
double resulta;
fresulta.get (resulta, delay);
diff --git a/examples/Threads/tss1.cpp b/examples/Threads/tss1.cpp
index dd21023fa19..307ae9e1020 100644
--- a/examples/Threads/tss1.cpp
+++ b/examples/Threads/tss1.cpp
@@ -13,7 +13,8 @@
// wrapper transparently ensures that the objects of this class
// will be placed in thread-specific storage. All calls on
// ACE_TSS::operator->() are delegated to the appropriate method
-// in the Errno class.
+// in the Errno class. Note that each thread of control has its
+// own unique TSS object.
//
// = AUTHOR
// Detlef Becker
@@ -94,25 +95,44 @@ public:
Tester (void) {}
~Tester (void) {}
- virtual int open (void *theArgs = 0);
- virtual int close (u_long theArg = 0);
+ virtual int svc (void);
+
+ virtual int open (void *args = 0);
+ // Activate the thread.
+
+ virtual int close (u_long args = 0);
};
template <ACE_SYNCH_1> int
+Tester<ACE_SYNCH_2>::svc (void)
+{
+ ACE_DEBUG ((LM_DEBUG, "(%t) svc: setting error code to 1\n"));
+ TSS_Error->error (1);
+
+ for (int i = 0; i < iterations; i++)
+ // Print out every tenth iteration.
+ if ((i % 10) == 1)
+ ACE_DEBUG ((LM_DEBUG, "(%t) error = %d\n", TSS_Error->error ()));
+
+ return 0;
+}
+
+template <ACE_SYNCH_1> int
Tester<ACE_SYNCH_2>::open (void *)
{
+ // Make this an Active Object.
return this->activate ();
}
template <ACE_SYNCH_1>
int Tester<ACE_SYNCH_2>::close (u_long)
{
- ACE_DEBUG ((LM_DEBUG, "close running\n!"));
+ ACE_DEBUG ((LM_DEBUG, "(%t) close running\n"));
close_started = 1;
- ACE_OS::sleep (2);
- ACE_DEBUG ((LM_DEBUG, "close: trying to log error code 7!\n"));
+ ACE_DEBUG ((LM_DEBUG, "(%t) close: setting error code to 7\n"));
TSS_Error->error (7);
- ACE_DEBUG ((LM_DEBUG, "close: logging succeeded!\n"));
+ ACE_DEBUG ((LM_DEBUG, "(%t) close: error = %d\n", TSS_Error->error ()));
+ close_started = 0;
return 0;
}
@@ -121,16 +141,25 @@ main (int, char *[])
{
Tester<ACE_MT_SYNCH> tester;
+ ACE_DEBUG ((LM_DEBUG, "(%t) main: setting error code to 3\n"));
+ TSS_Error->error (3);
+ ACE_DEBUG ((LM_DEBUG, "(%t) main: error = %d\n", TSS_Error->error ()));
+
+ // Spawn off a thread and make test an Active Object.
tester.open ();
+ // Keep looping until <Tester::close> is called.
while (!close_started)
- continue;
+ ACE_DEBUG ((LM_DEBUG, "(%t) error = %d\n", TSS_Error->error ()));
- ACE_DEBUG ((LM_DEBUG, "main: trying to log error code 7!\n"));
+ ACE_DEBUG ((LM_DEBUG, "(%t) main: setting error code to 4\n"));
+ TSS_Error->error (4);
+ ACE_DEBUG ((LM_DEBUG, "(%t) main: error = %d\n", TSS_Error->error ()));
- TSS_Error->error (3);
+ // Keep looping until <Tester::close> finishes.
+ while (close_started != 0)
+ ACE_DEBUG ((LM_DEBUG, "(%t) error = %d\n", TSS_Error->error ()));
- ACE_DEBUG ((LM_DEBUG, "main: logging succeeded!\n"));
return 0;
}
diff --git a/examples/Threads/tss2.cpp b/examples/Threads/tss2.cpp
index 24a8d958e91..706df1c54a3 100644
--- a/examples/Threads/tss2.cpp
+++ b/examples/Threads/tss2.cpp
@@ -9,11 +9,8 @@
// TSS_Test.cpp
//
// = DESCRIPTION
-// This program tests thread specific storage of data. The ACE_TSS
-// wrapper transparently ensures that the objects of this class
-// will be placed in thread-specific storage. All calls on
-// ACE_TSS::operator->() are delegated to the appropriate method
-// in the Errno class.
+// This program tests various features of ACE_Thread and thread
+// specific storage of data.
//
// = AUTHOR
// Prashant Jain and Doug Schmidt
@@ -25,35 +22,33 @@
#if defined (ACE_HAS_THREADS)
+const int MAX_TASKS = 4;
+const int MAX_ITERATIONS = 10;
+
class TSS_Obj
+ // = TITLE
+ // This object is stored in thread-specific storage.
{
public:
-
TSS_Obj (void);
~TSS_Obj (void);
private:
- static int count_;
- static ACE_Thread_Mutex lock_;
+ static ACE_Atomic_Op<ACE_Thread_Mutex, int> count_;
};
-int TSS_Obj::count_ = 0;
-ACE_Thread_Mutex TSS_Obj::lock_;
+ACE_Atomic_Op<ACE_Thread_Mutex, int> TSS_Obj::count_ = 0;
TSS_Obj::TSS_Obj (void)
{
- ACE_GUARD (ACE_Thread_Mutex, ace_mon, lock_);
-
- count_++;
- cout << "TO+ : " << count_ << endl;
+ TSS_Obj::count_++;
+ ACE_DEBUG ((LM_DEBUG, "(%t) TSS_Obj+: %d\n", (int) TSS_Obj::count_));
}
TSS_Obj::~TSS_Obj (void)
{
- ACE_GUARD (ACE_Thread_Mutex, ace_mon, lock_);
-
- count_--;
- cout << "TO- : " << count_ << endl;
+ TSS_Obj::count_--;
+ ACE_DEBUG ((LM_DEBUG, "(%t) TSS_Obj-: %d\n", (int) TSS_Obj::count_));
}
class Test_Task
@@ -66,79 +61,60 @@ public:
int open (void *arg);
static void *svc (void *arg);
- static int wait_count_;
- static int max_count_;
+
+ static ACE_Atomic_Op<ACE_Token, int> wait_count_;
+ static ACE_Atomic_Op<ACE_Token, int> max_count_;
private:
- static int count_;
+ static ACE_Atomic_Op<ACE_Token, int> count_;
};
-int Test_Task::count_ = 0;
-int Test_Task::wait_count_ = 0;
-int Test_Task::max_count_ = 0;
-int num_threads_ = 0;
+ACE_Atomic_Op<ACE_Token, int> Test_Task::count_ (0);
+ACE_Atomic_Op<ACE_Token, int> Test_Task::wait_count_ (0);
+ACE_Atomic_Op<ACE_Token, int> Test_Task::max_count_ (0);
+int num_tasks = 0;
-ACE_Token token;
+// ACE synchronization object.
+static ACE_Token token;
Test_Task::Test_Task (void)
{
- ACE_GUARD (ACE_Token, ace_mon, token);
-
- count_++;
- cout << "Test_Task+ : "
- << count_ << " ("
- << ACE_OS::thr_self ()
- << ")" << endl;
+ Test_Task::count_++;
+ ACE_DEBUG ((LM_DEBUG,
+ "(%t) Test_Task+: %d\n", (int) Test_Task::count_));
}
Test_Task::~Test_Task (void)
{
- ACE_GUARD (ACE_Token, ace_mon, token);
-
- count_--;
- cout << "Test_Task- : "
- << count_ << " ("
- << ACE_OS::thr_self ()
- << ")" << endl;
+ Test_Task::count_--;
- wait_count_--;
+ ACE_DEBUG ((LM_DEBUG,
+ "(%t) Test_Task-: %d\n", (int) Test_Task::count_));
+ Test_Task::wait_count_--;
}
void *
Test_Task::svc (void *arg)
{
+ // When the thread exits this thread-specific object will be deleted
+ // automatically.
ACE_TSS<TSS_Obj> tss (new TSS_Obj);
- {
- ACE_GUARD_RETURN (ACE_Token, ace_mon, token, 0);
+ Test_Task::wait_count_++;
+ Test_Task::max_count_++;
- wait_count_++;
- max_count_++;
- cout << "svc: waiting (" << ACE_OS::thr_self () << ")" << endl;
- }
+ ACE_DEBUG ((LM_DEBUG, "(%t) svc: waiting\n"));
while (1)
{
- {
- ACE_GUARD_RETURN (ACE_Token, ace_mon, token, 0);
-
- if (max_count_ >= num_threads_)
- break;
- else
- {
- ace_mon.release ();
- ACE_Thread::yield ();
- ace_mon.acquire ();
- }
- }
-
- {
- ACE_GUARD_RETURN (ACE_Token, ace_mon, token, 0);
-
- cout << "svc: waiting (" << ACE_OS::thr_self () << ") finished" << endl;
- }
+ if (Test_Task::max_count_ >= num_tasks)
+ break;
+ else
+ ACE_Thread::yield ();
}
+ ACE_DEBUG ((LM_DEBUG, "(%t) svc: waiting finished\n"));
+
delete (Test_Task *) arg;
return 0;
@@ -154,89 +130,59 @@ Test_Task::open (void *arg)
}
int
-main (int argc, char **argv)
+main (int argc, char *argv[])
{
- if (argc != 2)
- {
- cout << "Missing parameters!" << endl;
- return 1;
- }
-
- int num_Tasks = atoi (argv[1]);
-
- num_threads_ = num_Tasks;
+ num_tasks = argc > 1 ? atoi (argv[1]) : MAX_TASKS;
- Test_Task **task_arr = (Test_Task**) new char[sizeof (Test_Task*) * num_Tasks];
+ Test_Task **task_arr;
+
+ ACE_NEW_RETURN (task_arr, Test_Task *[num_tasks], -1);
- while (1)
+ for (int i = 0; i < MAX_ITERATIONS; i++)
{
- {
- ACE_GUARD_RETURN (ACE_Token, ace_mon, token, -1);
-
- cout << "ReseTest_Tasking Test_Task::max_count_ from: "
- << Test_Task::max_count_ << endl;
-
- Test_Task::max_count_ = 0;
- }
-
- for (int i = 0; i < num_Tasks; i++)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%t) ********* iteration %d **********\n"
+ "Test_Task::max_count_ %d\n",
+ i,
+ (int) Test_Task::max_count_));
+ Test_Task::max_count_ = 0;
+
+ for (int j = 0; j < num_tasks; j++)
{
- task_arr[i] = new Test_Task;
- task_arr[i]->open (task_arr[i]);
+ ACE_NEW_RETURN (task_arr[j], Test_Task, -1);
+ task_arr[j]->open (task_arr[j]);
}
- cout << "Waiting for first thread started..." << endl;
+ ACE_DEBUG ((LM_DEBUG, "(%t) waiting for first thread started\n"));
for (;;)
{
- ACE_GUARD_RETURN (ACE_Token, ace_mon, token, -1);
+ ACE_Thread::yield ();
if (Test_Task::max_count_ != 0 )
- {
- ace_mon.release ();
- ACE_Thread::yield ();
- ace_mon.acquire ();
- break;
- }
- ace_mon.release ();
- ACE_Thread::yield ();
- ace_mon.acquire ();
+ break;
}
- {
- ACE_GUARD_RETURN (ACE_Token, ace_mon, token, -1);
-
- cout << "First thread started!" << endl
- << "Waiting for all threads finished..." << endl;
- }
+ ACE_DEBUG ((LM_DEBUG, "(%t) First thread started\n"
+ "Waiting for all threads finished\n"));
for (;;)
{
- ACE_GUARD_RETURN (ACE_Token, ace_mon, token, -1);
-
- if (!(Test_Task::max_count_ == num_threads_
+ if (!(Test_Task::max_count_ == num_tasks
&& Test_Task::wait_count_ == 0))
{
- ace_mon.release ();
ACE_Thread::yield ();
- ace_mon.acquire ();
continue;
}
-
- cout << "Test_Task::max_count_ = "
- << Test_Task::max_count_
- << " Test_Task::wait_count_ = "
- << Test_Task::wait_count_
- << endl;
+ ACE_DEBUG ((LM_DEBUG,
+ "(%t) Test_Task::max_count_ = %d,"
+ " Test_Task::wait_count_ = %d",
+ (int) Test_Task::max_count_,
+ (int) Test_Task::wait_count_));
break;
}
- {
- ACE_GUARD_RETURN (ACE_Token, ace_mon, token, -1);
- cout << "All threads finished..." << endl;
- }
-
- ACE_OS::sleep (2);
+ ACE_DEBUG ((LM_DEBUG, "(%t) all threads finished\n"));
}
return 0;
@@ -250,3 +196,7 @@ main (int, char *[])
return 0;
}
#endif /* ACE_HAS_THREADS */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SPECIALIZATION)
+template class ACE_Atomic_Op<ACE_Token, int>;
+#endif /* ACE_TEMPLATES_REQUIRE_SPECIALIZATION */