summaryrefslogtreecommitdiff
path: root/TAO/examples/AMI/FL_Callback/peer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/examples/AMI/FL_Callback/peer.cpp')
-rw-r--r--TAO/examples/AMI/FL_Callback/peer.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/TAO/examples/AMI/FL_Callback/peer.cpp b/TAO/examples/AMI/FL_Callback/peer.cpp
new file mode 100644
index 00000000000..05e3a50db81
--- /dev/null
+++ b/TAO/examples/AMI/FL_Callback/peer.cpp
@@ -0,0 +1,172 @@
+// $Id$
+
+#include "Peer_i.h"
+#include "ace/Get_Opt.h"
+#include "ace/Task.h"
+#include "ace/Sched_Params.h"
+#include "ace/OS_NS_errno.h"
+
+ACE_RCSID (FL_Callback,
+ peer,
+ "$Id$")
+
+const char *ior = "file://progress.ior";
+int nthreads = 4;
+int interval = 0; // microseconds
+
+int
+parse_args (int argc, char *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "k:n:t:");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'k':
+ ior = get_opts.opt_arg ();
+ break;
+
+ case 'n':
+ nthreads = ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+
+ case 't':
+ interval = ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s "
+ "-k <iorfile>"
+ "-n <threads>"
+ "-t <microseconds>"
+ "\n",
+ argv [0]),
+ -1);
+ }
+ // Indicates sucessful parsing of the command line
+ return 0;
+}
+
+class Worker : public ACE_Task_Base
+{
+ // = TITLE
+ // Run a server thread
+ //
+ // = DESCRIPTION
+ // Use the ACE_Task_Base class to run server threads
+ //
+public:
+ Worker (CORBA::ORB_ptr orb);
+ // ctor
+
+ virtual int svc (void);
+ // The thread entry point.
+
+private:
+ CORBA::ORB_var orb_;
+ // The orb
+};
+
+int
+main (int argc, char *argv[])
+{
+ int priority =
+ (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO)
+ + ACE_Sched_Params::priority_max (ACE_SCHED_FIFO)) / 2;
+
+ priority = ACE_Sched_Params::next_priority (ACE_SCHED_FIFO,
+ priority);
+
+ priority = ACE_Sched_Params::next_priority (ACE_SCHED_FIFO,
+ priority);
+
+ // Enable FIFO scheduling, e.g., RT scheduling class on Solaris.
+ if (ACE_OS::sched_params (ACE_Sched_Params (ACE_SCHED_FIFO,
+ priority,
+ ACE_SCOPE_PROCESS)) != 0)
+ {
+ if (ACE_OS::last_error () == EPERM)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "server (%P|%t): user is not superuser, "
+ "test runs in time-shared class\n"));
+ }
+ else
+ ACE_ERROR ((LM_ERROR,
+ "server (%P|%t): sched_params failed\n"));
+ }
+
+ try
+ {
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv);
+
+ CORBA::Object_var poa_object =
+ orb->resolve_initial_references("RootPOA");
+
+ 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 ());
+
+ PortableServer::POAManager_var poa_manager =
+ root_poa->the_POAManager ();
+
+ poa_manager->activate ();
+
+ if (parse_args (argc, argv) != 0)
+ return 1;
+
+ CORBA::Object_var progress_object =
+ orb->string_to_object (ior);
+
+ Progress_var progress =
+ Progress::_narrow (progress_object.in ());
+
+ ACE_Time_Value delay (0, interval);
+
+ Peer_i peer;
+ peer.init (orb.in (),
+ progress.in (),
+ delay);
+
+ Worker worker (orb.in ());
+ if (worker.activate (THR_NEW_LWP | THR_JOINABLE,
+ nthreads) != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot activate client threads\n"),
+ 1);
+
+ worker.thr_mgr ()->wait ();
+
+ ACE_DEBUG ((LM_DEBUG, "event loop finished\n"));
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception ("Caught exception:");
+ return 1;
+ }
+
+ return 0;
+}
+
+// ****************************************************************
+
+Worker::Worker (CORBA::ORB_ptr orb)
+ : orb_ (CORBA::ORB::_duplicate (orb))
+{
+}
+
+int
+Worker::svc (void)
+{
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) starting event loop\n"));
+ this->orb_->run ();
+ return 0;
+}