public void WriteNullArrayThrowsException() { var name = Guid.NewGuid().ToString(); using (var sma = new SharedList <int>(name, 10)) { bool exceptionThrown = false; try { sma.Write(null); } catch (ArgumentNullException) { exceptionThrown = true; } Assert.True(exceptionThrown); } }
public void GetEnumeratorIterateItemsDataMatches() { var name = Guid.NewGuid().ToString(); Random r = new Random(); int bufSize = 1024; byte[] data = new byte[bufSize]; byte[] readBuf = new byte[bufSize]; using (var sma = new SharedList <byte>(name, bufSize)) { sma.Write(data); int value = 0; foreach (var item in sma) { Assert.Equal(data[value], item); value++; } } }
public void AcquireWriteLockReadWriteLocksCorrectly() { var name = Guid.NewGuid().ToString(); Random r = new Random(); int bufSize = 1024; byte[] data = new byte[bufSize]; byte[] readBuf = new byte[bufSize]; bool readIsFirst = false; bool readBlocked = false; int syncValue = 0; // Fill with random data r.NextBytes(data); using (var sma = new SharedList <byte>(name, bufSize)) { // Acquire write lock early sma.AcquireWriteLock(); using (var smr = new SharedList <byte>(name)) { var t1 = Task.Factory.StartNew(() => { if (System.Threading.Interlocked.Exchange(ref syncValue, 1) == 0) { readIsFirst = true; } // Should block until write lock is released smr.AcquireReadLock(); if (System.Threading.Interlocked.Exchange(ref syncValue, 3) == 4) { readBlocked = true; } smr.CopyTo(readBuf); smr.ReleaseReadLock(); }); System.Threading.Thread.Sleep(10); var t2 = Task.Factory.StartNew(() => { var val = System.Threading.Interlocked.Exchange(ref syncValue, 2); if (val == 0) { readIsFirst = false; } else if (val == 3) { readBlocked = false; } System.Threading.Thread.Sleep(10); sma.Write(data); System.Threading.Interlocked.Exchange(ref syncValue, 4); sma.ReleaseWriteLock(); }); Task.WaitAll(t1, t2); Assert.True(readIsFirst); Assert.True(readBlocked); // Check data was written before read for (var i = 0; i < readBuf.Length; i++) { Assert.Equal(data[i], readBuf[i]); } } } }