Well, didn’t take too long. I just put in printfs to see that the parameters were ok, then of course the problem is in the function. Well, and the manpage warns pretty directly about memcpy not being stable…
Two points:
1. The same issue probably also affects exclusions, as they are also intlist based.
Yes, it did, see my full patch. The simples thing would be to replace all memcpy by memmove, but there so many, and most really just copy from one segment to another. We also have only very few lists that actually can be shorted, so should be more or less ok now (crossing fingers). The particle lists are ok, because if I delete particles there, I just move particles from the end of the list into the gap, rather than shifting as in the bond list.
2. Might this be a reason for a bugfix release of the stable Espresso? As I understand it, this issue will affect all existing users, who happen to use a new enough linux distro?
There is actually a number of other bugfixes in the master that would be worthwhile to cherry-pick. Whoever maintainer jumps at it…
Axel
On Wed, Jan 07, 2015 at 11:26:53PM +0100, Florian Weik wrote:
Actually simply switching to memmove does the trick... Now its even
standard conform, so it will never break again *cough*
On Wed, Jan 7, 2015 at 11:24 PM, Ulf Schiller <address@hidden> wrote:
Maybe a bit dirty, but could playing around with something like
__asm__(".symver memcpy,...
do the trick?
On 01/07/2015 10:20 PM, Axel Arnold wrote:
Well, I was more polite about this change than Linus...
https://bugzilla.redhat.com/show_bug.cgi?id=638477#c129
But I do like his statement about standards :-). The other funny thing
is that he thinks they just forgot to handle overlapping in early memcpy
and therefore introduced memmove with guaranteed behavior. I just wrote
try_delete_bond in the golden window when both were the same...
Cheers,
Axel
On 07.01.2015, at 23:10, Florian Weik <address@hidden
<mailto:address@hidden>> wrote:
This is a joke, right?
On Wed, Jan 7, 2015 at 10:56 PM, Axel Arnold
<address@hidden <mailto:address@hidden>>
wrote:
Hi!
No, that problem is more subtle, and will probably stick around
for a while. glibc < 2.14 aliased memcpy to memmove, which allows
for overlapping memory regions, while memcpy doesn't. The current
glibc versions have a more efficient memcpy, that does not allow
for overlap, which in this case however occurs.
I can’t test on my Mac, since Apple decided wisely that an
unmeasurable speed gain (according to Linus) isn’t worth breaking
hundreds of applications, but most Linux distros seem to have this
problem. Shooting yourself (or others) in the foot seems to be
great fun...
Best,
Axel
On 07.01.2015, at 15:52, Florian Weik <address@hidden
<mailto:address@hidden>> wrote:
Hi,
the function looks suspicious to me, might be an off by one
error. I'll get back to you if I've got it figured out.
Florian
On Wed, Jan 7, 2015 at 3:45 PM, Rudolf Weeber
<address@hidden
<mailto:address@hidden>> wrote:
Hi,
On Wed, Jan 07, 2015 at 02:42:27PM +0100, Rudolf Weeber wrote:
I encountered very strange behaviour when deleting
individual bonds from particles which have more than one bond.
In some cases, the code works correctly, in some cases, the
wrong bond seems to be deleted and in some cases, the bond list gets
screwed up completely.
The code, which is supposed to delete the bond is in
particle_data.cpp:try_delete_bond()
And here is a case, where the bond list is screwed up entirely:
{0 FENE 47.396 2.5 1.0} {1 angle_harmonic 473.96000000000004
1.0471975512} {2 FENE 473960.0 2.0 1.0} {3 FENE 473960.0 0.1
0.0} {1 1 lennard-jones 1000.0 2.672696154421018 3.0 0.25 0.0
0.0 0.0 } {magnetic 1.0 dawaanr }
I.e., bond 0 and 2 have one partner, bond 1 has two partners
Initial bond configurations
{ {0 21746} {0 21747} {0 22047} {1 22047 21746} {1 22049
21747} {1 22348 22047} {1 22349 22049} }
Del: 0 21746
{ {0 21747} {0 22047} {1 22047 21746} {1 22049 21747} {22047
1} {22047 1} {22349 22049} }
---------------------------------
The relevant code is
proc makeBondRigid { id bond} {
global bondMeshPairSoft 0
global bondMeshAngleSoft 1
global bondMeshPairStiff 2
global bondParticleMesh 3
puts "$id: Making bond rigid: $bond"
# First delete the old bond
puts "[part $id print bond]"
puts " Del: $bond"
eval "part $id bond delete $bond"
puts "[part $id print bond]"
# Make new bond with changed type
lset bond 0 $bondMeshPairStiff
# Add
puts " Add: $bond"
eval "part $id bond $bond"
puts "[part $id print bond]"
}
Regards, Rudolf
--
Florian Weik
address@hidden <mailto:address@hidden>
++49 157 85939252 <tel:%2B%2B49%20157%2085939252>
------------------------------------------------
JP Dr. Axel Arnold
ICP, Universität Stuttgart
Allmandring 3
70569 Stuttgart, Germany
Email: address@hidden
<mailto:address@hidden>
Phone: +49 711 685 67609 <tel:%2B49%20711%20685%2067609>
--
Florian Weik
address@hidden <mailto:address@hidden>
++49 157 85939252
------------------------------------------------
JP Dr. Axel Arnold
ICP, Universität Stuttgart
Allmandring 3
70569 Stuttgart, Germany
Email: address@hidden <mailto:address@hidden
Phone: +49 711 685 67609
--
Ulf D. Schiller
Centre for Computational Science
University College London
20 Gordon Street
London WC1H 0AJ
United Kingdom
Phone: +44 (0)20 7679 5300
--
Florian Weik
address@hidden
++49 157 85939252
------------------------------------------------
JP Dr. Axel Arnold
ICP, Universität Stuttgart
Allmandring 3
70569 Stuttgart, Germany
Email:
address@hiddenPhone:
+49 711 685 67609