|
From: | James Crotinger |
Subject: | RE: [pooma-dev] [PATCH] Fix Engine<.., MultiPatch<..> >::makeOwnC opy() |
Date: | Tue, 22 Apr 2003 12:23:27 -0600 |
Ah - gotcha. I missed the '-'.
The right thing is to fix makeOwnCopy, of course. This looks like a traits problem - the MultiPatchEngine::PatchContainer_t is a RCBPtr of engines, but the underlying engines have shallow copy semantics. There is a traits class that marks shallow-copy objects appropriately and that can be used to implement copy correctly. In ElementProperties.h there is an ElementProperties base class called MakeOwnCopyProperties that is set up to handle this - what there should be, somewhere, is a specialization:
template <int Dim, class T, class ETag>
template <>
struct ElementProperties<Engine<Dim,T,ETag> >
: public MakeOwnCopyProperties<Engine<Dim,T,ETag> >
{ };
What puzzles me is that I see this specialization (a partial one) for Brick and several others. So this ought to work for MultiPatch<Brick> and any of the other engines that have done this specialization. (It will not work on views - we went around on this and ultimately decided that doing makeOwnCopy on a view should not be allowed)
Hmmm. I don't see a specialization for Remote<Brick>. (Just saw your example.) Is this failing for both Brick and Remote<Brick>? The lack of a ElementProperties specialization for Remote<Brick> is a bug. Any class that has shallow copy semantics and that implements the makeOwnCopy() function should specialize ElementProperties as above.
At any rate, it would probably be good to step through the old code and see where it is ending up in the wrong specialization of ElementProperties. That's a bug that could bite in other places.
Looks like spotted another bug wrt the dirty flag - that deep copy is needed regardless of how the engines are copied.
Jim
------------------------------------------------------------------------
James A. Crotinger email: address@hidden
NumeriX, LLC phone: (505) 424-4477 x104
2960 Rodeo Park Dr. W.
Santa Fe, NM 87505
-----Original Message-----
From: Richard Guenther [mailto:address@hidden]
Sent: Tuesday, April 22, 2003 11:51 AM
To: James Crotinger
Cc: 'address@hidden'; 'Jeffrey D. Oldham'
Subject: RE: [pooma-dev] [PATCH] Fix Engine<.., MultiPatch<..> >::makeOwnC opy()
On Tue, 22 Apr 2003, James Crotinger wrote:
> Hmmm. I don't have time to play with this, but something looks wrong. The
> sequence
>
> data_m.makeOwnCopy();
> if (data_m.isShared())
Well ;) I attached a unified patch, the data_m.makeOwnCopy() is removed,
the rest added. The problem is, the data_m.makeOwnCopy() does not work.
Richard.
> 2003 Apr 22 Richard Guenther <address@hidden>
>
> * Engine/MultiPatchEngine.cpp: do makeOwnCopy() manually.
>
> ===== MultiPatchEngine.cpp 1.3 vs edited =====
> --- 1.3/r2/src/Engine/MultiPatchEngine.cpp Fri Jan 24 10:35:52 2003
> +++ edited/MultiPatchEngine.cpp Tue Apr 22 17:42:04 2003
> @@ -244,8 +244,17 @@
> Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::
> makeOwnCopy()
> {
> - data_m.makeOwnCopy();
> -
> + PAssert(data_m.isValid());
> + if (data_m.isShared()) {
> + PatchContainer_t model = data_m;
> + data_m = PatchContainer_t(model.size());
> + for (int i=0; i<model.size(); ++i) {
> + data_m[i] = model[i];
> + data_m[i].makeOwnCopy();
> + }
> + pDirty_m = new bool(*pDirty_m);
> + }
> +
> return *this;
> }
>
>
[Prev in Thread] | Current Thread | [Next in Thread] |