X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fbase.h;h=b6d1ff65a2a83f1b793d10fb5a4d36fd9f966efa;hp=df63b5b1ed3ed2d5cfbd4797bc319919fa110794;hb=be8ea216d23bf36bdfb2d3e302638782575fc136;hpb=31e72f50fbb34d86877e5110401c49ce3fefd4bb diff --git a/source/io/base.h b/source/io/base.h index df63b5b..b6d1ff6 100644 --- a/source/io/base.h +++ b/source/io/base.h @@ -2,26 +2,32 @@ #define MSP_IO_BASE_H_ #include +#include +#include +#include "handle.h" #include "mode.h" #include "poll.h" namespace Msp { namespace IO { -struct Handle; - /** 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 +class Base: private NonCopyable { public: - /** Emitted when there is data available for reading. If all data is not - read, the signal is emitted again immediately. */ - sigc::signal signal_data_available; + /** 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; @@ -30,26 +36,16 @@ 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 mask of interesting events changes. Mainly for use by - EventDispatcher. */ - sigc::signal signal_events_changed; - /** Emitted when the object is deleted. Mainly for use by EventDispatcher. */ sigc::signal signal_deleted; protected: Mode mode; - PollEvent events; bool eof_flag; + Mutex *mutex; Base(); -private: - Base(const Base &); - Base &operator=(const Base &); public: virtual ~Base(); @@ -59,12 +55,20 @@ 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; } protected: + void check_access(Mode) const; + virtual unsigned do_write(const char *, unsigned) = 0; virtual unsigned do_read(char *, unsigned) = 0; @@ -94,26 +98,18 @@ public: to end-of-file or non-blocking operation. */ virtual int get(); - /** Returns the end-of-file flag. */ - bool eof() const { return eof_flag; } - protected: - void set_events(PollEvent); + void set_eof(); public: - /** Returns a mask of the currently interesting events. Used by - EventDispatcher. */ - PollEvent get_events() const { return events; } - - /** Returns a handle for polling. Should throw if the object does not have - an event handle. */ - virtual const Handle &get_event_handle() = 0; - - /** Notifies the object of an event. Used by EventDispatcher. */ - void event(PollEvent); + /** 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; } -protected: - virtual void on_event(PollEvent) { } + /** Returns the system-level handle for the object. Used by Console to + perform redirections. */ + virtual const Handle &get_handle(Mode) = 0; }; } // namespace IO