X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fbase.h;h=a6a8827c6d4c28ee981806c4284af063b96de8dd;hp=700dae7646180266d5393991e2b4d799ac7c1d2c;hb=ea8bf8f588310b0d7fd3297d74907602705bba1d;hpb=d16185720fa344263367dbd50c61bfc8183d99a4 diff --git a/source/io/base.h b/source/io/base.h index 700dae7..a6a8827 100644 --- a/source/io/base.h +++ b/source/io/base.h @@ -2,6 +2,8 @@ #define MSP_IO_BASE_H_ #include +#include +#include "handle.h" #include "mode.h" #include "poll.h" @@ -10,13 +12,22 @@ namespace IO { /** Common interface for all I/O objects. - -A derived class must call set_events(P_NONE) before it is destroyed to avoid -leaving stale pointers in an EventDispatcher. */ class Base { public: + /** RAII synchronization primitive. Prevents concurrent access to the + target object during the lifetime of the Synchronize object. */ + class Synchronize + { + private: + Base &io; + + public: + Synchronize(Base &); + ~Synchronize(); + }; + /** Emitted when there is no more data to be read. */ sigc::signal signal_end_of_file; @@ -24,9 +35,6 @@ public: seeked) and any data buffered by upper layers needs to be flushed. */ sigc::signal signal_flush_required; - /** Emitted when the I/O object has closed. */ - sigc::signal signal_closed; - /** Emitted when the object is deleted. Mainly for use by EventDispatcher. */ sigc::signal signal_deleted; @@ -34,6 +42,7 @@ public: protected: Mode mode; bool eof_flag; + Mutex *mutex; Base(); private: @@ -48,7 +57,13 @@ public: was done. Blocking is enabled by default. */ - virtual void set_block(bool) { } + virtual void set_block(bool) = 0; + + /** Sets inheritance mode. When inheritance is enabled, the file descriptor + will persist through Process::execute. + + Inheritance is disabled by default. */ + virtual void set_inherit(bool) = 0; /** Returns the current mode flags. */ Mode get_mode() const { return mode; } @@ -89,8 +104,14 @@ protected: void set_eof(); public: - /** Returns the end-of-file flag. */ + /** Returns the end-of-file flag. Note that some types of objects won't + indicate end-of-file until you try to read at least one byte past the actual + end, while others indicate it when you've read the last byte. */ bool eof() const { return eof_flag; } + + /** Returns the system-level handle for the object. Used by Console to + perform redirections. */ + virtual const Handle &get_handle(Mode) = 0; }; } // namespace IO