diff options
author | schmidt <douglascraigschmidt@users.noreply.github.com> | 1997-01-08 00:06:10 +0000 |
---|---|---|
committer | schmidt <douglascraigschmidt@users.noreply.github.com> | 1997-01-08 00:06:10 +0000 |
commit | c74f8ce745a8d81101b4da0be11f448704d53c46 (patch) | |
tree | 31e6b83e17ad25bbe82cd48f27eeca036e5dbe73 /examples/Threads | |
parent | f9c477469e3c82edbf12a7e1f2eca7422e7f0d1f (diff) | |
download | ATCD-c74f8ce745a8d81101b4da0be11f448704d53c46.tar.gz |
foo
Diffstat (limited to 'examples/Threads')
-rw-r--r-- | examples/Threads/future1.cpp | 26 | ||||
-rw-r--r-- | examples/Threads/future2.cpp | 32 | ||||
-rw-r--r-- | examples/Threads/tss1.cpp | 51 | ||||
-rw-r--r-- | examples/Threads/tss2.cpp | 196 |
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 */ |