mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-07 05:24:46 +01:00
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:
parent
b50bc145af
commit
ce26696a37
2 changed files with 19 additions and 8 deletions
|
@ -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 );
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue