/** * Sets up row corresponding to Ready DA in the configurator composite. * * @param composite to layout the ready dependence configuration widgets. * @pre composite != null */ private void setupReadyDepUI(final Composite composite) { final SlicerConfiguration _cfg = (SlicerConfiguration) configuration; final RowLayout _rowLayout1 = new RowLayout(SWT.VERTICAL); composite.setLayout(_rowLayout1); final Composite _readyComposite1 = new Composite(composite, SWT.NONE); final GridLayout _gridLayout2 = new GridLayout(); _gridLayout2.numColumns = 2; _readyComposite1.setLayout(_gridLayout2); final Button _useRDAButton = new Button(_readyComposite1, SWT.CHECK); _useRDAButton.setText("use ready dependence"); _useRDAButton.setToolTipText("Use ready dependence in calculation of the slice."); _useRDAButton.setSelection(_cfg.isReadyDepAnalysisUsed()); _useRDAButton.addSelectionListener( new BooleanPropertySelectionListener(SlicerConfiguration.USE_READYDA, _useRDAButton, _cfg)); // Sets up the composite and buttons pertaining to precision control. final Group _precisionOfRDAGroup = new Group(composite, SWT.SHADOW_ETCHED_IN); final GridLayout _gridLayout3 = new GridLayout(); _gridLayout3.numColumns = 2; _precisionOfRDAGroup.setLayout(_gridLayout3); _precisionOfRDAGroup.setText("Precision of Ready dependence"); final Group _precisionGroup = new Group(_precisionOfRDAGroup, SWT.SHADOW_ETCHED_IN); final GridLayout _gridLayout4 = new GridLayout(); _gridLayout4.numColumns = 1; _precisionGroup.setLayout(_gridLayout4); _precisionGroup.setText("Sort of analysis to be used."); _precisionGroup.setToolTipText( "Controls the precision via properties inherent to interference."); // Sets up the buttons that control the nature of ready dependence. final Button _typedRDA = new Button(_precisionGroup, SWT.RADIO); _typedRDA.setText("use type-based analysis"); _typedRDA.setToolTipText("Only primaries of compatible types will be considered"); final Button _equivalenceClassBasedEscapeAnalysisBasedRDA = new Button(_precisionGroup, SWT.RADIO); _equivalenceClassBasedEscapeAnalysisBasedRDA.setText( "use equivalence class-based escape analysis"); _equivalenceClassBasedEscapeAnalysisBasedRDA.setToolTipText( "Only primaries belonging to the same equivalence class will be considered."); final Button _symbolBasedEscapeAnalysisBasedRDA = new Button(_precisionGroup, SWT.RADIO); _symbolBasedEscapeAnalysisBasedRDA.setText( "use sybmolic and equivalence class-based escape analysis"); _symbolBasedEscapeAnalysisBasedRDA.setToolTipText( "Only symbolically equivalent primaries that belong to the same equivalence class will be considered."); SelectionListener _sl = new SelectionListener() { public void widgetSelected(final SelectionEvent evt) { Object _value = null; if (evt.widget == _equivalenceClassBasedEscapeAnalysisBasedRDA) { _value = SlicerConfiguration.EQUIVALENCE_CLASS_BASED_INFO; } else if (evt.widget == _symbolBasedEscapeAnalysisBasedRDA) { _value = SlicerConfiguration.SYMBOL_AND_EQUIVCLS_BASED_INFO; } else if (evt.widget == _typedRDA) { _value = SlicerConfiguration.TYPE_BASED_INFO; } if (_value != null) { _cfg.setProperty(SlicerConfiguration.NATURE_OF_READY_DA, _value); } } public void widgetDefaultSelected(final SelectionEvent evt) { widgetSelected(evt); } }; _equivalenceClassBasedEscapeAnalysisBasedRDA.addSelectionListener(_sl); _symbolBasedEscapeAnalysisBasedRDA.addSelectionListener(_sl); _typedRDA.addSelectionListener(_sl); final Object _temp = _cfg.getProperty(SlicerConfiguration.NATURE_OF_READY_DA); if (_temp == null || _temp.equals(SlicerConfiguration.SYMBOL_AND_EQUIVCLS_BASED_INFO)) { _symbolBasedEscapeAnalysisBasedRDA.setSelection(true); } else if (_temp.equals(SlicerConfiguration.EQUIVALENCE_CLASS_BASED_INFO)) { _equivalenceClassBasedEscapeAnalysisBasedRDA.setSelection(true); } else if (_temp.equals(SlicerConfiguration.TYPE_BASED_INFO)) { _typedRDA.setSelection(true); } // Sets up the buttons that control what auxiliary analysis are used improve precision. final Composite _analysisComposite = new Composite(_precisionOfRDAGroup, SWT.NONE); final RowLayout _rowLayout = new RowLayout(); _rowLayout.type = SWT.VERTICAL; _analysisComposite.setLayout(_rowLayout); final GridData _analysisCompositeGridData = new GridData(GridData.FILL_HORIZONTAL); _analysisCompositeGridData.verticalAlignment = SWT.TOP; _analysisComposite.setLayoutData(_analysisCompositeGridData); final Button _useOFAForReady = new Button(_analysisComposite, SWT.CHECK); _useOFAForReady.setText("use object flow analysis information"); _useOFAForReady.setToolTipText("Only aliasing primaries will be considered"); _useOFAForReady.setSelection(_cfg.isOFAUsedForReady()); _useOFAForReady.addSelectionListener( new BooleanPropertySelectionListener( SlicerConfiguration.USE_OFA_FOR_READY_DA, _useOFAForReady, _cfg)); final Button _useSLAForReady = new Button(_analysisComposite, SWT.CHECK); _useSLAForReady.setText("use safe lock analysis "); _useSLAForReady.setToolTipText("Safe locks will not considered"); _useSLAForReady.setSelection(_cfg.isSafeLockAnalysisUsedForReady()); _useSLAForReady.addSelectionListener( new BooleanPropertySelectionListener( SlicerConfiguration.USE_SLA_FOR_READY_DA, _useSLAForReady, _cfg)); final Button _useCallSiteSensitiveReady = new Button(_analysisComposite, SWT.CHECK); _useCallSiteSensitiveReady.setText("blocking call-site aware"); _useCallSiteSensitiveReady.setToolTipText( "Calls leading to blocking will be considered as blocking as well."); _useCallSiteSensitiveReady.setSelection(_cfg.isCallSiteSensitiveReadyUsed()); _useCallSiteSensitiveReady.addSelectionListener( new BooleanPropertySelectionListener( SlicerConfiguration.CALL_SITE_SENSITIVE_READY_DA, _useCallSiteSensitiveReady, _cfg)); // Sets up the buttons that control what rules of ready dependence analysis are used. final Group _natureOfRDAGroup = new Group(composite, SWT.SHADOW_ETCHED_IN); final GridLayout _gridLayout5 = new GridLayout(); _gridLayout5.numColumns = 2; _natureOfRDAGroup.setLayout(_gridLayout5); _natureOfRDAGroup.setText("Nature of Ready dependence"); final Button _rule1RDAButton = new Button(_natureOfRDAGroup, SWT.CHECK); _rule1RDAButton.setText("use rule 1 of ready dependence"); _rule1RDAButton.setToolTipText( "Intra-thread intra-procedural monitor acquisition based ready dependence"); _rule1RDAButton.setSelection(_cfg.isReadyRule1Used()); _rule1RDAButton.addSelectionListener( new BooleanPropertySelectionListener( SlicerConfiguration.USE_RULE1_IN_READYDA, _rule1RDAButton, _cfg)); final Button _rule2RDAButton = new Button(_natureOfRDAGroup, SWT.CHECK); _rule2RDAButton.setText("use rule 2 of ready dependence"); _rule2RDAButton.setToolTipText("Inter-thread monitor acquisition ready dependence"); _rule2RDAButton.setSelection(_cfg.isReadyRule2Used()); _rule2RDAButton.addSelectionListener( new BooleanPropertySelectionListener( SlicerConfiguration.USE_RULE2_IN_READYDA, _rule2RDAButton, _cfg)); final Button _rule3RDAButton = new Button(_natureOfRDAGroup, SWT.CHECK); _rule3RDAButton.setText("use rule 3 of ready dependence"); _rule3RDAButton.setToolTipText( "Intra-thread intra-procedural Object.wait() based ready dependence"); _rule3RDAButton.setSelection(_cfg.isReadyRule3Used()); _rule3RDAButton.addSelectionListener( new BooleanPropertySelectionListener( SlicerConfiguration.USE_RULE3_IN_READYDA, _rule3RDAButton, _cfg)); final Button _rule4RDAButton = new Button(_natureOfRDAGroup, SWT.CHECK); _rule4RDAButton.setText("use rule 4 of ready dependence"); _rule4RDAButton.setToolTipText("Inter-thread Object.wait() based ready dependence"); _rule4RDAButton.setSelection(_cfg.isReadyRule4Used()); _rule4RDAButton.addSelectionListener( new BooleanPropertySelectionListener( SlicerConfiguration.USE_RULE4_IN_READYDA, _rule4RDAButton, _cfg)); // Links up the buttons via selection listener to control toggling based on the user's decision // to use ready DA. _useRDAButton.addSelectionListener( new SelectionListener() { public void widgetSelected(@SuppressWarnings("unused") final SelectionEvent evt) { boolean _val = false; if (_useRDAButton.getSelection()) { _val = true; } _precisionGroup.setEnabled(_val); _precisionOfRDAGroup.setEnabled(_val); _equivalenceClassBasedEscapeAnalysisBasedRDA.setEnabled(_val); _typedRDA.setEnabled(_val); _useOFAForReady.setEnabled(_val); _useSLAForReady.setEnabled(_val); _useCallSiteSensitiveReady.setEnabled(_val); _symbolBasedEscapeAnalysisBasedRDA.setEnabled(_val); _rule1RDAButton.setEnabled(_val); _rule2RDAButton.setEnabled(_val); _rule3RDAButton.setEnabled(_val); _rule4RDAButton.setEnabled(_val); } public void widgetDefaultSelected(final SelectionEvent evt) { widgetSelected(evt); } }); _useRDAButton.setSelection(_cfg.isInterferenceDepAnalysisUsed()); _useRDAButton.notifyListeners(SWT.Selection, null); }