summaryrefslogtreecommitdiff
path: root/TAO/tests/Oneway_Send_Timeouts/main.cpp
blob: a7cf7d3a138d29f56fcca2d99847f0f4d3209ccb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// $Id$

#include "Server_Task.h"
#include "Client_Task.h"

#include "ace/Log_Msg.h"
#include "ace/OS_NS_string.h"
#include "ace/OS_NS_strings.h"
#include "ace/High_Res_Timer.h"
#include "ace/Auto_Ptr.h"

class MyMain
{
public:
  MyMain (int argc, ACE_TCHAR* argv[]);
  ~MyMain ();

  void run ();

private:
  void print_usage ();
  bool init_server (const ACE_TCHAR* args);
  bool init_client (const ACE_TCHAR* args);

  std::auto_ptr<Server_Task> server_task_;
  std::auto_ptr<Client_Task> client_task_;

  bool s_init_;
  bool shutdown_;
};

void
MyMain::print_usage ()
{
}

bool
MyMain::init_server (const ACE_TCHAR* args)
{
  std::string my_args (args);
  // main thread and extra thread for backdoor operations
  int thread_pool = 2;

  ACE_auto_ptr_reset (server_task_, new Server_Task (my_args));
  ACE_ASSERT (server_task_.get() != 0);

  server_task_->activate (THR_NEW_LWP | THR_JOINABLE |THR_INHERIT_SCHED
                          , thread_pool);

  int duration = 4; //wait 3 seconds for initialization
  ACE_Time_Value current = ACE_High_Res_Timer::gettimeofday_hr ();
  ACE_Time_Value timeout = current + ACE_Time_Value(duration);

  while (current < timeout) {
    if (server_task_->ready()) {
      break;
    }
    ACE_Time_Value sleep_time;
    sleep_time.msec (10);
    ACE_OS::sleep (sleep_time);
    current += sleep_time;
  }

  if (!server_task_->ready()) {
    server_task_->force_shutdown ();
    server_task_->wait ();
    ACE_auto_ptr_reset (server_task_, (Server_Task*)0);
    return false;
  }

  return true;
}

bool
MyMain::init_client (const ACE_TCHAR* args)
{
  std::string my_args (args);
  int thread_pool = 1;

  ACE_auto_ptr_reset (client_task_, new Client_Task (my_args));
  ACE_ASSERT (client_task_.get() != 0);

  client_task_->activate (THR_NEW_LWP | THR_JOINABLE |THR_INHERIT_SCHED
                          , thread_pool);

  return true;
}

MyMain::MyMain (int argc, ACE_TCHAR* argv[])
  : s_init_ (false), shutdown_ (false)
{
  argc--;
  for (int p = 1; p <= argc; p++)
    {
      if (ACE_OS::strcmp (argv[p], "-?") == 0) {
        print_usage ();
        return;
      }

      if (ACE_OS::strcasecmp (argv[p], "-s") == 0) {
        const ACE_TCHAR* s_args = (((p+1) <= argc) ? argv[p+1] : 0);
        s_init_ = this->init_server (s_args);
        p++;
      }
      else if (ACE_OS::strcasecmp (argv[p], "-c") == 0) {
        const ACE_TCHAR* s_args = (((p+1) <= argc) ? argv[p+1] : 0);
        if (s_init_) {
          this->init_client (s_args);
        }
        p++;
      }
    }
}

void
MyMain::run ()
{
  if (server_task_.get() != 0) {
    server_task_->wait ();
  }

  if (client_task_.get() != 0) {
    client_task_->wait ();
  }

  shutdown_ = true;
}

MyMain::~MyMain ()
{
  if (!shutdown_) {
    this->run ();
  }
}

int ACE_TMAIN (int argc, ACE_TCHAR* argv[])
{
  MyMain my_main (argc, argv);

  my_main.run ();

  return 0;
}