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
|
// $Id$
// ============================================================================
//
// = LIBRARY
// examples
//
// = FILENAME
// bpr_thread.cpp
//
// = DESCRIPTION
// Exercises drivers for a bounded packet relay, based on threaded timer queues.
//
// = AUTHORS
// Chris Gill <cdgill@cs.wustl.edu> and
// Douglas C. Schmidt <schmidt@cs.wustl.edu>
//
// Based on the Timer Queue Test example written by
//
// Carlos O'Ryan <coryan@cs.wustl.edu> and
// Douglas C. Schmidt <schmidt@cs.wustl.edu> and
// Sergio Flores-Gaitan <sergio@cs.wustl.edu>
//
// ============================================================================
// The following #pragma is needed to disable a warning that occurs
// in MSVC 6 due to the overly long debugging symbols generated for
// the std::auto_ptr<Timer_Queue_Test_Driver<...> > template
// instance used by some of the methods in this file.
#ifdef _MSC_VER
# pragma warning(disable: 4786) /* identifier was truncated to '255'
characters in the browser
information */
#endif /* _MSC_VER */
#include "ace/Auto_Ptr.h"
#include "Thread_Bounded_Packet_Relay.h"
ACE_RCSID (Bounded_Packet_Relay,
bpr_thread,
"$Id$")
typedef Bounded_Packet_Relay_Driver<Thread_Timer_Queue>
THREAD_BOUNDED_PACKET_RELAY_DRIVER;
typedef ACE_Command_Callback<Bounded_Packet_Relay,Bounded_Packet_Relay::ACTION>
INPUT_CALLBACK;
// A snippet from Andrew Marvell (Oliver Cromwell's poet laureate)
static const char input_text [] =
"But ever at my back I hear\n"
" Time's winged chariot hurrying near.";
int
ACE_TMAIN (int, ACE_TCHAR *[])
{
// Construct a new thread manager for the input device task. Auto
// ptr ensures memory is freed when we exit this scope.
ACE_Thread_Manager *input_task_mgr;
ACE_NEW_RETURN (input_task_mgr,
ACE_Thread_Manager,
-1);
auto_ptr <ACE_Thread_Manager> mgr (input_task_mgr);
// Construct a new input device wrapper. Auto ptr ensures memory is
// freed when we exit this scope.
Text_Input_Device_Wrapper *input_device;
ACE_NEW_RETURN (input_device,
Text_Input_Device_Wrapper (input_task_mgr,
sizeof (input_text),
input_text),
-1);
auto_ptr <Text_Input_Device_Wrapper> input (input_device);
// Construct a new output device wrapper. Auto ptr ensures memory
// is freed when we exit this scope.
Text_Output_Device_Wrapper *output_device;
ACE_NEW_RETURN (output_device,
Text_Output_Device_Wrapper,
-1);
auto_ptr <Text_Output_Device_Wrapper> output (output_device);
// Construct a new bounded packet relay. Auto ptr ensures memory is
// freed when we exit this scope.
Bounded_Packet_Relay *packet_relay;
ACE_NEW_RETURN (packet_relay,
Bounded_Packet_Relay (input_task_mgr,
input_device,
output_device),
-1);
auto_ptr <Bounded_Packet_Relay> relay (packet_relay);
// Construct a receive input callback command for the relay, and register
// it with the input device. Auto ptr ensures memory is freed when we exit
// this scope.
INPUT_CALLBACK *input_callback;
ACE_NEW_RETURN (input_callback,
INPUT_CALLBACK (*packet_relay,
&Bounded_Packet_Relay::receive_input),
-1);
auto_ptr <INPUT_CALLBACK> callback (input_callback);
if (input_device->set_send_input_msg_cmd (input_callback) < 0)
{
ACE_ERROR_RETURN ((LM_ERROR,
"failed to register input callback"),
-1);
}
// Construct a new bounded packet relay driver. Auto ptr ensures
// memory is freed when we exit this scope.
THREAD_BOUNDED_PACKET_RELAY_DRIVER *tbprd;
ACE_NEW_RETURN (tbprd,
Thread_Bounded_Packet_Relay_Driver (packet_relay),
-1);
auto_ptr <THREAD_BOUNDED_PACKET_RELAY_DRIVER> driver (tbprd);
return driver->run ();
// All dynamically allocated memory is released when main() returns.
}
|