assert refcount never climbs after reaching 0

Looking for a common but not-yet-reproducible situation where the
gamelock gets stuck preventing a game from being opened, usually related
to a move arriving. One thing that looked wrong is it seemed possible to
have the refcount drop to 0 then get increased again, causing somebody
to thing he has a lock when it's actually unlocked. So assert to try to
catch that case (and synchronize to make it much harder.)
This commit is contained in:
Eric House 2019-05-29 15:51:09 -07:00
parent b50bc145af
commit ce26696a37
2 changed files with 19 additions and 8 deletions

View file

@ -40,6 +40,14 @@ public class Assert {
}
}
// NR: non-release
public static void assertTrueNR( boolean val )
{
if ( BuildConfig.DEBUG || !BuildConfig.IS_TAGGED_BUILD ) {
assertTrue( val );
}
}
public static void assertNotNull( Object val )
{
assertTrue( val != null );

View file

@ -23,12 +23,10 @@ package org.eehouse.android.xw4;
import android.os.Handler;
import java.io.Serializable;
import java.lang.ref.WeakReference;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.concurrent.atomic.AtomicInteger;
import android.support.annotation.NonNull;
@ -59,7 +57,7 @@ public class GameLock implements AutoCloseable, Serializable {
// private static final long ASSERT_TIME = 2000;
private static final long THROW_TIME = 1000;
private long m_rowid;
private AtomicInteger m_lockCount = new AtomicInteger(1);
private int[] m_lockCount = {1};
private static class Owner {
Thread mThread;
@ -324,16 +322,21 @@ public class GameLock implements AutoCloseable, Serializable {
public void release()
{
int count = m_lockCount.decrementAndGet();
if ( count == 0 ) {
getFor( m_rowid ).unlock();
synchronized ( m_lockCount ) {
int count = --m_lockCount[0];
if ( count == 0 ) {
getFor( m_rowid ).unlock();
}
}
}
public GameLock retain()
{
int count = m_lockCount.incrementAndGet();
return this;
synchronized ( m_lockCount ) {
int count = m_lockCount[0]++;
Assert.assertTrueNR( count > 0 );
return this;
}
}
@Override