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 144 145 146
|
/* -*- C++ -*- */
//=============================================================================
/**
* @file Process_Strategy_Test.h
*
* $Id: Process_Strategy_Test.h 93638 2011-03-24 13:16:05Z johnnyw $
*
* This file contains the definition of Counting_Service and
* Options. Some compilers need it in a .h file for template
* instantiation (such as AIX C Set ++).
*
*
* @author Doug Schmidt <schmidt@cs.wustl.edu> and Kevin Boyle <kboyle@sanwafp.com>
*/
//=============================================================================
#ifndef ACE_TESTS_PROCESS_STRATEGY_TEST_H
#define ACE_TESTS_PROCESS_STRATEGY_TEST_H
#include "ace/Event_Handler.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
#include "ace/File_Lock.h"
#include "ace/SOCK_Stream.h"
#include "ace/Svc_Handler.h"
#include "ace/Strategies_T.h"
/**
* @class Counting_Service
*
* @brief Reads and increments the count in a shared file.
*
* Objects of this class execute in a separate process as a
* result of the <ACE_Strategy_Acceptor> and
* <ACE_Process_Strategy>.
*/
class Counting_Service : public ACE_Svc_Handler <ACE_SOCK_STREAM, ACE_NULL_SYNCH>
{
public:
/// Constructor.
Counting_Service (ACE_Thread_Manager * = 0);
/// Hook that is used to initialize the service (called by the
/// <ACE_Strategy_Acceptor::handle_input> Template Method).
virtual int open (void *v);
protected:
// = Methods invoked via "pointer to method" table entry.
/// Handle the THREAD case.
virtual int svc (void);
// = Operations corresponding to requests from the client.
/// Execute the read operation on the file.
int read (void);
/// Execute the increment operation on the file.
int inc (void);
// = Hooks called by <Reactor> and <Strategy_Acceptor>.
/// Hook called by the <Reactor> when data arrives from the client.
virtual int handle_input (ACE_HANDLE p = ACE_INVALID_HANDLE);
/// Closing down
virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE,
ACE_Reactor_Mask = ACE_Event_Handler::ALL_EVENTS_MASK);
};
class Process_Strategy : public ACE_Process_Strategy<Counting_Service>
{
public:
// Constructor
Process_Strategy (size_t n_processes = 1,
ACE_Event_Handler *acceptor = 0,
ACE_Reactor * = 0,
int flags = 0);
// Destructor
~Process_Strategy (void);
// Overwrite the process creation method to include connection
// counting
virtual int activate_svc_handler (Counting_Service *svc_handler,
void *arg = 0);
};
/**
* @class Options
*
* @brief Maintains the options for this program.
*/
class Options : public ACE_Event_Handler
{
public:
/// Constructor.
Options (void);
/// Destructor.
~Options (void);
/// Read command-line arguments and initialize options.
int parse_args (int argc, ACE_TCHAR *argv[]);
enum Concurrency_Type
{
PROCESS, // Run the test in separate processes.
REACTIVE, // Run the test reactively in one thread.
THREAD // Run the test as in separate threads.
};
// = Get/set concurrency type.
Concurrency_Type concurrency_type (void);
void concurrency_type (Concurrency_Type);
/// Returns the file lock.
ACE_File_Lock &file_lock (void);
/// Returns the filename that we're using as the lock.
const ACE_TCHAR *filename (void);
/// Returns the concurrency strategy.
ACE_Concurrency_Strategy <Counting_Service> *concurrency_strategy (void);
private:
/// Concurrency strategy that we're running.
Concurrency_Type concurrency_type_;
/// Lock for the counting file.
ACE_File_Lock file_lock_;
/// Activation strategy that either forks a new process or spawns a
/// new thread for each client connection.
ACE_Concurrency_Strategy<Counting_Service> *concurrency_strategy_;
/// Name of the counting file.
ACE_TCHAR filename_[MAXPATHLEN + 1];
};
#endif /* ACE_TESTS_PROCESS_STRATEGY_TEST_H */
|