X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fio%2Fbase.h;h=8d29caffd9813096747b1c2822f6e1b185b1d854;hb=edeb93fa4182984422f70c453ced8ad3acabe1d0;hp=3d862169177f1711c6a9d3820e4fb3f97a6b94ca;hpb=5b541316a8c7bbf8b812c0f1e2dbebaa6563b0ee;p=libs%2Fcore.git diff --git a/source/io/base.h b/source/io/base.h index 3d86216..8d29caf 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: @@ -87,7 +98,9 @@ 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