public void ThreadLock_Simple() { UT_INIT(); Report.GetDefault().PushHaltFlags( false, false ); Log.AddDebugLogger(); Log.MapThreadName( "UnitTest" ); Log.SetDomain( "TestTLock", Scope.Method ); Log.SetVerbosity( Log.DebugLogger, Verbosity.Verbose, "ALIB" ); // lock a recursive lock ThreadLock aLock= new ThreadLock(); aLock.Acquire(); aLock.Release(); aLock.Acquire(); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); aLock.Acquire(); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); aLock.Release(); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); aLock.Acquire(); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); aLock.Release(); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); aLock.Release(); UT_TRUE ( aLock.ToString().StartsWith("Unlocked") ); // set unsafe aLock.SetSafeness( Safeness.Unsafe ); UT_TRUE ( aLock.ToString().StartsWith("Unlocked") ); UT_TRUE ( aLock.ToString().Contains ("Unsafe") ); aLock.SetSafeness( Safeness.Safe ); UT_TRUE ( !aLock.ToString().Contains ("Unsafe") ); aLock.SetSafeness( Safeness.Unsafe ); UT_TRUE ( aLock.ToString().StartsWith("Unlocked") ); UT_TRUE ( aLock.ToString().Contains ("Unsafe") ); aLock.Acquire(); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); aLock.Release(); UT_TRUE ( aLock.ToString().StartsWith("Unlocked") ); UT_TRUE ( aLock.ToString().Contains ("Unsafe") ); // unsafe aLock.Acquire(); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); Log.Info("One warning should come now: "); aLock.SetSafeness( Safeness.Safe ); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); UT_TRUE ( aLock.ToString().Contains ("Unsafe") ); // safe (new lock) aLock= new ThreadLock(); aLock.Acquire(); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); UT_TRUE ( !aLock.ToString().Contains ("Unsafe") ); Log.Info("One warning should come now: "); aLock.SetSafeness( Safeness.Unsafe ); UT_TRUE ( !aLock.ToString().StartsWith("null") ); UT_TRUE ( !aLock.ToString().Contains ("Unsafe") ); // test warnings (10) locks: aLock= new ThreadLock(); Log.Info("Two warnings should come now: "); for (int i= 0; i<20; i++) aLock.Acquire(); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); for (int i= 0; i<20; i++) aLock.Release(); UT_TRUE ( aLock.ToString().StartsWith("Unlocked") ); // test a non-recursive lock aLock= new ThreadLock( LockMode.SingleLocks ); aLock.Acquire(); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); aLock.Acquire(); UT_TRUE ( aLock.ToString().StartsWith("Locked") ); aLock.Release(); UT_TRUE ( aLock.ToString().StartsWith("Unlocked") ); Log.Info("One warning should come now: "); aLock.Release(); UT_TRUE ( aLock.ToString().StartsWith("Unlocked") ); Report.GetDefault().PopHaltFlags(); }
public void ThreadLock_SpeedTest() { UT_INIT(); Log.SetVerbosity( new ConsoleLogger(), Verbosity.Verbose, "/" ); Log.MapThreadName( "UnitTest" ); Log.SetDomain( "TestTLock", Scope.Method ); ThreadLock aLock= new ThreadLock(); int repeats= 100000; int rrepeats= 5; Ticks stopwatch= new Ticks(); for ( int r= 0; r < rrepeats; r ++) { Log.Info("Run " + rrepeats ); aLock.SetSafeness( Safeness.Unsafe ); stopwatch.Set(); for ( int i= 0; i < repeats; i++ ) { aLock.Acquire(); aLock.Release(); } long time= stopwatch.Age().InMillis(); Log.Info("Safe mode, " + repeats + " lock/unlock ops: " + time + " ms" ); aLock.SetSafeness( Safeness.Safe ); stopwatch.Set(); for ( int i= 0; i < repeats; i++ ) { //aLock.acquire(); //aLock.release(); // in java, adding the following two loops, results in similar execution speed for ( int tt= 0; tt < 70; tt++ ) i+= tt; for ( int tt= 0; tt < 70; tt++ ) i-= tt; } time= stopwatch.Age().InMillis(); Log.Info("Unsafe mode, " + repeats + " lock/unlock ops: " + time + " ms" ); } }