don't dispose gi before game

gathering players was failing because disposed gi was pointing at
garbage. I'm lucky it didn't segfault.
This commit is contained in:
Eric House 2020-10-23 16:37:28 -07:00
parent e7a63c7c0b
commit 5d4fd0e58b
7 changed files with 22 additions and 12 deletions

View file

@ -316,6 +316,7 @@ public class MQTTUtils extends Thread implements IMqttActionListener, MqttCallba
params.put( "myNow", now ); params.put( "myNow", now );
params.put( "loc", LocUtils.getCurLocale( mContext ) ); params.put( "loc", LocUtils.getCurLocale( mContext ) );
params.put( "tmpKey", getTmpKey(mContext) ); params.put( "tmpKey", getTmpKey(mContext) );
params.put( "frstV", Utils.getFirstVersion( mContext ) );
String fcmid = FBMService.getFCMDevID( mContext ); String fcmid = FBMService.getFCMDevID( mContext );
if ( null != fcmid ) { if ( null != fcmid ) {

View file

@ -799,6 +799,16 @@ public class Utils {
} }
} }
static int getFirstVersion( Context context )
{
SharedPreferences prefs =
context.getSharedPreferences( HIDDEN_PREFS,
Context.MODE_PRIVATE );
int firstVersion = prefs.getInt( FIRST_VERSION_KEY, Integer.MAX_VALUE );
Assert.assertTrueNR( firstVersion < Integer.MAX_VALUE );
return firstVersion;
}
private static void setFirstBootStatics( Context context ) private static void setFirstBootStatics( Context context )
{ {
if ( null == s_isFirstBootThisVersion ) { if ( null == s_isFirstBootThisVersion ) {

View file

@ -882,8 +882,8 @@ Java_org_eehouse_android_xw4_jni_XwJNI_gi_1from_1stream
XWStreamCtxt* stream = streamFromJStream( MPPARM(mpool) env, XWStreamCtxt* stream = streamFromJStream( MPPARM(mpool) env,
globalState->vtMgr, jstream ); globalState->vtMgr, jstream );
CurGameInfo gi; CurGameInfo gi = {0};
XP_MEMSET( &gi, 0, sizeof(gi) ); // XP_MEMSET( &gi, 0, sizeof(gi) );
if ( game_makeFromStream( MPPARM(mpool) env, stream, NULL, if ( game_makeFromStream( MPPARM(mpool) env, stream, NULL,
&gi, NULL, NULL, NULL, NULL, NULL, NULL ) ) { &gi, NULL, NULL, NULL, NULL, NULL, NULL ) ) {
setJGI( env, jgi, &gi ); setJGI( env, jgi, &gi );
@ -910,7 +910,6 @@ Java_org_eehouse_android_xw4_jni_XwJNI_nli_1to_1stream
jbyteArray result; jbyteArray result;
NetLaunchInfo nli = {0}; NetLaunchInfo nli = {0};
loadNLI( env, &nli, jnli ); loadNLI( env, &nli, jnli );
/* CurGameInfo* gi = makeGI( MPPARM(mpool) env, jgi ); */
XWStreamCtxt* stream = mem_stream_make( MPPARM(mpool) globalState->vtMgr, XWStreamCtxt* stream = mem_stream_make( MPPARM(mpool) globalState->vtMgr,
NULL, 0, NULL ); NULL, 0, NULL );
@ -1412,9 +1411,9 @@ JNIEXPORT void JNICALL Java_org_eehouse_android_xw4_jni_XwJNI_game_1dispose
#endif #endif
AndGameGlobals* globals = &state->globals; AndGameGlobals* globals = &state->globals;
destroyGI( MPPARM(mpool) &globals->gi );
game_dispose( &state->game, env ); game_dispose( &state->game, env );
/* Must happen after game_dispose, which uses it */
destroyGI( MPPARM(mpool) &globals->gi );
destroyDraw( &globals->dctx, env ); destroyDraw( &globals->dctx, env );
destroyXportProcs( &globals->xportProcs, env ); destroyXportProcs( &globals->xportProcs, env );

View file

@ -879,7 +879,7 @@ board_canHint( const BoardCtxt* board )
&& 0 < model_getNumTilesTotal( board->model, board->selPlayer ) && 0 < model_getNumTilesTotal( board->model, board->selPlayer )
&& ! board->pti[board->selPlayer].tradeInProgress; && ! board->pti[board->selPlayer].tradeInProgress;
if ( canHint ) { if ( canHint ) {
LocalPlayer* lp = &board->gi->players[board->selPlayer]; const LocalPlayer* lp = &board->gi->players[board->selPlayer];
canHint = lp->isLocal && !LP_IS_ROBOT(lp); canHint = lp->isLocal && !LP_IS_ROBOT(lp);
} }
return canHint; return canHint;

View file

@ -1650,7 +1650,7 @@ resendImpl( CommsCtxt* comms, XWEnv xwe, CommsConnType filter, XP_Bool force,
XP_U32 now = dutil_getCurSeconds( comms->dutil, xwe ); XP_U32 now = dutil_getCurSeconds( comms->dutil, xwe );
if ( !force && (now < comms->nextResend) ) { if ( !force && (now < comms->nextResend) ) {
XP_LOGF( "%s: aborting: %d seconds left in backoff", __func__, XP_LOGFF( "aborting: %d seconds left in backoff",
comms->nextResend - now ); comms->nextResend - now );
success = XP_FALSE; success = XP_FALSE;
@ -1868,7 +1868,7 @@ relayPreProcess( CommsCtxt* comms, XWEnv xwe, XWStreamCtxt* stream, XWHostID* se
/* nothing for us to do here if not using relay */ /* nothing for us to do here if not using relay */
XWRELAY_Cmd cmd = stream_getU8( stream ); XWRELAY_Cmd cmd = stream_getU8( stream );
XP_LOGF( "%s(%s)", __func__, relayCmdToStr( cmd ) ); XP_LOGFF( "(%s)", relayCmdToStr( cmd ) );
switch( cmd ) { switch( cmd ) {
case XWRELAY_CONNECT_RESP: case XWRELAY_CONNECT_RESP:
@ -2017,7 +2017,7 @@ relayPreProcess( CommsCtxt* comms, XWEnv xwe, XWStreamCtxt* stream, XWHostID* se
XP_LOGF( "%s: dropping relay msg with cmd %d", __func__, (XP_U16)cmd ); XP_LOGF( "%s: dropping relay msg with cmd %d", __func__, (XP_U16)cmd );
} }
LOG_RETURNF( "%s", boolToStr(consumed) ); LOG_RETURNF( "consumed=%s", boolToStr(consumed) );
return consumed; return consumed;
} /* relayPreProcess */ } /* relayPreProcess */
#endif #endif
@ -2065,7 +2065,7 @@ preProcess( CommsCtxt* comms, XWEnv xwe, const CommsAddrRec* useAddr,
/* There should be exactly one type associated with an incoming message */ /* There should be exactly one type associated with an incoming message */
CommsConnType typ = addr_getType( useAddr ); CommsConnType typ = addr_getType( useAddr );
XP_LOGF( "%s(typ=%s)", __func__, ConnType2Str(typ) ); XP_LOGFF( "(typ=%s)", ConnType2Str(typ) );
switch ( typ ) { switch ( typ ) {
#ifdef XWFEATURE_RELAY #ifdef XWFEATURE_RELAY
@ -2611,6 +2611,7 @@ comms_gatherPlayers( CommsCtxt* comms, XWEnv xwe, XP_U32 created )
comms_getAddrs( comms, NULL, addrs, &nRecs ); comms_getAddrs( comms, NULL, addrs, &nRecs );
const CurGameInfo* gi = comms->util->gameInfo; const CurGameInfo* gi = comms->util->gameInfo;
XP_ASSERT( 0 < gi->nPlayers );
if ( kplr_addAddrs( comms->dutil, xwe, gi, addrs, nRecs, created ) ) { if ( kplr_addAddrs( comms->dutil, xwe, gi, addrs, nRecs, created ) ) {
if ( 1 ) { if ( 1 ) {
XP_LOGFF( "not setting flag :-)" ); XP_LOGFF( "not setting flag :-)" );

View file

@ -117,7 +117,6 @@ static const XP_UCHAR*
figureNameFor( XP_U16 posn, const CurGameInfo* gi ) figureNameFor( XP_U16 posn, const CurGameInfo* gi )
{ {
const XP_UCHAR* result = NULL; const XP_UCHAR* result = NULL;
// int nthRemote = 0;
for ( int ii = 0, nthRemote = 0; for ( int ii = 0, nthRemote = 0;
NULL == result && ii < gi->nPlayers; NULL == result && ii < gi->nPlayers;
++ii ) { ++ii ) {

View file

@ -247,7 +247,7 @@ drawScoreBoard( BoardCtxt* board, XWEnv xwe )
totalDim = 0; totalDim = 0;
XP_U16 missingPlayers = server_getMissingPlayers( board->server ); XP_U16 missingPlayers = server_getMissingPlayers( board->server );
for ( dp = datum, ii = 0; ii < nPlayers; ++ii, ++dp ) { for ( dp = datum, ii = 0; ii < nPlayers; ++ii, ++dp ) {
LocalPlayer* lp = &board->gi->players[ii]; const LocalPlayer* lp = &board->gi->players[ii];
XP_Bool isMissing = 0 != ((1 << ii) & missingPlayers); XP_Bool isMissing = 0 != ((1 << ii) & missingPlayers);
/* This is a hack! */ /* This is a hack! */