diff options
Diffstat (limited to 'src/mongo/shell/shell_utils_launcher.h')
-rw-r--r-- | src/mongo/shell/shell_utils_launcher.h | 164 |
1 files changed, 84 insertions, 80 deletions
diff --git a/src/mongo/shell/shell_utils_launcher.h b/src/mongo/shell/shell_utils_launcher.h index c0e038cc016..49ec94f91d9 100644 --- a/src/mongo/shell/shell_utils_launcher.h +++ b/src/mongo/shell/shell_utils_launcher.h @@ -41,88 +41,92 @@ namespace mongo { - class Scope; - - namespace shell_utils { - - // Scoped management of mongo program instances. Simple implementation: - // destructor kills all mongod instances created by the shell. - struct MongoProgramScope { - MongoProgramScope() {} // Avoid 'unused variable' warning. - ~MongoProgramScope(); - }; - void KillMongoProgramInstances(); - - void goingAwaySoon(); - void installShellUtilsLauncher( Scope& scope ); - - /** Record log lines from concurrent programs. All public members are thread safe. */ - class ProgramOutputMultiplexer { - public: - void appendLine( int port, ProcessId pid, const char *line ); - /** @return up to 100000 characters of the most recent log output. */ - std::string str() const; - void clear(); - private: - std::stringstream _buffer; - }; - - /** - * A registry of spawned programs that are identified by a bound port or else a system pid. - * All public member functions are thread safe. - * - * TODO: Clean this up to make the semantics more consistent between pids and ports - */ - class ProgramRegistry { - public: - - bool isPortRegistered( int port ) const; - /** @return pid for a registered port. */ - ProcessId pidForPort( int port ) const; - /** @return port (-1 if doesn't exist) for a registered pid. */ - int portForPid( ProcessId pid ) const; - /** Register an unregistered port. */ - void registerPort( int port, ProcessId pid, int output ); - void deletePort( int port ); - void getRegisteredPorts( std::vector<int> &ports ); - - bool isPidRegistered( ProcessId pid ) const; - /** Register an unregistered pid. */ - void registerPid( ProcessId pid, int output ); - void deletePid( ProcessId pid ); - void getRegisteredPids( std::vector<ProcessId> &pids ); - - private: - std::map<int,std::pair<ProcessId,int> > _ports; - std::map<ProcessId,int> _pids; - mutable boost::recursive_mutex _mutex; +class Scope; + +namespace shell_utils { + +// Scoped management of mongo program instances. Simple implementation: +// destructor kills all mongod instances created by the shell. +struct MongoProgramScope { + MongoProgramScope() {} // Avoid 'unused variable' warning. + ~MongoProgramScope(); +}; +void KillMongoProgramInstances(); + +void goingAwaySoon(); +void installShellUtilsLauncher(Scope& scope); + +/** Record log lines from concurrent programs. All public members are thread safe. */ +class ProgramOutputMultiplexer { +public: + void appendLine(int port, ProcessId pid, const char* line); + /** @return up to 100000 characters of the most recent log output. */ + std::string str() const; + void clear(); + +private: + std::stringstream _buffer; +}; + +/** + * A registry of spawned programs that are identified by a bound port or else a system pid. + * All public member functions are thread safe. + * + * TODO: Clean this up to make the semantics more consistent between pids and ports + */ +class ProgramRegistry { +public: + bool isPortRegistered(int port) const; + /** @return pid for a registered port. */ + ProcessId pidForPort(int port) const; + /** @return port (-1 if doesn't exist) for a registered pid. */ + int portForPid(ProcessId pid) const; + /** Register an unregistered port. */ + void registerPort(int port, ProcessId pid, int output); + void deletePort(int port); + void getRegisteredPorts(std::vector<int>& ports); + + bool isPidRegistered(ProcessId pid) const; + /** Register an unregistered pid. */ + void registerPid(ProcessId pid, int output); + void deletePid(ProcessId pid); + void getRegisteredPids(std::vector<ProcessId>& pids); + +private: + std::map<int, std::pair<ProcessId, int>> _ports; + std::map<ProcessId, int> _pids; + mutable boost::recursive_mutex _mutex; #ifdef _WIN32 - public: - std::map<ProcessId,HANDLE> _handles; +public: + std::map<ProcessId, HANDLE> _handles; #endif - }; - - /** Helper class for launching a program and logging its output. */ - class ProgramRunner { - public: - /** @param args The program's arguments, including the program name. */ - ProgramRunner( const BSONObj &args ); - /** Launch the program. */ - void start(); - /** Continuously read the program's output, generally from a special purpose thread. */ - void operator()(); - ProcessId pid() const { return _pid; } - int port() const { return _port; } - - private: - boost::filesystem::path findProgram( const std::string &prog ); - void launchProcess( int child_stdout ); - - std::vector<std::string> _argv; - int _port; - int _pipe; - ProcessId _pid; - }; +}; + +/** Helper class for launching a program and logging its output. */ +class ProgramRunner { +public: + /** @param args The program's arguments, including the program name. */ + ProgramRunner(const BSONObj& args); + /** Launch the program. */ + void start(); + /** Continuously read the program's output, generally from a special purpose thread. */ + void operator()(); + ProcessId pid() const { + return _pid; + } + int port() const { + return _port; } + +private: + boost::filesystem::path findProgram(const std::string& prog); + void launchProcess(int child_stdout); + + std::vector<std::string> _argv; + int _port; + int _pipe; + ProcessId _pid; +}; +} } |