Mercurial > hg > gpsynth
diff third_party/boost/process/context.hpp @ 0:add35537fdbb tip
Initial import
author | irh <ian.r.hobson@gmail.com> |
---|---|
date | Thu, 25 Aug 2011 11:05:55 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/third_party/boost/process/context.hpp Thu Aug 25 11:05:55 2011 +0100 @@ -0,0 +1,131 @@ +// +// Boost.Process +// ~~~~~~~~~~~~~ +// +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +/** + * \file boost/process/context.hpp + * + * Includes the declaration of the context class. + */ + +#ifndef BOOST_PROCESS_CONTEXT_HPP +#define BOOST_PROCESS_CONTEXT_HPP + +#include <boost/process/config.hpp> + +#if defined(BOOST_POSIX_API) +# include <unistd.h> +#elif defined(BOOST_WINDOWS_API) +# include <windows.h> +#endif + +#include <boost/process/stream_id.hpp> +#include <boost/process/stream_ends.hpp> +#include <boost/process/stream_type.hpp> +#include <boost/process/environment.hpp> +#include <boost/process/self.hpp> +#include <boost/process/stream_behavior.hpp> +#include <boost/function.hpp> +#include <string> +#include <map> + +namespace boost { +namespace process { + +/** + * Context class to define how a child process is created. + * + * The context class is used to configure streams, to set the work directory + * and define environment variables. It is also used to change a process + * name (the variable commonly known as argv[0]). + */ +struct context +{ + typedef std::map<stream_id, boost::function<stream_ends (stream_type)> > + streams_t; + + /** + * Streams. + * + * Streams of a child process can be configured through factory functions + * which return a pair of handles - one handle to use as a stream end + * in the child process and possibly another handle to use as a stream end + * in the parent process (if a pipe is setup both processes can communicate + * with each other). + */ + streams_t streams; + + /** + * Process name. + * + * The child process can access the process name via a variable + * commonly known as argv[0]. + */ + std::string process_name; + + /** + * Work directory. + */ + std::string work_dir; + + /** + * Environment variables. + */ + environment env; + + /** + * Constructs a process context. + * + * The default behavior of standard streams is to inherit them. The current + * work directory is also the work directory of the child process. The child + * process also inherits all environment variables. + */ + context() + : work_dir(self::get_work_dir()), + env(self::get_environment()) + { +#if defined(BOOST_POSIX_API) + streams[stdin_id] = behavior::inherit(STDIN_FILENO); + streams[stdout_id] = behavior::inherit(STDOUT_FILENO); + streams[stderr_id] = behavior::inherit(STDERR_FILENO); +#elif defined(BOOST_WINDOWS_API) + streams[stdin_id] = behavior::inherit(GetStdHandle(STD_INPUT_HANDLE)); + streams[stdout_id] = behavior::inherit(GetStdHandle(STD_OUTPUT_HANDLE)); + streams[stderr_id] = behavior::inherit(GetStdHandle(STD_ERROR_HANDLE)); +#endif + } + +#if defined(BOOST_POSIX_API) || defined(BOOST_PROCESS_DOXYGEN) + /** + * Setups a child process. + * + * This is an extension point to support more configuration options for + * child processes. You can initialize \a setup with a user-defined function + * which is called when a child process is created. + * + * On POSIX platforms setup() is called in the child process. That's why in + * a multithreaded application only async-signal-safe functions must be + * called in the function \a setup is bound to. + * + * On Windows platforms setup() is called in the parent process. A + * reference to a STARTUPINFOA structure is passed as parameter. + */ + boost::function<void ()> setup; +#elif defined(BOOST_WINDOWS_API) + boost::function<void (STARTUPINFOA&)> setup; +#endif +}; + +} +} + +#endif