cache mqttdevid to avoid lots of calls across jni boundary

This commit is contained in:
Eric House 2024-12-03 21:07:45 -08:00
parent a60451d84c
commit 1a8979c549
2 changed files with 37 additions and 31 deletions

View file

@ -193,46 +193,50 @@ getMQTTDevID( XW_DUtilCtxt* dutil, XWEnv xwe, XP_Bool forceNew, MQTTDevID* devID
*devID = bogusID; *devID = bogusID;
#else #else
/* Use the cached value if present and if we're not forcing new */
MQTTDevID tmp = 0; if ( !dutil->devID || forceNew ) {
XP_U32 len = sizeof(tmp); XP_U32 len = sizeof(dutil->devID);
if ( !forceNew ) { if ( !forceNew ) {
dutil_loadPtr( dutil, xwe, MQTT_DEVID_KEY, &tmp, &len ); dutil_loadPtr( dutil, xwe, MQTT_DEVID_KEY, &dutil->devID, &len );
}
/* XP_LOGFF( "len: %d; sizeof(tmp): %zu", len, sizeof(tmp) ); */
if ( forceNew || len != sizeof(tmp) ) { /* not found, or bogus somehow */
int total = 0;
for ( int ii = 0; ii < NUM_RUNS; ++ii ) {
tmp = XP_RANDOM();
tmp <<= 27;
tmp ^= XP_RANDOM();
tmp <<= 27;
tmp ^= XP_RANDOM();
int count = 0;
MQTTDevID tmp2 = tmp;
while ( 0 != tmp2 ) {
if ( 0 != (1 & tmp2) ) {
++count;
++total;
}
tmp2 >>= 1;
}
XP_LOGFF( "got: %" PRIX64 " (set: %d/%zd)", tmp, count, sizeof(tmp2)*8 );
} }
XP_LOGFF( "average bits set: %d", total / NUM_RUNS );
dutil_storePtr( dutil, xwe, MQTT_DEVID_KEY, &tmp, sizeof(tmp) ); /* XP_LOGFF( "len: %d; sizeof(tmp): %zu", len, sizeof(tmp) ); */
if ( forceNew || len != sizeof(dutil->devID) ) { /* not found, or bogus somehow */
int total = 0;
MQTTDevID tmp;
for ( int ii = 0; ii < NUM_RUNS; ++ii ) {
tmp = XP_RANDOM();
tmp <<= 27;
tmp ^= XP_RANDOM();
tmp <<= 27;
tmp ^= XP_RANDOM();
int count = 0;
MQTTDevID tmp2 = tmp;
while ( 0 != tmp2 ) {
if ( 0 != (1 & tmp2) ) {
++count;
++total;
}
tmp2 >>= 1;
}
XP_LOGFF( "got: %" PRIX64 " (set: %d/%zd)", tmp, count, sizeof(tmp2)*8 );
}
XP_LOGFF( "average bits set: %d", total / NUM_RUNS );
dutil->devID = tmp;
dutil_storePtr( dutil, xwe, MQTT_DEVID_KEY, &dutil->devID, sizeof(dutil->devID) );
}
# ifdef DEBUG # ifdef DEBUG
XP_UCHAR buf[32]; XP_UCHAR buf[32];
formatMQTTDevID( &tmp, buf, VSIZE(buf) ); formatMQTTDevID( &dutil->devID, buf, VSIZE(buf) );
/* This log statement is required by discon_ok2.py!!! (keep in sync) */ /* This log statement is required by discon_ok2.py!!! (keep in sync) */
XP_LOGFF( "generated id: %s; key: %s", buf, MQTT_DEVID_KEY ); XP_LOGFF( "generated id: %s; key: %s", buf, MQTT_DEVID_KEY );
# endif # endif
} }
*devID = tmp; XP_ASSERT( dutil->devID );
*devID = dutil->devID;
#endif #endif
// LOG_RETURNF( MQTTDevID_FMT " key: %s", *devID, MQTT_DEVID_KEY ); // LOG_RETURNF( MQTTDevID_FMT " key: %s", *devID, MQTT_DEVID_KEY );
} }
@ -247,6 +251,7 @@ dvc_getMQTTDevID( XW_DUtilCtxt* dutil, XWEnv xwe, MQTTDevID* devID )
void void
dvc_setMQTTDevID( XW_DUtilCtxt* dutil, XWEnv xwe, const MQTTDevID* devID ) dvc_setMQTTDevID( XW_DUtilCtxt* dutil, XWEnv xwe, const MQTTDevID* devID )
{ {
dutil->devID = *devID;
dutil_storePtr( dutil, xwe, MQTT_DEVID_KEY, devID, sizeof(*devID) ); dutil_storePtr( dutil, xwe, MQTT_DEVID_KEY, devID, sizeof(*devID) );
} }

View file

@ -119,6 +119,7 @@ typedef struct _DUtilVtable {
struct XW_DUtilCtxt { struct XW_DUtilCtxt {
DUtilVtable vtable; DUtilVtable vtable;
MQTTDevID devID;
void* closure; void* closure;
void* devCtxt; /* owned by device.c */ void* devCtxt; /* owned by device.c */
void* statsState; /* owned by stats.c */ void* statsState; /* owned by stats.c */