X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fbase.h;h=1fe143e10e18eed4668aac843c3d4905b54f3ede;hp=394a2c2306e60ebbe9f8bb7ddee0e1d4f37b4403;hb=481b844ed7d180ffbf70223075f2fc1ffdb5b444;hpb=a386a9ff068071aab19e6dcb0452e72784d84267 diff --git a/source/io/base.h b/source/io/base.h index 394a2c2..1fe143e 100644 --- a/source/io/base.h +++ b/source/io/base.h @@ -2,6 +2,7 @@ #define MSP_IO_BASE_H_ #include +#include #include "handle.h" #include "mode.h" #include "poll.h" @@ -11,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; @@ -32,6 +42,7 @@ public: protected: Mode mode; bool eof_flag; + Mutex *mutex; Base(); private: @@ -46,7 +57,7 @@ public: was done. Blocking is enabled by default. */ - virtual void set_block(bool) { } + virtual void set_block(bool) = 0; /** Returns the current mode flags. */ Mode get_mode() const { return mode; } @@ -94,7 +105,7 @@ public: /** Returns the system-level handle for the object. Used by Console to perform redirections. */ - virtual const Handle &get_handle(Mode); + virtual const Handle &get_handle(Mode) = 0; }; } // namespace IO