Changeset b9680b for src


Ignore:
Timestamp:
Aug 5, 2015, 5:32:10 PM (9 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
cc2976
Parents:
f02b53
git-author:
Frederik Heber <heber@…> (07/16/15 08:29:09)
git-committer:
Frederik Heber <heber@…> (08/05/15 17:32:10)
Message:

FIX: Fixing "pure virtual function called" in QtMoleculeItem.

  • as a matter of fact this should not be a problem: Inside QtMoleculeItem's dstor body while signing off from the channels, it is no problem to receive a notification for a channel we have not signed off yet. The vtable has not been touched with respect to QtMoleculeItem. I really do not understand this issue. I have tried to reproduce it with a few mock classes that have the very same inheritance pattern and used locks to force the same case of a virtual function being called while inside the dstor's body but it does not reproduce the error.
  • the same holds for the cstor and again the vtable is created before the code pointer enters the cstor body, hence it should be no problem ...
  • the solution is to signOn..() and signOff..() on the highest level, i.e. on the most derived classes. This causes some code duplication but at least it works.
Location:
src/UIElements/Views/Qt4/MoleculeList
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.cpp

    rf02b53 rb9680b  
    6565  emitDirtyState(_emitDirtyState)
    6666{
    67   signOnToMolecule();
     67  // BUG: We cannot sign on here as then and again we catch "pure virtual function called"
     68  // this makes no sense as both the Observer part (which also has a recievedNotification())
     69  // nor QtMoleculeItem's vtable have been fully created.
     70//  signOnToMolecule();
    6871  setFlags(flags() | Qt::ItemIsSelectable);
    6972}
     
    9396QtMoleculeItem::~QtMoleculeItem()
    9497{
    95   signOffFromMolecule();
     98  // BUG: We cannot sign off here as then and again we catch "pure virtual function called"
     99  // this makes no sense as neither the Observer part (which also has a recievedNotification())
     100  // nor QtMoleculeItem's vtable have yet been destroyed.
     101//  signOffFromMolecule();
    96102}
    97103
  • src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp

    rf02b53 rb9680b  
    9393  void subjectKilled(Observable *publisher);
    9494
     95protected:
    9596  void signOnToMolecule();
    9697  void signOffFromMolecule();
  • src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_atomcount.hpp

    rf02b53 rb9680b  
    4444            channellist_atomcount)
    4545  {
     46    signOnToMolecule();
    4647    // cannot call pure virtual function in QtMoleculeItem's cstor
    4748    internal_updateState();
     49  }
     50
     51  ~QtMoleculeItem_atomcount()
     52  {
     53    signOffFromMolecule();
    4854  }
    4955
  • src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_formula.hpp

    rf02b53 rb9680b  
    4747            channellist_formula)
    4848  {
     49    signOnToMolecule();
    4950    // cannot call pure virtual function in QtMoleculeItem's cstor
    5051    internal_updateState();
     52  }
     53
     54  ~QtMoleculeItem_formula()
     55  {
     56    signOffFromMolecule();
    5157  }
    5258
  • src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_name.hpp

    rf02b53 rb9680b  
    4444            channellist_name)
    4545  {
     46    signOnToMolecule();
    4647    // cannot call pure virtual function in QtMoleculeItem's cstor
    4748    internal_updateState();
     49  }
     50
     51  ~QtMoleculeItem_name()
     52  {
     53    signOffFromMolecule();
    4854  }
    4955
  • src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_occurrence.hpp

    rf02b53 rb9680b  
    3131        QtMoleculeItem(_molid, channellist_occurrence, QtMoleculeItem::DoesNotMove, _emitDirtyState)
    3232  {
     33    signOnToMolecule();
    3334    // cannot call pure virtual function in QtMoleculeItem's cstor
    3435    internal_updateState();
     36  }
     37
     38  ~QtMoleculeItem_occurrence()
     39  {
     40    signOffFromMolecule();
    3541  }
    3642
  • src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_visibility.hpp

    rf02b53 rb9680b  
    2929      const moleculeId_t _molid,
    3030      emitDirtyState_t _emitDirtyState) :
    31         QtMoleculeItem(_molid, channellist_visibility, QtMoleculeItem::DoesNotMove, _emitDirtyState)  {
     31        QtMoleculeItem(_molid, channellist_visibility, QtMoleculeItem::DoesNotMove, _emitDirtyState)
     32  {
     33    signOnToMolecule();
    3234    setFlags(flags() | Qt::ItemIsUserCheckable);
    3335    setCheckState(Qt::Unchecked);
    3436    // cannot call pure virtual function in QtMoleculeItem's cstor
    3537    internal_updateState();
     38  }
     39
     40  ~QtMoleculeItem_visibility()
     41  {
     42    signOffFromMolecule();
    3643  }
    3744
Note: See TracChangeset for help on using the changeset viewer.