summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/matlab/subprocess_stream.h
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/matlab/subprocess_stream.h')
-rw-r--r--ml/dlib/dlib/matlab/subprocess_stream.h223
1 files changed, 0 insertions, 223 deletions
diff --git a/ml/dlib/dlib/matlab/subprocess_stream.h b/ml/dlib/dlib/matlab/subprocess_stream.h
deleted file mode 100644
index b00904c12..000000000
--- a/ml/dlib/dlib/matlab/subprocess_stream.h
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright (C) 2016 Davis E. King (davis@dlib.net)
-// License: Boost Software License See LICENSE.txt for the full license.
-#ifndef DLIB_SUBPROCeSS_STREAM_H_
-#define DLIB_SUBPROCeSS_STREAM_H_
-
-#include <utility>
-#include <unistd.h>
-#include <iostream>
-#include <memory>
-#include <dlib/matrix.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-
-namespace dlib
-{
-
-// --------------------------------------------------------------------------------------
-
- // Call dlib's serialize and deserialize by default. The point of this version of
- // serialize is to do something fast that normally we wouldn't do, like directly copy
- // memory. This is safe since this is an interprocess communication happening the same
- // machine.
- template <typename T> void interprocess_serialize ( const T& item, std::ostream& out) { serialize(item, out); }
- template <typename T> void interprocess_deserialize (T& item, std::istream& in) { deserialize(item, in); }
-
- // But have overloads for direct memory copies for some types since this is faster than
- // their default serialization.
- template <typename T, long NR, long NC, typename MM, typename L>
- void interprocess_serialize(const dlib::matrix<T,NR,NC,MM,L>& item, std::ostream& out)
- {
- dlib::serialize(item.nr(), out);
- dlib::serialize(item.nc(), out);
- if (item.size() != 0)
- out.write((const char*)&item(0,0), sizeof(T)*item.size());
- if (!out)
- throw dlib::serialization_error("Error writing matrix to interprocess iostream.");
- }
-
- template <typename T, long NR, long NC, typename MM, typename L>
- void interprocess_deserialize(dlib::matrix<T,NR,NC,MM,L>& item, std::istream& in)
- {
- long nr, nc;
- dlib::deserialize(nr, in);
- dlib::deserialize(nc, in);
- item.set_size(nr,nc);
- if (item.size() != 0)
- in.read((char*)&item(0,0), sizeof(T)*item.size());
- if (!in)
- throw dlib::serialization_error("Error reading matrix from interprocess iostream.");
- }
-
-// ----------------------------------------------------------------------------------------
-
- namespace impl{ std::iostream& get_data_iostream(); }
-
- inline void send_to_parent_process() {impl::get_data_iostream().flush();}
- template <typename U, typename ...T>
- void send_to_parent_process(U&& arg1, T&& ...args)
- /*!
- ensures
- - sends all the arguments to send_to_parent_process() to the parent process by
- serializing them with interprocess_serialize().
- !*/
- {
- interprocess_serialize(arg1, impl::get_data_iostream());
- send_to_parent_process(std::forward<T>(args)...);
- if (!impl::get_data_iostream())
- throw dlib::error("Error sending object to parent process.");
- }
-
- inline void receive_from_parent_process() {}
- template <typename U, typename ...T>
- void receive_from_parent_process(U&& arg1, T&& ...args)
- /*!
- ensures
- - receives all the arguments to receive_from_parent_process() from the parent
- process by deserializing them from interprocess_serialize().
- !*/
- {
- interprocess_deserialize(arg1, impl::get_data_iostream());
- receive_from_parent_process(std::forward<T>(args)...);
- if (!impl::get_data_iostream())
- throw dlib::error("Error receiving object from parent process.");
- }
-
-
-// ----------------------------------------------------------------------------------------
-
- class filestreambuf;
-
- class subprocess_stream : noncopyable
- {
- /*!
- WHAT THIS OBJECT REPRESENTS
- This is a tool for spawning a subprocess and communicating with it. Here
- is an example:
-
- subprocess_stream s("/usr/bin/some_program");
- s.send(obj1, obj2, obj3);
- s.receive(obj4, obj5);
- s.wait(); // wait for sub process to terminate
-
- Then in the sub process you would have:
-
- receive_from_parent_process(obj1, obj2, obj3);
- // do stuff
- cout << "echo this text to parent cout" << endl;
- send_to_parent_process(obj4, obj5);
-
-
- Additionally, if the sub process writes to its standard out then that will
- be echoed to std::cout in the parent process. Writing to std::cerr or
- returning a non-zero value from main will also be noted by the parent
- process and an appropriate exception will be thrown.
- !*/
-
- public:
-
- explicit subprocess_stream(
- const char* program_name
- );
- /*!
- ensures
- - spawns a sub process by executing the file with the given program_name.
- !*/
-
- ~subprocess_stream(
- );
- /*!
- ensures
- - calls wait(). Note that the destructor never throws even though wait() can.
- If an exception is thrown by wait() it is just logged to std::cerr.
- !*/
-
- void wait(
- );
- /*!
- ensures
- - closes the input stream to the child process and then waits for the child
- to terminate.
- - If the child returns an error (by returning != 0 from its main) or
- outputs to its standard error then wait() throws a dlib::error() with the
- standard error output in it.
- !*/
-
- int get_child_pid() const { return child_pid; }
- /*!
- ensures
- - returns the PID of the child process
- !*/
-
- template <typename U, typename ...T>
- void send(U&& arg1, T&& ...args)
- /*!
- ensures
- - sends all the arguments to send() to the subprocess by serializing them
- with interprocess_serialize().
- !*/
- {
- interprocess_serialize(arg1, iosub);
- send(std::forward<T>(args)...);
- if (!iosub)
- {
- std::ostringstream sout;
- sout << stderr.rdbuf();
- throw dlib::error("Error sending object to child process.\n" + sout.str());
- }
- }
- void send() {iosub.flush();}
-
- template <typename U, typename ...T>
- void receive(U&& arg1, T&& ...args)
- /*!
- ensures
- - receives all the arguments to receive() to the subprocess by deserializing
- them with interprocess_deserialize().
- !*/
- {
- interprocess_deserialize(arg1, iosub);
- receive(std::forward<T>(args)...);
- if (!iosub)
- {
- std::ostringstream sout;
- sout << stderr.rdbuf();
- throw dlib::error("Error receiving object from child process.\n" + sout.str() );
- }
- }
- void receive() {}
-
-
- private:
-
- void send_eof();
-
- class cpipe : noncopyable
- {
- private:
- int fd[2];
- public:
- cpipe() { if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fd)) throw dlib::error("Failed to create pipe"); }
- ~cpipe() { close(); }
- int parent_fd() const { return fd[0]; }
- int child_fd() const { return fd[1]; }
- void close() { ::close(fd[0]); ::close(fd[1]); }
- };
-
- cpipe data_pipe;
- cpipe stdout_pipe;
- cpipe stderr_pipe;
- bool wait_called = false;
- std::unique_ptr<filestreambuf> inout_buf;
- std::unique_ptr<filestreambuf> err_buf;
- int child_pid = -1;
- std::istream stderr;
- std::iostream iosub;
- };
-}
-
-// ----------------------------------------------------------------------------------------
-
-#endif // DLIB_SUBPROCeSS_STREAM_H_
-