Skip to content

Commit 074da48

Browse files
committed
Decuple ConnectorThread from SocketAppender so that it is reusable.
socketappender.h: Move ConnectorThread out of SocketAppender. Add new interface IConnectorThreadClient. socketappender.cxx: Accommodate the move of ConnectorThread. Use IConnectorThreadClient interface. Implement IConnectorThreadClient in SocketAppender.
1 parent 952b931 commit 074da48

File tree

2 files changed

+112
-44
lines changed

2 files changed

+112
-44
lines changed

include/log4cplus/socketappender.h

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,50 @@
3838

3939
namespace log4cplus
4040
{
41+
42+
43+
#if ! defined (LOG4CPLUS_SINGLE_THREADED)
44+
45+
namespace helpers
46+
{
47+
48+
class LOG4CPLUS_EXPORT ConnectorThread;
49+
50+
class LOG4CPLUS_EXPORT IConnectorThreadClient
51+
{
52+
protected:
53+
virtual ~IConnectorThreadClient ();
54+
55+
virtual thread::Mutex const & ctcGetAccessMutex () const = 0;
56+
virtual helpers::Socket & ctcGetSocket () = 0;
57+
virtual helpers::Socket ctcConnect () = 0;
58+
virtual void ctcSetConnected () = 0;
59+
60+
friend class LOG4CPLUS_EXPORT ConnectorThread;
61+
};
62+
63+
64+
class LOG4CPLUS_EXPORT ConnectorThread
65+
: public thread::AbstractThread
66+
{
67+
public:
68+
ConnectorThread (IConnectorThreadClient &);
69+
virtual ~ConnectorThread ();
70+
71+
virtual void run();
72+
73+
void terminate ();
74+
void trigger ();
75+
76+
protected:
77+
IConnectorThreadClient & ctc;
78+
thread::ManualResetEvent trigger_ev;
79+
bool exit_flag;
80+
};
81+
82+
} // namespace helpers
83+
84+
#endif
4185

4286

4387
#ifndef UNICODE
@@ -98,7 +142,10 @@ namespace log4cplus
98142
*
99143
* </dl>
100144
*/
101-
class LOG4CPLUS_EXPORT SocketAppender : public Appender {
145+
class LOG4CPLUS_EXPORT SocketAppender
146+
: public Appender
147+
, protected virtual helpers::IConnectorThreadClient
148+
{
102149
public:
103150
// Ctors
104151
SocketAppender(const log4cplus::tstring& host, unsigned short port,
@@ -123,29 +170,13 @@ namespace log4cplus
123170
log4cplus::tstring serverName;
124171

125172
#if ! defined (LOG4CPLUS_SINGLE_THREADED)
126-
class LOG4CPLUS_EXPORT ConnectorThread;
127-
friend class ConnectorThread;
128-
129-
class LOG4CPLUS_EXPORT ConnectorThread
130-
: public thread::AbstractThread
131-
{
132-
public:
133-
ConnectorThread (SocketAppender &);
134-
virtual ~ConnectorThread ();
135-
136-
virtual void run();
137-
138-
void terminate ();
139-
void trigger ();
140-
141-
protected:
142-
SocketAppender & sa;
143-
thread::ManualResetEvent trigger_ev;
144-
bool exit_flag;
145-
};
173+
virtual thread::Mutex const & ctcGetAccessMutex () const;
174+
virtual helpers::Socket & ctcGetSocket ();
175+
virtual helpers::Socket ctcConnect ();
176+
virtual void ctcSetConnected ();
146177

147178
volatile bool connected;
148-
helpers::SharedObjectPtr<ConnectorThread> connector;
179+
helpers::SharedObjectPtr<helpers::ConnectorThread> connector;
149180
#endif
150181

151182
private:

src/socketappender.cxx

Lines changed: 59 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,37 @@ int const LOG4CPLUS_MESSAGE_VERSION = 3;
3434

3535

3636
#if ! defined (LOG4CPLUS_SINGLE_THREADED)
37-
SocketAppender::ConnectorThread::ConnectorThread (
38-
SocketAppender & socket_appender)
39-
: sa (socket_appender)
37+
38+
namespace helpers
39+
{
40+
41+
IConnectorThreadClient::~IConnectorThreadClient ()
42+
{ }
43+
44+
//
45+
//
46+
//
47+
48+
ConnectorThread::ConnectorThread (
49+
IConnectorThreadClient & client)
50+
: ctc (client)
4051
, exit_flag (false)
4152
{ }
4253

4354

44-
SocketAppender::ConnectorThread::~ConnectorThread ()
55+
ConnectorThread::~ConnectorThread ()
4556
{ }
4657

4758

4859
void
49-
SocketAppender::ConnectorThread::run ()
60+
ConnectorThread::run ()
5061
{
5162
while (true)
5263
{
5364
trigger_ev.timed_wait (30 * 1000);
5465

5566
helpers::getLogLog().debug (
56-
LOG4CPLUS_TEXT("SocketAppender::ConnectorThread::run()")
57-
LOG4CPLUS_TEXT("- running..."));
67+
LOG4CPLUS_TEXT("ConnectorThread::run()- running..."));
5868

5969
// Check exit condition as the very first thing.
6070

@@ -67,16 +77,17 @@ SocketAppender::ConnectorThread::run ()
6777

6878
// Do not try to re-open already open socket.
6979

80+
helpers::Socket & client_socket = ctc.ctcGetSocket ();
81+
thread::Mutex const & client_access_mutex = ctc.ctcGetAccessMutex ();
7082
{
71-
thread::MutexGuard guard (sa.access_mutex);
72-
if (sa.socket.isOpen ())
83+
thread::MutexGuard guard (client_access_mutex);
84+
if (client_socket.isOpen ())
7385
continue;
7486
}
7587

7688
// The socket is not open, try to reconnect.
7789

78-
helpers::Socket new_socket (sa.host,
79-
static_cast<unsigned short>(sa.port));
90+
helpers::Socket new_socket (ctc.ctcConnect ());
8091
if (! new_socket.isOpen ())
8192
{
8293
helpers::getLogLog().error(
@@ -91,19 +102,19 @@ SocketAppender::ConnectorThread::run ()
91102
continue;
92103
}
93104

94-
// Connection was successful, move the socket into SocketAppender.
105+
// Connection was successful, move the socket into client.
95106

96107
{
97-
thread::MutexGuard guard (sa.access_mutex);
98-
sa.socket = new_socket;
99-
sa.connected = true;
108+
thread::MutexGuard guard (client_access_mutex);
109+
client_socket = new_socket;
110+
ctc.ctcSetConnected ();
100111
}
101112
}
102113
}
103114

104115

105116
void
106-
SocketAppender::ConnectorThread::terminate ()
117+
ConnectorThread::terminate ()
107118
{
108119
{
109120
thread::MutexGuard guard (access_mutex);
@@ -115,11 +126,13 @@ SocketAppender::ConnectorThread::terminate ()
115126

116127

117128
void
118-
SocketAppender::ConnectorThread::trigger ()
129+
ConnectorThread::trigger ()
119130
{
120131
trigger_ev.signal ();
121132
}
122133

134+
} // namespace helpers
135+
123136
#endif
124137

125138

@@ -155,10 +168,6 @@ SocketAppender::SocketAppender(const helpers::Properties & properties)
155168

156169
SocketAppender::~SocketAppender()
157170
{
158-
#if ! defined (LOG4CPLUS_SINGLE_THREADED)
159-
connector->terminate ();
160-
#endif
161-
162171
destructorImpl();
163172
}
164173

@@ -202,7 +211,7 @@ SocketAppender::initConnector ()
202211
{
203212
#if ! defined (LOG4CPLUS_SINGLE_THREADED)
204213
connected = true;
205-
connector = new ConnectorThread (*this);
214+
connector = new helpers::ConnectorThread (*this);
206215
connector->start ();
207216
#endif
208217
}
@@ -248,6 +257,34 @@ SocketAppender::append(const spi::InternalLoggingEvent& event)
248257
}
249258

250259

260+
thread::Mutex const &
261+
SocketAppender::ctcGetAccessMutex () const
262+
{
263+
return access_mutex;
264+
}
265+
266+
267+
helpers::Socket &
268+
SocketAppender::ctcGetSocket ()
269+
{
270+
return socket;
271+
}
272+
273+
274+
helpers::Socket
275+
SocketAppender::ctcConnect ()
276+
{
277+
return helpers::Socket (host, static_cast<unsigned short>(port));
278+
}
279+
280+
void
281+
SocketAppender::ctcSetConnected ()
282+
{
283+
connected = true;
284+
}
285+
286+
287+
251288
/////////////////////////////////////////////////////////////////////////////
252289
// namespace helpers methods
253290
/////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)