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
|
// UPIPE_Acceptor.cpp
// $Id$
#include "ace/UPIPE_Acceptor.h"
ACE_RCSID(ace, UPIPE_Acceptor, "$Id$")
#if defined (ACE_HAS_THREADS)
#if defined (ACE_LACKS_INLINE_FUNCTIONS)
#include "ace/UPIPE_Acceptor.i"
#endif
ACE_ALLOC_HOOK_DEFINE(ACE_UPIPE_Acceptor)
void
ACE_UPIPE_Acceptor::dump (void) const
{
ACE_TRACE ("ACE_UPIPE_Acceptor::dump");
}
/* Do nothing routine for constructor. */
ACE_UPIPE_Acceptor::ACE_UPIPE_Acceptor (void)
: mb_ (sizeof (ACE_UPIPE_Stream *))
{
ACE_TRACE ("ACE_UPIPE_Acceptor::ACE_UPIPE_Acceptor");
}
ACE_UPIPE_Acceptor::~ACE_UPIPE_Acceptor (void)
{
ACE_TRACE ("ACE_UPIPE_Acceptor::~ACE_UPIPE_Acceptor");
}
// General purpose routine for performing server ACE_UPIPE.
int
ACE_UPIPE_Acceptor::open (const ACE_UPIPE_Addr &local_addr,
int reuse_addr)
{
ACE_TRACE ("ACE_UPIPE_Acceptor::open");
return this->ACE_SPIPE_Acceptor::open (local_addr, reuse_addr);
}
int
ACE_UPIPE_Acceptor::close (void)
{
ACE_TRACE ("ACE_UPIPE_Acceptor::close");
return this->ACE_SPIPE_Acceptor::close ();
}
// General purpose routine for accepting new connections.
ACE_UPIPE_Acceptor::ACE_UPIPE_Acceptor (const ACE_UPIPE_Addr &local_addr,
int reuse_addr)
: mb_ (sizeof (ACE_UPIPE_Stream *))
{
ACE_TRACE ("ACE_UPIPE_Acceptor::ACE_UPIPE_Acceptor");
if (this->open (local_addr, reuse_addr) == -1)
ACE_ERROR ((LM_ERROR,
ACE_LIB_TEXT ("%p\n"),
ACE_LIB_TEXT ("ACE_UPIPE_Acceptor")));
}
int
ACE_UPIPE_Acceptor::accept (ACE_UPIPE_Stream &new_stream,
ACE_UPIPE_Addr *remote_addr,
ACE_Time_Value *timeout,
int restart,
int reset_new_handle)
{
ACE_TRACE ("ACE_UPIPE_Acceptor::accept");
ACE_UNUSED_ARG (reset_new_handle);
ACE_SPIPE_Stream new_io;
if (this->ACE_SPIPE_Acceptor::accept (new_io, remote_addr,
timeout, restart) == -1)
return -1;
else
{
ACE_UPIPE_Stream *remote_stream = 0;
ACE_MT (ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, new_stream.lock_, -1));
new_stream.set_handle (new_io.get_handle ());
new_stream.reference_count_++;
// Transfer address ownership.
new_io.get_local_addr (new_stream.local_addr_);
new_io.get_remote_addr (new_stream.remote_addr_);
// Now that we got the handle, we'll read the address of the
// connector-side ACE_UPIPE_Stream out of the pipe and link that
// ACE_UPIPE_Stream to our ACE_UPIPE_Stream.
if (ACE_OS::read (new_stream.get_handle (),
(char *) &remote_stream,
sizeof remote_stream) == -1)
ACE_ERROR ((LM_ERROR,
ACE_LIB_TEXT ("ACE_UPIPE_Acceptor: %p\n"),
ACE_LIB_TEXT ("read stream address failed")));
else if (new_stream.stream_.link (remote_stream->stream_) == -1)
ACE_ERROR ((LM_ERROR,
ACE_LIB_TEXT ("ACE_UPIPE_Acceptor: %p\n"),
ACE_LIB_TEXT ("link streams failed")));
// Send a message over the new streampipe to confirm acceptance.
else if (new_stream.send (&mb_, 0) == -1)
ACE_ERROR ((LM_ERROR,
ACE_LIB_TEXT ("ACE_UPIPE_Acceptor: %p\n"),
ACE_LIB_TEXT ("linked stream.put failed")));
// Close down the new_stream at this point in order to conserve
// handles. Note that we don't need the SPIPE connection
// anymore since we're now linked via the <Message_Queue>.
new_stream.ACE_SPIPE::close ();
return 0;
}
}
#endif /* ACE_HAS_THREADS */
|