Changeset 21b9c3


Ignore:
Timestamp:
Oct 6, 2009, 11:15:50 AM (16 years ago)
Author:
metzler <metzler@…>
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:
be90f1
Parents:
c0917c
Message:

#22 Write a critical exit function

Location:
src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/helpers.cpp

    rc0917c r21b9c3  
    144144};
    145145
     146/**
     147 * Frees all memory registered by the memory observer and calls exit(225) afterwards.
     148 */
     149void performCriticalExit() {
     150  map<void*, size_t> pointers = MemoryUsageObserver::getInstance()->getPointersToAllocatedMemory();
     151  for (map<void*, size_t>::iterator runner = pointers.begin(); runner != pointers.end(); runner++) {
     152    Free(((void**) &runner->first));
     153  }
    146154
     155  exit(255);
     156}
  • src/helpers.hpp

    • Property mode changed from 100755 to 100644
    rc0917c r21b9c3  
    5151void flip(double *x, double *y);
    5252int pot(int base, int n);
    53 //void * Malloc(size_t size, const char* output);
    54 //void * Calloc(size_t size, const char* output);
    55 //void * ReAlloc(void * OldPointer, size_t size, const char* output);
    56 //char* MallocString(size_t size, const char* output);
    57 //void Free(void ** buffer, const char* output);
    5853char *FixedDigitNumber(const int FragmentNumber, const int digits);
    5954bool IsValidNumber( const char *string);
     55static void performCriticalExit();
    6056
    6157/********************************************** helpful template functions *********************************/
  • src/memoryallocator.hpp

    rc0917c r21b9c3  
    111111 * \param pointer to the allocated memory range to free; may be NULL, this function is a no-op then
    112112 */
    113 template <typename X> void Free(X** buffer)
     113template <typename X> void Free(X** buffer, const char *msg = NULL)
    114114{
    115115  if ((buffer == NULL) || (*buffer == NULL))
    116116    return;
    117117
    118   MemoryUsageObserver::getInstance()->removeMemory(*buffer);
     118  MemoryUsageObserver::getInstance()->removeMemory(*buffer, msg);
    119119  free(*buffer);
    120120  *buffer = NULL;
  • src/memoryusageobserver.cpp

    rc0917c r21b9c3  
    7878 * \param pointer to the allocated piece of memory
    7979 */
    80 void MemoryUsageObserver::removeMemory(void* pointer) {
     80void MemoryUsageObserver::removeMemory(void* pointer, const char *msg) {
    8181  map<void*, size_t>::iterator current = memoryUsers.find(pointer);
    8282
    8383  if (current == memoryUsers.end()) {
    8484    cout << "WARNING: There is non-tracked memory to be freed. Pointer "
    85       << pointer << " is not registered by MemoryUsageObserver." << endl;
     85      << pointer << " is not registered by MemoryUsageObserver";
     86    if (msg != NULL)
     87      cout << ": " << msg;
     88    cout << "." << endl;
    8689    return;
    8790  }
     
    104107  return maximumSize;
    105108}
     109
     110/**
     111 * Gets a map with pointers to the currently allocated memory ranges as keys and
     112 * the allocated size as value.
     113 */
     114map<void*, size_t> MemoryUsageObserver::getPointersToAllocatedMemory() {
     115  return memoryUsers;
     116}
  • src/memoryusageobserver.hpp

    rc0917c r21b9c3  
    2828  static void purgeInstance();
    2929  void addMemory(void* pointer, size_t size);
    30   void removeMemory(void* pointer);
     30  void removeMemory(void* pointer, const char *msg = NULL);
    3131  size_t getUsedMemorySize();
    3232  size_t getMaximumUsedMemory();
     33  map<void*, size_t> getPointersToAllocatedMemory();
    3334
    3435protected:
  • src/memoryusageobserverunittest.cpp

    rc0917c r21b9c3  
    1010#include <cppunit/ui/text/TestRunner.h>
    1111
     12#include "memoryallocator.hpp"
    1213#include "memoryusageobserver.hpp"
    1314#include "memoryusageobserverunittest.hpp"
     
    4142void MemoryUsageObserverTest::getInstanceTwiceReturnsSameInstanceTest()
    4243{
    43   int* i = new int;
     44  int* i = Malloc<int>(1, "MemoryUsageObserverTest::getInstanceTwiceReturnsSameInstanceTest - i");
    4445  MemoryUsageObserver::getInstance()->addMemory(i, sizeof(int));
    4546  CPPUNIT_ASSERT_EQUAL(sizeof(int), MemoryUsageObserver::getInstance()->getUsedMemorySize());
     
    5253void MemoryUsageObserverTest::getInstanceAfterPurgeInstanceReturnsNewInstanceTest()
    5354{
    54   int* i = new int;
     55  int* i = Malloc<int>(1, "MemoryUsageObserverTest::getInstanceAfterPurgeInstanceReturnsNewInstanceTest - i");
    5556  MemoryUsageObserver::getInstance()->addMemory(i, sizeof(int));
    5657  CPPUNIT_ASSERT_EQUAL(sizeof(int), MemoryUsageObserver::getInstance()->getUsedMemorySize());
     
    6465void MemoryUsageObserverTest::addAndRemoveMemoryTest()
    6566{
    66   int* i = new int;
     67  int* i = Malloc<int>(1, "MemoryUsageObserverTest::addAndRemoveMemoryTest - i");
    6768  MemoryUsageObserver::getInstance()->addMemory(i, sizeof(int));
    6869  CPPUNIT_ASSERT_EQUAL(sizeof(int), MemoryUsageObserver::getInstance()->getUsedMemorySize());
     
    7677void MemoryUsageObserverTest::removeNonTrackedMemoryDoesNotCauseACrashTest()
    7778{
    78   int* i = new int;
     79  int* i = Malloc<int>(1, "MemoryUsageObserverTest::removeNonTrackedMemoryDoesNotCauseACrashTest - i");
    7980  MemoryUsageObserver::getInstance()->removeMemory(i);
    8081  CPPUNIT_ASSERT_EQUAL((size_t) 0, MemoryUsageObserver::getInstance()->getUsedMemorySize());
     
    8687void MemoryUsageObserverTest::addMemoryTwiceTest()
    8788{
    88   int* i = new int;
    89   int* j = new int;
     89  int* i = Malloc<int>(1, "MemoryUsageObserverTest::addMemoryTwiceTest - i");
     90  int* j = Malloc<int>(1, "MemoryUsageObserverTest::addMemoryTwiceTest - j");
    9091  MemoryUsageObserver::getInstance()->addMemory(i, sizeof(int));
    9192  MemoryUsageObserver::getInstance()->addMemory(j, sizeof(int));
    9293  CPPUNIT_ASSERT_EQUAL(2 * sizeof(int), MemoryUsageObserver::getInstance()->getUsedMemorySize());
    93  };
     94};
    9495
    9596/**
     
    9899void MemoryUsageObserverTest::addMemoryAndChangeSizeOfAddedMemoryTest()
    99100{
    100   int* i = new int;
     101  int* i = Malloc<int>(1, "MemoryUsageObserverTest::addMemoryAndChangeSizeOfAddedMemoryTest - i");
    101102  MemoryUsageObserver::getInstance()->addMemory(i, 2 * sizeof(int));
    102103  MemoryUsageObserver::getInstance()->addMemory(i, sizeof(int));
    103104  CPPUNIT_ASSERT_EQUAL(sizeof(int), MemoryUsageObserver::getInstance()->getUsedMemorySize());
    104  };
     105};
    105106
    106107/**
     
    109110void MemoryUsageObserverTest::addMemoryChangeSizeOfAddedMemoryAndGetMaximumSizeTest()
    110111{
    111   int* i = new int;
     112  int* i = Malloc<int>(1, "MemoryUsageObserverTest::addMemoryChangeSizeOfAddedMemoryAndGetMaximumSizeTest - i");
    112113  MemoryUsageObserver::getInstance()->addMemory(i, 2 * sizeof(int));
    113114  MemoryUsageObserver::getInstance()->addMemory(i, sizeof(int));
    114115  CPPUNIT_ASSERT_EQUAL(2 * sizeof(int), MemoryUsageObserver::getInstance()->getMaximumUsedMemory());
    115  };
     116};
    116117
    117118/**
     
    120121void MemoryUsageObserverTest::addMemoryRemoveMemoryAndGetMaximumSizeTest()
    121122{
    122   int* i = new int;
     123  int* i = Malloc<int>(1, "MemoryUsageObserverTest::addMemoryRemoveMemoryAndGetMaximumSizeTest - i");
    123124  MemoryUsageObserver::getInstance()->addMemory(i, sizeof(int));
    124125  MemoryUsageObserver::getInstance()->removeMemory(i);
    125126  CPPUNIT_ASSERT_EQUAL(sizeof(int), MemoryUsageObserver::getInstance()->getMaximumUsedMemory());
    126  };
     127};
     128
     129/**
     130 * UnitTest for getPointersToAllocatedMemory()
     131 */
     132void MemoryUsageObserverTest::getPointersToAllocatedMemoryTest()
     133{
     134  int* i = Malloc<int>(1, "MemoryUsageObserverTest::getPointersToAllocatedMemoryTest - i");
     135  MemoryUsageObserver::getInstance()->addMemory(i, sizeof(int));
     136  CPPUNIT_ASSERT_EQUAL(i, (int*) MemoryUsageObserver::getInstance()->getPointersToAllocatedMemory().begin()->first);
     137};
     138
     139
    127140/********************************************** Main routine **************************************/
    128141
  • src/memoryusageobserverunittest.hpp

    rc0917c r21b9c3  
    2424    CPPUNIT_TEST ( addMemoryChangeSizeOfAddedMemoryAndGetMaximumSizeTest );
    2525    CPPUNIT_TEST ( addMemoryRemoveMemoryAndGetMaximumSizeTest );
     26    CPPUNIT_TEST ( getPointersToAllocatedMemoryTest );
    2627    CPPUNIT_TEST_SUITE_END();
    2728
     
    3940    void addMemoryChangeSizeOfAddedMemoryAndGetMaximumSizeTest();
    4041    void addMemoryRemoveMemoryAndGetMaximumSizeTest();
     42    void getPointersToAllocatedMemoryTest();
    4143};
    4244
Note: See TracChangeset for help on using the changeset viewer.