diff options
author | Erik Schnetter <schnetter@aei.mpg.de> | 2005-04-11 18:30:00 +0000 |
---|---|---|
committer | Erik Schnetter <schnetter@aei.mpg.de> | 2005-04-11 18:30:00 +0000 |
commit | 2cb54e1839cf63d2303a263330c1d9e637129dab (patch) | |
tree | ea65d46581c37a0bc2ded5f6d6fe369717393677 | |
parent | ca1636b5bc1eeb42464e44ffa3ad7cb20a4b4aa7 (diff) |
CarpetLib: Correct errors in handling mem<T> objects
I think there were some errors in handling the mem<T> objects, but I'm
not completely sure.
darcs-hash:20050411183030-891bb-f1b5510bb4866c8d4bab48a7b320cb6de71b1121.gz
-rw-r--r-- | Carpet/CarpetLib/src/data.cc | 23 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/data.hh | 4 |
2 files changed, 21 insertions, 6 deletions
diff --git a/Carpet/CarpetLib/src/data.cc b/Carpet/CarpetLib/src/data.cc index bbf67a1ed..325dacea6 100644 --- a/Carpet/CarpetLib/src/data.cc +++ b/Carpet/CarpetLib/src/data.cc @@ -66,7 +66,7 @@ data<T>::data (const int varindex_, const operator_type transport_operator_, template<typename T> data<T>::~data () { - free(); + if (_memory) free(); } // Pseudo constructors @@ -111,6 +111,7 @@ void data<T>::allocate (const ibbox& extent_, } else { assert (vectorleader); _memory = vectorleader->_memory; + assert (_memory); } _memory->register_client (vectorindex); } else { @@ -121,6 +122,8 @@ void data<T>::allocate (const ibbox& extent_, template<typename T> void data<T>::free () { + assert (_has_storage); + assert (_memory); _memory->unregister_client (vectorindex); if (! _memory->has_clients()) delete _memory; _memory = NULL; @@ -146,17 +149,20 @@ void data<T>::change_processor_recv (comm_state& state, } wtime_changeproc_recv.start(); - + + assert (vectorlength == 1); + if (_has_storage) { if (dist::rank() == newproc) { // copy from other processor assert (!_memory); _memory = new mem<T> (1, _size, (T*)memptr); + _memory->register_client (0); wtime_irecv.start(); T dummy; - MPI_Irecv (_memory->storage(vectorindex), + MPI_Irecv (_memory->storage(0), _size, dist::datatype(dummy), proc(), tag, dist::comm, &request); wtime_irecv.stop(); @@ -194,6 +200,8 @@ void data<T>::change_processor_send (comm_state& state, wtime_changeproc_send.start(); + assert (vectorlength == 1); + if (_has_storage) { if (dist::rank() == newproc) { // copy from other processor @@ -206,7 +214,7 @@ void data<T>::change_processor_send (comm_state& state, wtime_isend.start(); T dummy; - MPI_Isend (_memory->storage(vectorindex), + MPI_Isend (_memory->storage(0), _size, dist::datatype(dummy), newproc, tag, dist::comm, &request); wtime_isend.stop(); @@ -241,7 +249,9 @@ void data<T>::change_processor_wait (comm_state& state, } wtime_changeproc_wait.start(); - + + assert (vectorlength == 1); + if (use_waitall) { if (! state.requests.empty()) { // wait for all requests at once @@ -275,8 +285,9 @@ void data<T>::change_processor_wait (comm_state& state, wtime_isendwait.stop(); } + _memory->unregister_client (0); if (! _memory->has_clients()) delete _memory; - _memory = NULL; + _memory = 0; } else { assert (!memptr); diff --git a/Carpet/CarpetLib/src/data.hh b/Carpet/CarpetLib/src/data.hh index 8d6069de2..f7830c3c1 100644 --- a/Carpet/CarpetLib/src/data.hh +++ b/Carpet/CarpetLib/src/data.hh @@ -75,23 +75,27 @@ public: virtual const void* storage () const { assert (_has_storage); + if (! _memory) return 0; return _memory->storage(vectorindex); } virtual void* storage () { assert (_has_storage); + if (! _memory) return 0; return _memory->storage(vectorindex); } // Data accessors const T& operator[] (const ivect& index) const { + assert (_has_storage); assert (_memory); return _memory->storage(vectorindex)[offset(index)]; } T& operator[] (const ivect& index) { + assert (_has_storage); assert (_memory); return _memory->storage(vectorindex)[offset(index)]; } |