void BreakpointManager::UninstallTemporaryBreakpoint(target_addr_t address, BreakpointClient* client) { AutoLocker<BLocker> installLocker(fLock); AutoLocker<Team> teamLocker(fTeam); Breakpoint* breakpoint = fTeam->BreakpointAtAddress(address); if (breakpoint == NULL) return; // remove the client breakpoint->RemoveClient(client); // check whether the breakpoint needs to be uninstalled bool uninstall = !breakpoint->ShouldBeInstalled() && breakpoint->IsInstalled(); // if unused remove it BReference<Breakpoint> breakpointReference(breakpoint); if (breakpoint->IsUnused()) fTeam->RemoveBreakpoint(breakpoint); teamLocker.Unlock(); if (uninstall) { fDebuggerInterface->UninstallBreakpoint(address); breakpoint->SetInstalled(false); } }
status_t BreakpointManager::InstallTemporaryBreakpoint(target_addr_t address, BreakpointClient* client) { AutoLocker<BLocker> installLocker(fLock); AutoLocker<Team> teamLocker(fTeam); // create a breakpoint, if it doesn't exist yet Breakpoint* breakpoint = fTeam->BreakpointAtAddress(address); if (breakpoint == NULL) { Image* image = fTeam->ImageByAddress(address); if (image == NULL) return B_BAD_ADDRESS; breakpoint = new(std::nothrow) Breakpoint(image, address); if (breakpoint == NULL) return B_NO_MEMORY; if (!fTeam->AddBreakpoint(breakpoint)) return B_NO_MEMORY; } BReference<Breakpoint> breakpointReference(breakpoint); // add the client status_t error; if (breakpoint->AddClient(client)) { if (breakpoint->IsInstalled()) return B_OK; // install teamLocker.Unlock(); error = fDebuggerInterface->InstallBreakpoint(address); if (error == B_OK) { breakpoint->SetInstalled(true); return B_OK; } teamLocker.Lock(); breakpoint->RemoveClient(client); } else error = B_NO_MEMORY; // clean up on error if (breakpoint->IsUnused()) fTeam->RemoveBreakpoint(breakpoint); return error; }