[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-dev] Deadlock on launch due to CBreakpointManager
|
Before I go creating a new bug report I was hoping to get some
opinions on the following deadlock. I'm not running HEAD so I can't
guarantee it'll occur for everybody, but the code (HEAD) seems to
still suffer.
To reproduce try:
- clear workspace
- new managed make project with autobuild
- create a new file in project, add code and save
- add breakpoint
- create launch with stop on main
- run launch
Thread 1:
AutoBuildJob (owns workspace job queue) -> ... ->
BreakpointManager.resourceChanged(...) ->
CBreakpointManager.breakpointsChanged(...)
public void breakpointsChanged( IBreakpoint[] breakpoints,
IMarkerDelta[] deltas ) {
ArrayList removeList = new ArrayList( breakpoints.length );
ArrayList installList = new ArrayList( breakpoints.length );
synchronized ( getBreakpointMap() ) { ###### Waiting for map
to become free ####
Thread 2:
EventManager -> CBreakpointManager.handleDebugEvents(...) ->
handleBreakpointCreatedEvent(...) ->
doHandleLocationBreakpointCreatedEvent(...)
private void doHandleLocationBreakpointCreatedEvent
( ICDILocationBreakpoint cdiBreakpoint ) {
if ( cdiBreakpoint.isTemporary() )
return;
ICBreakpoint breakpoint = null;
synchronized( getBreakpointMap() ) { ####### Has lock on map
#######
breakpoint = getBreakpointMap().getCBreakpoint( cdiBreakpoint );
if ( breakpoint == null ) {
breakpoint = createLocationBreakpoint( cdiBreakpoint ); #######
Requires job to execute on workspace job queue #####
}
if ( breakpoint != null )
getBreakpointMap().put( breakpoint, cdiBreakpoint );
}
public CBreakpoint( final IResource resource, final String
markerType, final Map attributes, final boolean add ) throws
CoreException {
this();
IWorkspaceRunnable wr = new IWorkspaceRunnable() {
public void run( IProgressMonitor monitor ) throws CoreException {
// create the marker
setMarker( resource.createMarker( markerType ) );
// set attributes
ensureMarker().setAttributes( attributes );
//set the marker message
setAttribute( IMarker.MESSAGE, getMarkerMessage() );
// add to breakpoint manager if requested
register( add );
}
};
run( wr ); ##### Cannot execute due to AutoBuildJob waiting
to complete ##########
}
I'm not sure if having a job queued inside the synchronise is a good
idea, for this exact reason. Any comments are much appreciated.
Ryan Hapgood,
HI-TECH Software