@@ -14,7 +14,8 @@ namespace FoundationDB.Storage.Memory.IO
1414 using System . Diagnostics . Contracts ;
1515 using System . Threading ;
1616 using System . Threading . Tasks ;
17-
17+ using System . Runtime . InteropServices ;
18+
1819 internal class SnapshotWriter
1920 {
2021 private readonly Win32SnapshotFile m_file ;
@@ -161,15 +162,48 @@ public async Task WriteLevelAsync(int level, IntPtr[] segment, CancellationToken
161162 {
162163 unsafe
163164 {
164- //REVIEW: need a better way to read raw values,
165- // maybe the DB handler could give us a Func<...> ?
166- // or maybe a Stream or Iterator view over the segment's data ?
165+ #if MONO
166+ var valuePointer = new IntPtr ( ( void * ) MemoryDatabaseHandler . ResolveValueAtVersion ( segment [ i ] , m_sequence ) ) ;
167+
168+ if ( valuePointer == IntPtr . Zero )
169+ continue ;
170+
171+ Value value = new Value ( ) ;
172+ Marshal . PtrToStructure ( valuePointer , value ) ;
173+
174+ var keyPointer = new IntPtr ( ( void * ) segment [ i ] ) ;
175+
176+ Key key = new Key ( ) ;
177+ Marshal . PtrToStructure ( keyPointer , key ) ;
178+
179+ Contract . Assert ( key . Size <= MemoryDatabaseHandler . MAX_KEY_SIZE ) ;
180+
181+ // Key Size
182+ uint size = key . Size ;
183+ m_writer . WriteVarint32 ( size ) ;
184+ m_writer . WriteBytesUnsafe ( & ( key . Data ) , ( int ) size ) ;
185+
186+ // Value
187+ m_writer . WriteVarint64 ( value . Sequence ) ; // sequence
188+ size = value . Size ;
189+ if ( size == 0 )
190+ { // empty key
191+ m_writer . WriteByte ( 0 ) ;
192+ }
193+ else
194+ {
195+ m_writer . WriteVarint32 ( size ) ; // value size
196+ m_writer . WriteBytesUnsafe ( & ( value . Data ) , ( int ) size ) ; // value data
197+ }
198+ #else
199+
167200 Value * value = MemoryDatabaseHandler . ResolveValueAtVersion ( segment [ i ] , m_sequence ) ;
168201 if ( value == null )
169202 {
170203 continue ;
171204 }
172205 Key * key = ( Key * ) segment [ i ] ; //.ToPointer();
206+
173207 Contract . Assert ( key != null && key ->Size <= MemoryDatabaseHandler . MAX_KEY_SIZE ) ;
174208
175209 // Key Size
@@ -190,7 +224,7 @@ public async Task WriteLevelAsync(int level, IntPtr[] segment, CancellationToken
190224 m_writer . WriteVarint32 ( size ) ; // value size
191225 m_writer . WriteBytesUnsafe ( & ( value ->Data ) , ( int ) size ) ; // value data
192226 }
193-
227+ #endif
194228 }
195229
196230 if ( m_writer . Position >= SnapshotFormat . FLUSH_SIZE )
0 commit comments