]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/slice.cpp
Synchronize access to the underlying object of Slice
[libs/core.git] / source / io / slice.cpp
index 904f748668e472257ae383dd93330cc8fc3d4299..59a7cde301b463d492fb79ef11733702d60d512e 100644 (file)
@@ -16,6 +16,7 @@ Slice::Slice(Seekable &b, SeekOffset s, SeekOffset l):
        if(s<0 || l<0)
                throw invalid_argument("Slice");
 
+       Base::Synchronize sync(below);
        mode = below.get_mode()&M_RDWR;
        below.signal_flush_required.connect(sigc::mem_fun(this, &Slice::flush));
 }
@@ -30,7 +31,12 @@ unsigned Slice::prepare_op(unsigned size, Mode m)
        check_access(m);
 
        if(sync_position)
-               seek(position, S_BEG);
+       {
+               SeekOffset pos = below.seek(start_offset+position, S_BEG)-start_offset;
+               if(pos!=position)
+                       throw runtime_error("failed to restore position");
+               sync_position = false;
+       }
 
        SeekOffset remaining = start_offset+length-position;
        if(size>remaining)
@@ -43,6 +49,7 @@ unsigned Slice::prepare_op(unsigned size, Mode m)
 
 unsigned Slice::do_write(const char *data, unsigned size)
 {
+       Base::Synchronize sync(below);
        size = prepare_op(size, M_WRITE);
        if(!size)
                return 0;
@@ -54,6 +61,7 @@ unsigned Slice::do_write(const char *data, unsigned size)
 
 unsigned Slice::do_read(char *data, unsigned size)
 {
+       Base::Synchronize sync(below);
        size = prepare_op(size, M_READ);
        if(!size)
                return 0;
@@ -67,6 +75,7 @@ unsigned Slice::do_read(char *data, unsigned size)
 
 unsigned Slice::put(char c)
 {
+       Base::Synchronize sync(below);
        if(!prepare_op(1, M_WRITE))
                return 0;
 
@@ -77,6 +86,7 @@ unsigned Slice::put(char c)
 
 int Slice::get()
 {
+       Base::Synchronize sync(below);
        if(!prepare_op(1, M_READ))
                return 0;
 
@@ -90,6 +100,7 @@ int Slice::get()
 
 SeekOffset Slice::seek(SeekOffset off, SeekType type)
 {
+       Base::Synchronize sync(below);
        off += start_offset;
        if(type==S_CUR)
                off += position;