X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fslice.cpp;h=59a7cde301b463d492fb79ef11733702d60d512e;hp=904f748668e472257ae383dd93330cc8fc3d4299;hb=169ece8b190040c4b61d68122c4ead1ba266cf79;hpb=0793fb99ee8c55c7ffe96bca902632f328e10edb diff --git a/source/io/slice.cpp b/source/io/slice.cpp index 904f748..59a7cde 100644 --- a/source/io/slice.cpp +++ b/source/io/slice.cpp @@ -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;