aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@aei.mpg.de>2005-04-11 18:30:00 +0000
committerErik Schnetter <schnetter@aei.mpg.de>2005-04-11 18:30:00 +0000
commit2cb54e1839cf63d2303a263330c1d9e637129dab (patch)
treeea65d46581c37a0bc2ded5f6d6fe369717393677
parentca1636b5bc1eeb42464e44ffa3ad7cb20a4b4aa7 (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.cc23
-rw-r--r--Carpet/CarpetLib/src/data.hh4
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)];
}