📄 thread_per_connection_logging_server.h
字号:
/*
** Thread_Per_Connection_Logging_Server.h,v 1.3 2002/07/02 19:58:23 shuston Exp
**
** Copyright 2001 Addison Wesley. All Rights Reserved.
*/
#ifndef _THREAD_PER_CONNECTION_LOGGING_SERVER_H
#define _THREAD_PER_CONNECTION_LOGGING_SERVER_H
#include "ace/SOCK_Stream.h"
#include "Logging_Server.h"
#include "Logging_Handler.h"
class Thread_Per_Connection_Logging_Server : public Logging_Server
{
private:
struct Thread_Args {
Thread_Args (Thread_Per_Connection_Logging_Server *lsp) : this_ (lsp) {}
Thread_Per_Connection_Logging_Server *this_;
ACE_SOCK_Stream logging_peer_;
};
// Passed as a parameter to <ACE_Thread_Manager::spawn>.
static ACE_THR_FUNC_RETURN Thread_Per_Connection_Logging_Server::run_svc (void *arg)
{
Thread_Args *thread_args = ACE_static_cast (Thread_Args *, arg);
thread_args->this_->handle_data (&thread_args->logging_peer_);
thread_args->logging_peer_.close ();
delete thread_args;
return 0; // Return value is ignored
}
protected:
virtual int Thread_Per_Connection_Logging_Server::handle_connections ()
{
Thread_Args *thread_args = new Thread_Args (this);
if (acceptor ().accept (thread_args->logging_peer_) == -1)
return -1;
if (ACE_Thread_Manager::instance ()->spawn (
// Pointer to function entry point.
Thread_Per_Connection_Logging_Server::run_svc,
// <run_svc> parameter.
ACE_static_cast (void *, thread_args),
THR_DETACHED | THR_SCOPE_SYSTEM) == -1)
{
return -1;
}
else
{
return 0;
}
}
virtual int Thread_Per_Connection_Logging_Server::handle_data (ACE_SOCK_Stream *client)
{
ACE_FILE_IO log_file;
// thread isn't doing anything except handling this client.
client->disable (ACE_NONBLOCK);
Logging_Handler logging_handler (log_file, *client);
// Keep handling log records until client closes connection
// or this thread is asked to cancel itself.
ACE_Thread_Manager *mgr = ACE_Thread_Manager::instance ();
ACE_thread_t me = ACE_Thread::self ();
while (!mgr->testcancel (me) &&
logging_handler.log_record () != -1)
continue;
return 0;
}
public:
// Template Method that runs logging server's event loop. Need to
// reimplement this here because the threads spawned from handle_connections
// call handle_data; therefore, this method must not.
virtual int run (u_short server_port) {
if (open (server_port) == -1)
return -1;
for (;;) {
if (handle_connections () == -1)
return -1;
}
return 0;
}
};
Thread_Per_Connection_Logging_Server server;
#endif /* _THREAD_PER_CONNECTION_LOGGING_SERVER_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -