diff options
-rw-r--r-- | TAO/ChangeLog | 13 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/Client_Task.cpp | 75 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/Client_Task.h | 47 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/README | 23 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/Sender.cpp | 56 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/Sender.h | 53 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/Server_Task.cpp | 37 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/Server_Task.h | 33 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/Stack_Recursion.dsw | 40 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/Test.idl | 17 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/client.cpp | 96 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/client.dsp | 208 | ||||
-rwxr-xr-x | TAO/tests/Stack_Recursion/run_test.pl | 53 | ||||
-rw-r--r-- | TAO/tests/Stack_Recursion/server.cpp | 123 |
14 files changed, 874 insertions, 0 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog index d8febce2005..0ffceda70d3 100644 --- a/TAO/ChangeLog +++ b/TAO/ChangeLog @@ -1,3 +1,16 @@ +Sat Jul 13 09:26:53 2002 Balachandran Natarajan <bala@cs.wustl.edu> + + * tests/Stack_Recursion/client.cpp: + * tests/Stack_Recursion/Client_Task.h: + * tests/Stack_Recursion/Client_Task.cpp (svc): + * tests/Stack_Recursion/Sender.cpp: + * tests/Stack_Recursion/Sender.h: + * tests/Stack_Recursion/server.cpp: + * tests/Stack_Recursion/Server_Task.h: + * tests/Stack_Recursion/Server_Task.cpp: + * tests/Stack_Recursion/Test.idl: + * tests/Stack_Recursion/run_test.pl: + Fri Jul 12 13:52:12 2002 Johnny Willemsen <jwillemsen@remedy.nl> * examples/Makefile.bor: diff --git a/TAO/tests/Stack_Recursion/Client_Task.cpp b/TAO/tests/Stack_Recursion/Client_Task.cpp new file mode 100644 index 00000000000..2d09cd42925 --- /dev/null +++ b/TAO/tests/Stack_Recursion/Client_Task.cpp @@ -0,0 +1,75 @@ +// +// $Id$ +// + +#include "Client_Task.h" + +ACE_RCSID(Stack_Recursion, + Client_Task, + "$Id$") + +Client_Task::Client_Task (Test::Sender_ptr sender, + CORBA::Long event_count, + CORBA::ULong event_size, + ACE_Thread_Manager *thr_mgr) + : ACE_Task_Base (thr_mgr) + , sender_ (Test::Sender::_duplicate (sender)) + , event_count_ (event_count) + , event_size_ (event_size) +{ +} + +int +Client_Task::svc (void) +{ + ACE_DEBUG ((LM_DEBUG, "(%P|%t) Starting client task\n")); + + ACE_DECLARE_NEW_CORBA_ENV; + ACE_TRY + { + this->validate_connections (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + for (int i = 0; i != this->event_count_; ++i) + { + if (i%100 == 0) + ACE_DEBUG ((LM_DEBUG, + "(%P|%T) In iteration [%d] ....\n", + i)) + Test::Payload_var pl = new Test::Payload; + Test::Payload_out payload (pl.out ()); + this->sender_->get_data (this->event_size_, + payload + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + } + ACE_CATCHANY + { + return -1; + } + ACE_ENDTRY; + ACE_DEBUG ((LM_DEBUG, "(%P|%t) Client task finished\n")); + return 0; +} + + +void +Client_Task::validate_connections (ACE_ENV_SINGLE_ARG_PARAMETER) +{ + for (int i = 0 ; i != 100; i++) + { + ACE_TRY + { + Test::Payload_var pl = + new Test::Payload; + Test::Payload_out k (pl.out ()); + this->sender_->get_data (1, + k + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + } + ACE_CATCHANY {} ACE_ENDTRY; + } +} diff --git a/TAO/tests/Stack_Recursion/Client_Task.h b/TAO/tests/Stack_Recursion/Client_Task.h new file mode 100644 index 00000000000..85978ff0d2a --- /dev/null +++ b/TAO/tests/Stack_Recursion/Client_Task.h @@ -0,0 +1,47 @@ +// +// $Id$ +// + +#ifndef STACK_RECURSION_CLIENT_TASK_H +#define STACK_RECURSION_CLIENT_TASK_H +#include "ace/pre.h" +#include "TestC.h" + + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "ace/Task.h" + +/// Implement a Task to run the experiments using multiple threads. +class Client_Task : public ACE_Task_Base +{ +public: + /// Constructor + Client_Task (Test::Sender_ptr receiver, + CORBA::Long event_count, + CORBA::ULong event_size, + ACE_Thread_Manager *thr_mgr); + + /// Thread entry point + int svc (void); + +private: + + /// Simple pings to prune up the connections + void validate_connections (ACE_ENV_SINGLE_ARG_PARAMETER); + +private: + /// Reference to the test interface + Test::Sender_var sender_; + + /// Total number of events + CORBA::Long event_count_; + + /// Size of each message + CORBA::ULong event_size_; +}; + +#include "ace/post.h" +#endif /* STACK_RECURSION_CLIENT_TASK_H */ diff --git a/TAO/tests/Stack_Recursion/README b/TAO/tests/Stack_Recursion/README new file mode 100644 index 00000000000..cc202fc7c40 --- /dev/null +++ b/TAO/tests/Stack_Recursion/README @@ -0,0 +1,23 @@ +/** + +@page Stack_Recursion Test README File + + A stress test for the stack recursion outlined in the bugzilla +under id 1125. Here is the link for the bug + +http://deuce.doc.wustl.edu/bugzilla/show_bug.cgi?id=1125 + +This test is designed to show the bug. The test has a server running 4 +threads and clients running 16 threads requesting around 30 MB of +data. + +@@NOTE: Once the bug is fixed we may have to change the timings in the +test so that the test can run to completion. + + To run the test use the run_test.pl script: + +$ ./run_test.pl + + the script returns 0 if the test was successful. + +*/
\ No newline at end of file diff --git a/TAO/tests/Stack_Recursion/Sender.cpp b/TAO/tests/Stack_Recursion/Sender.cpp new file mode 100644 index 00000000000..b3cb059bd93 --- /dev/null +++ b/TAO/tests/Stack_Recursion/Sender.cpp @@ -0,0 +1,56 @@ +// +// $Id$ +// +#include "Sender.h" + +ACE_RCSID(Stack_Recursion, + Sender, + "$Id$") + +Sender::Sender (void) + : message_count_ (0) + , byte_count_ (0) +{ +} + +void +Sender::dump_results () +{ + ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->mutex_); + ACE_DEBUG ((LM_DEBUG, + "Total messages = %d\n" + "Total bytes = %d\n", + this->message_count_, + this->byte_count_)); +} + +CORBA::Boolean +Sender::get_data (CORBA::ULong size, + Test::Payload_out payload + ACE_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, + ace_mon, + this->mutex_, + 0); + + this->message_count_++; + payload = + new Test::Payload (size); + payload->length (size); + this->byte_count_ += size; + + return 1; +} + +CORBA::Long +Sender::get_event_count (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, + ace_mon, + this->mutex_, + 0); + return this->message_count_; +} diff --git a/TAO/tests/Stack_Recursion/Sender.h b/TAO/tests/Stack_Recursion/Sender.h new file mode 100644 index 00000000000..4255d956152 --- /dev/null +++ b/TAO/tests/Stack_Recursion/Sender.h @@ -0,0 +1,53 @@ +// +// $Id$ +// + +#ifndef STACK_RECURSION_SENDER_H +#define STACK_RECURSION_SENDER_H +#include "ace/pre.h" + +#include "TestS.h" + +#if defined (_MSC_VER) +# if (_MSC_VER >= 1200) +# pragma warning(push) +# endif /* _MSC_VER >= 1200 */ +# pragma warning (disable:4250) +#endif /* _MSC_VER */ + +/// Implement the Test::Receiver interface +/** + * Simply print count how many bytes were received. + */ +class Sender + : public virtual POA_Test::Sender + , public virtual PortableServer::RefCountServantBase +{ +public: + /// Constructor + Sender (void); + + /// Print out the results + void dump_results (void); + + // = The skeleton methods + virtual CORBA::Boolean get_data (CORBA::ULong size, + Test::Payload_out payload + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual CORBA::Long get_event_count (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + +private: + ACE_SYNCH_MUTEX mutex_; + CORBA::ULong message_count_; + CORBA::ULong byte_count_; +}; + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma warning(pop) +#endif /* _MSC_VER */ + +#include "ace/post.h" +#endif /* MUXING_RECEIVER_H */ diff --git a/TAO/tests/Stack_Recursion/Server_Task.cpp b/TAO/tests/Stack_Recursion/Server_Task.cpp new file mode 100644 index 00000000000..d331cd5377d --- /dev/null +++ b/TAO/tests/Stack_Recursion/Server_Task.cpp @@ -0,0 +1,37 @@ +// +// $Id$ +// + +#include "Server_Task.h" + +ACE_RCSID(Stack_Recusrion, + Server_Task, + "$Id$") + +Server_Task::Server_Task (CORBA::ORB_ptr orb, + ACE_Thread_Manager *thr_mgr) + : ACE_Task_Base (thr_mgr) + , orb_ (CORBA::ORB::_duplicate (orb)) +{ +} + +int +Server_Task::svc (void) +{ + ACE_DEBUG ((LM_DEBUG, "(%P|%t) Starting server task\n")); + ACE_DECLARE_NEW_CORBA_ENV; + ACE_TRY + { + // run the test for at most 120 seconds... + ACE_Time_Value tv (120, 0); + this->orb_->run (tv ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCHANY + { + return -1; + } + ACE_ENDTRY; + ACE_DEBUG ((LM_DEBUG, "(%P|%t) Server task finished\n")); + return 0; +} diff --git a/TAO/tests/Stack_Recursion/Server_Task.h b/TAO/tests/Stack_Recursion/Server_Task.h new file mode 100644 index 00000000000..9b76b615967 --- /dev/null +++ b/TAO/tests/Stack_Recursion/Server_Task.h @@ -0,0 +1,33 @@ +// +// $Id$ +// + +#ifndef STACK_RECURSION_SERVER_TASK_H +#define STACK_RECUSRION_SERVER_TASK_H +#include "ace/pre.h" +#include "tao/corba.h" + + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ +#include "ace/Task.h" + +/// Implement a Task to run the experiments using multiple threads. +class Server_Task : public ACE_Task_Base +{ +public: + /// Constructor + Server_Task (CORBA::ORB_ptr orb, + ACE_Thread_Manager *thr_mgr); + + /// Thread entry point + int svc (void); + +private: + /// Reference to the ORB + CORBA::ORB_var orb_; +}; + +#include "ace/post.h" +#endif /* STACK_RECUSRION_SERVER_TASK_H */ diff --git a/TAO/tests/Stack_Recursion/Stack_Recursion.dsw b/TAO/tests/Stack_Recursion/Stack_Recursion.dsw new file mode 100644 index 00000000000..bf8db5f91c4 --- /dev/null +++ b/TAO/tests/Stack_Recursion/Stack_Recursion.dsw @@ -0,0 +1,40 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "Stack Recursion Client"=.\client.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "Stack Recursion Server"=.\server.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
diff --git a/TAO/tests/Stack_Recursion/Test.idl b/TAO/tests/Stack_Recursion/Test.idl new file mode 100644 index 00000000000..97af4cb3706 --- /dev/null +++ b/TAO/tests/Stack_Recursion/Test.idl @@ -0,0 +1,17 @@ +// +// $Id$ +// + +module Test +{ + typedef sequence<octet> Payload; + + interface Sender { + /// Receive a big payload + boolean get_data (in unsigned long size, + out Payload the_payload); + + /// Return the number of messages received so far + long get_event_count (); + }; +}; diff --git a/TAO/tests/Stack_Recursion/client.cpp b/TAO/tests/Stack_Recursion/client.cpp new file mode 100644 index 00000000000..2670935dd6e --- /dev/null +++ b/TAO/tests/Stack_Recursion/client.cpp @@ -0,0 +1,96 @@ +// $Id$ + +#include "Client_Task.h" +#include "ace/Get_Opt.h" + +ACE_RCSID(Stack_Recursion, + client, + "$Id$") + +const char *ior = "file://test.ior"; + +int +parse_args (int argc, char *argv[]) +{ + ACE_Get_Opt get_opts (argc, argv, "k:"); + int c; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'k': + ior = get_opts.opt_arg (); + break; + case '?': + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s " + "-k <ior>" + "\n", + argv [0]), + -1); + } + // Indicates sucessful parsing of the command line + return 0; +} + +int +main (int argc, char *argv[]) +{ + ACE_TRY_NEW_ENV + { + CORBA::ORB_var orb = + CORBA::ORB_init (argc, argv, "" ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (parse_args (argc, argv) != 0) + return 1; + + CORBA::Object_var tmp = + orb->string_to_object(ior ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + Test::Sender_var sender = + Test::Sender::_narrow(tmp.in () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (CORBA::is_nil (sender.in ())) + { + ACE_ERROR_RETURN ((LM_DEBUG, + "Nil coordinator reference <%s>\n", + ior), + 1); + } + + + Client_Task client_task (sender.in (), + 1000, + 3931260, + ACE_Thread_Manager::instance ()); + + if (client_task.activate (THR_NEW_LWP | THR_JOINABLE, 16, 1) == -1) + { + ACE_ERROR ((LM_ERROR, "Error activating client task\n")); + } + ACE_Thread_Manager::instance ()->wait (); + + CORBA::Long count = + sender->get_event_count (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + ACE_DEBUG ((LM_DEBUG, "(%P) - Receiver got %d messages\n", + count)); + + orb->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, + "Exception caught:"); + return 1; + } + ACE_ENDTRY; + + return 0; +} diff --git a/TAO/tests/Stack_Recursion/client.dsp b/TAO/tests/Stack_Recursion/client.dsp new file mode 100644 index 00000000000..21d92b80840 --- /dev/null +++ b/TAO/tests/Stack_Recursion/client.dsp @@ -0,0 +1,208 @@ +# Microsoft Developer Studio Project File - Name="Stack Recursion Client" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=Stack Recursion Client - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "client.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "client.mak" CFG="Stack Recursion Client - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "Stack Recursion Client - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "Stack Recursion Client - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "Stack Recursion Client - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../../" /I "../../" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 tao.lib ace.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace" /libpath:"..\..\tao"
+
+!ELSEIF "$(CFG)" == "Stack Recursion Client - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../../../" /I "../../" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 taod.lib aced.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\ace" /libpath:"..\..\tao"
+
+!ENDIF
+
+# Begin Target
+
+# Name "Stack Recursion Client - Win32 Release"
+# Name "Stack Recursion Client - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter ".cpp"
+# Begin Source File
+
+SOURCE=.\client.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\Client_Task.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestC.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\Client_Task.h
+# End Source File
+# End Group
+# Begin Group "IDL Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\Test.idl
+
+!IF "$(CFG)" == "Stack Recursion Client - Win32 Release"
+
+# PROP Ignore_Default_Tool 1
+USERDEP__TEST_="..\..\..\bin\Release\tao_idl.exe"
+# Begin Custom Build - Invoking TAO_IDL Compiler
+InputPath=.\Test.idl
+InputName=Test
+
+BuildCmds= \
+ ..\..\..\bin\Release\tao_idl -Ge 1 $(InputName).idl
+
+"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "Stack Recursion Client - Win32 Debug"
+
+USERDEP__TEST_="..\..\..\bin\tao_idl.exe"
+# Begin Custom Build - Invoking TAO_IDL Compiler
+InputPath=.\Test.idl
+InputName=Test
+
+BuildCmds= \
+ ..\..\..\bin\tao_idl -Ge 1 $(InputName).idl
+
+"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "Inline Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\TestC.i
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/TAO/tests/Stack_Recursion/run_test.pl b/TAO/tests/Stack_Recursion/run_test.pl new file mode 100755 index 00000000000..a96127632e8 --- /dev/null +++ b/TAO/tests/Stack_Recursion/run_test.pl @@ -0,0 +1,53 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +# $Id$ +# -*- perl -*- + +use lib '../../../bin'; +use PerlACE::Run_Test; + +$iorfile = PerlACE::LocalFile ("server.ior"); +unlink $iorfile; +$status = 0; + +$SV = new PerlACE::Process ("server", "-o $iorfile"); +$CL1 = new PerlACE::Process ("client", " -k file://$iorfile"); +$CL2 = new PerlACE::Process ("client", " -k file://$iorfile"); + +$SV->Spawn (); + +if (PerlACE::waitforfile_timed ($iorfile, 15) == -1) { + print STDERR "ERROR: cannot find file <$iorfile>\n"; + $SV->Kill (); $SV->TimedWait (1); + exit 1; +} + +$CL1->Spawn (60); +$CL2->Spawn (60); + +$client1 = $CL1->WaitKill (60); + +if ($client1 != 0) { + print STDERR "ERROR: client 1 returned $client1\n"; + $status = 1; +} + +$client2 = $CL2->WaitKill (60); + +if ($client2 != 0) { + print STDERR "ERROR: client 2 returned $client2\n"; + $status = 1; +} + +$server = $SV->TerminateWaitKill (5); + +if ($server != 0) { + print STDERR "ERROR: server returned $server\n"; + $status = 1; +} + +unlink $iorfile; + +exit $status; diff --git a/TAO/tests/Stack_Recursion/server.cpp b/TAO/tests/Stack_Recursion/server.cpp new file mode 100644 index 00000000000..0b7d02dd3da --- /dev/null +++ b/TAO/tests/Stack_Recursion/server.cpp @@ -0,0 +1,123 @@ +// $Id$ + +#include "Sender.h" +#include "Server_Task.h" +#include "ace/Get_Opt.h" + +ACE_RCSID(Stack_Recursion, + server, + "$Id$") + +const char *ior_output_file = "test.ior"; + +int +parse_args (int argc, char *argv[]) +{ + ACE_Get_Opt get_opts (argc, argv, "o:"); + int c; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'o': + ior_output_file = get_opts.opt_arg (); + break; + case '?': + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s " + "-o <iorfile>" + "\n", + argv [0]), + -1); + } + // Indicates sucessful parsing of the command line + return 0; +} + +int +main (int argc, char *argv[]) +{ + ACE_TRY_NEW_ENV + { + CORBA::ORB_var orb = + CORBA::ORB_init (argc, argv, "" ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CORBA::Object_var poa_object = + orb->resolve_initial_references("RootPOA" ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (CORBA::is_nil (poa_object.in ())) + ACE_ERROR_RETURN ((LM_ERROR, + " (%P|%t) Unable to initialize the POA.\n"), + 1); + + PortableServer::POA_var root_poa = + PortableServer::POA::_narrow (poa_object.in () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + PortableServer::POAManager_var poa_manager = + root_poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (parse_args (argc, argv) != 0) + return 1; + + Sender *sender_impl; + ACE_NEW_RETURN (sender_impl, + Sender, + 1); + PortableServer::ServantBase_var receiver_owner_transfer(sender_impl); + + Test::Sender_var sender = + sender_impl->_this (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + CORBA::String_var ior = + orb->object_to_string (sender.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // If the ior_output_file exists, output the ior to it + FILE *output_file= ACE_OS::fopen (ior_output_file, "w"); + if (output_file == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Cannot open output file for writing IOR: %s", + ior_output_file), + 1); + ACE_OS::fprintf (output_file, "%s", ior.in ()); + ACE_OS::fclose (output_file); + + poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + Server_Task server_task (orb.in (), + ACE_Thread_Manager::instance ()); + + if (server_task.activate (THR_NEW_LWP | THR_JOINABLE, 4, 1) == -1) + { + ACE_ERROR ((LM_ERROR, "Error activating server task\n")); + } + ACE_Thread_Manager::instance ()->wait (); + + ACE_DEBUG ((LM_DEBUG, "Now terminating test\n")); + + root_poa->destroy (1, + 1 + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + orb->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, + "Exception caught:"); + return 1; + } + ACE_ENDTRY; + + return 0; +} |