]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/slice.cpp
Implement controls for file descriptor inheritance
[libs/core.git] / source / io / slice.cpp
index 904f748668e472257ae383dd93330cc8fc3d4299..3fbfc5756f4e5ff4173eaf30e6ceedc1a2815591 100644 (file)
@@ -16,10 +16,21 @@ 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));
 }
 
+void Slice::set_block(bool)
+{
+       throw logic_error("Slice::set_block");
+}
+
+void Slice::set_inherit(bool)
+{
+       throw logic_error("Slice::set_inherit");
+}
+
 void Slice::flush()
 {
        sync_position = true;
@@ -30,9 +41,14 @@ unsigned Slice::prepare_op(unsigned size, Mode m)
        check_access(m);
 
        if(sync_position)
-               seek(position, S_BEG);
-
-       SeekOffset remaining = start_offset+length-position;
+       {
+               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 = length-position;
        if(size>remaining)
                size = remaining;
        if(!size && m==M_READ)
@@ -43,6 +59,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 +71,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 +85,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,8 +96,9 @@ unsigned Slice::put(char c)
 
 int Slice::get()
 {
+       Base::Synchronize sync(below);
        if(!prepare_op(1, M_READ))
-               return 0;
+               return -1;
 
        int c = below.get();
        if(c==-1 && below.eof())
@@ -88,8 +108,14 @@ int Slice::get()
        return c;
 }
 
+const Handle &Slice::get_handle(Mode)
+{
+       throw logic_error("Slice::get_handle");
+}
+
 SeekOffset Slice::seek(SeekOffset off, SeekType type)
 {
+       Base::Synchronize sync(below);
        off += start_offset;
        if(type==S_CUR)
                off += position;