fix(accessibility): stabilize inactive backend benchmark timing

- expose whether native backend initialization has completed
  - distinguish completed initialization from backend availability
  - wait up to one second for asynchronous initialization in benchmark mode
  - exclude AT-SPI registration activity from notification timing
  - report backend readiness latency in benchmark results
  - verify disabled backends complete initialization immediately
This commit is contained in:
Martín Lucas Golini
2026-09-16 21:05:20 -03:00
parent 7866c27381
commit 75ebe22a02
7 changed files with 28 additions and 1 deletions
@@ -43,6 +43,8 @@ class EE_API AccessibilityManager {
bool isBackendAvailable() const;
bool isBackendInitializationComplete() const;
bool hasActiveNativeClients() const;
/** Updates the scene's cached fast-path flag after an actual native accessibility query. */
@@ -47,6 +47,7 @@ def run_sample(args, disabled):
result = json.loads(completed.stdout)
result["wall_ms"] = wall_ms
result["initialization_ms"] = result.pop("initialization_us") / 1000
result["readiness_ms"] = result.pop("readiness_us") / 1000
result["notifications_ms"] = result.pop("notifications_us") / 1000
return result
@@ -14,6 +14,8 @@ class AccessibilityBackend {
virtual bool isAvailable() const = 0;
virtual bool isInitializationComplete() const { return true; }
virtual bool hasActiveClients() const { return false; }
virtual void update() {}
@@ -302,6 +302,8 @@ class AtSpiApplication final : public std::enable_shared_from_this<AtSpiApplicat
return mInitialized.load( std::memory_order_acquire ) && mConnection != nullptr;
}
bool isInitialized() const { return mInitialized.load( std::memory_order_acquire ); }
bool hasActiveClients() const { return mHasActiveClients.load( std::memory_order_acquire ); }
void update() {
@@ -1587,6 +1589,10 @@ class AtSpiAccessibilityBackend final : public AccessibilityBackend {
bool isAvailable() const { return mApplication && mApplication->isAvailable(); }
bool isInitializationComplete() const override {
return mApplication && mApplication->isInitialized();
}
bool hasActiveClients() const { return mApplication && mApplication->hasActiveClients(); }
void update() {
@@ -261,6 +261,10 @@ bool AccessibilityManager::isBackendAvailable() const {
return mBackend && mBackend->isAvailable();
}
bool AccessibilityManager::isBackendInitializationComplete() const {
return mBackend && mBackend->isInitializationComplete();
}
bool AccessibilityManager::hasActiveNativeClients() const {
return mBackend && mBackend->hasActiveClients();
}
@@ -104,14 +104,25 @@ EE_MAIN_FUNC int main( int argc, char** argv ) {
auto status = content->find<UITextView>( "status" );
if ( benchmarkInactive ) {
auto manager = scene->getAccessibilityManager();
Clock clock;
scene->getAccessibilityManager()->update();
manager->update();
const auto initializationUs = clock.getElapsedTime().asMicroseconds();
clock.restart();
if ( !std::getenv( "EEPP_DISABLE_ACCESSIBILITY" ) ) {
while ( !manager->isBackendInitializationComplete() &&
clock.getElapsedTime() < Seconds( 1 ) ) {
Sys::sleep( Milliseconds( 1 ) );
manager->update();
}
}
const auto readinessUs = clock.getElapsedTime().asMicroseconds();
clock.restart();
for ( size_t i = 0; i < benchmarkIterations; ++i )
status->setText( i & 1 ? "Ready" : "Idle" );
const auto notificationsUs = clock.getElapsedTime().asMicroseconds();
std::cout << "{\"initialization_us\":" << initializationUs
<< ",\"readiness_us\":" << readinessUs
<< ",\"iterations\":" << benchmarkIterations
<< ",\"notifications_us\":" << notificationsUs << "}\n";
return EXIT_SUCCESS;
@@ -210,6 +210,7 @@ UTEST( UIApplication, CreatesSecondaryWindowWithoutChangingAmbientScene ) {
nullptr );
app.getUI()->getAccessibilityManager()->update();
EXPECT_FALSE( app.getUI()->getAccessibilityManager()->isBackendAvailable() );
EXPECT_TRUE( app.getUI()->getAccessibilityManager()->isBackendInitializationComplete() );
EXPECT_EQ( PixelDensity::getPixelDensity(), 1.5f );
ASSERT_TRUE( app.getUI()->getUIIconThemeManager()->getCurrentTheme() != nullptr );
EXPECT_TRUE( app.getUI()->getUIIconThemeManager()->findIcon( "go-up" ) != nullptr );