tryAcquireComputerUseLock method

Future<AcquireResult> tryAcquireComputerUseLock()

Try to acquire the computer-use lock for the current session.

Implementation

Future<AcquireResult> tryAcquireComputerUseLock() async {
  final lock = ComputerUseLock(
    sessionId: _sessionId,
    pid: pid,
    acquiredAt: DateTime.now().millisecondsSinceEpoch,
  );

  await Directory(_configHomeDir).create(recursive: true);

  // Try fresh acquisition
  if (await _tryCreateExclusive(lock)) {
    _registerLockCleanup();
    return AcquireResultAcquired(fresh: true);
  }

  final existing = await _readLock();

  // Corrupt/unparseable — treat as stale
  if (existing == null) {
    try {
      await File(_lockPath).delete();
    } catch (_) {}
    if (await _tryCreateExclusive(lock)) {
      _registerLockCleanup();
      return AcquireResultAcquired(fresh: true);
    }
    final winner = await _readLock();
    return AcquireResultBlocked(by: winner?.sessionId ?? 'unknown');
  }

  // Already held by this session
  if (existing.sessionId == _sessionId) {
    return AcquireResultAcquired(fresh: false);
  }

  // Another live session holds it
  if (_isProcessRunning(existing.pid)) {
    return AcquireResultBlocked(by: existing.sessionId);
  }

  // Stale lock — recover
  _logDebug(
    'Recovering stale computer-use lock from session ${existing.sessionId} (PID ${existing.pid})',
  );
  try {
    await File(_lockPath).delete();
  } catch (_) {}
  if (await _tryCreateExclusive(lock)) {
    _registerLockCleanup();
    return AcquireResultAcquired(fresh: true);
  }
  final winner = await _readLock();
  return AcquireResultBlocked(by: winner?.sessionId ?? 'unknown');
}