[svn-r12607] Description:

Tweak the library's new faster fletcher32 algorithm to always produce the
same checksum as the previous fletcher32 code in the fletcher32 I/O pipeline
filter and switch the filter to use the library's version of the algorithm.

Tested on:
    Linux/32 2.6 (chicago)
    Linux/64 2.6 (chicago2)
    Too minor to require h5committest
This commit is contained in:
Quincey Koziol 2006-08-22 08:51:30 -05:00
parent 7a5586ca8e
commit c17ea44617
3 changed files with 14 additions and 74 deletions

View File

@ -46,71 +46,6 @@ const H5Z_class_t H5Z_FLETCHER32[1] = {{
#define FLETCHER_LEN 4
/*-------------------------------------------------------------------------
* Function: H5Z_filter_fletcher32_compute
*
* Purpose: Implement an Fletcher32 Checksum using 1's complement.
*
* Return: Success: Fletcher32 value
*
* Failure: Can't fail
*
* Programmer: Raymond Lu
* Jan 3, 2003
*
* Modifications: Pedro Vicente, March 10, 2004
* defined *SRC as unsigned char for all cases
*
*-------------------------------------------------------------------------
*/
static uint32_t
H5Z_filter_fletcher32_compute(void *_src, size_t len)
{
unsigned char *src=(unsigned char *)_src;
size_t count = len; /* Number of bytes left to checksum */
uint32_t s1 = 0, s2 = 0; /* Temporary partial checksums */
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5Z_filter_fletcher32_compute)
/* Compute checksum */
while(count > 1) {
unsigned short tmp_src; /*To handle unusual platforms like Cray*/
tmp_src = (((unsigned short)src[0])<<8) | ((unsigned short)src[1]);
src +=2;
s1 += tmp_src;
if(s1 & 0xFFFF0000) { /*Wrap around carry if occurred*/
s1 &= 0xFFFF;
s1++;
}
s2 += s1;
if(s2 & 0xFFFF0000) { /*Wrap around carry if occurred*/
s2 &= 0xFFFF;
s2++;
}
count -= 2;
}
/* Check for single byte remaining */
if(count==1) {
s1 += *(unsigned char*)src;
if(s1 & 0xFFFF0000) { /*Wrap around carry if occurred*/
s1 &= 0xFFFF;
s1++;
}
s2 += s1;
if(s2 & 0xFFFF0000) { /*Wrap around carry if occurred*/
s2 &= 0xFFFF;
s2++;
}
}
FUNC_LEAVE_NOAPI((s2 << 16) + s1)
}
/*-------------------------------------------------------------------------
* Function: H5Z_filter_fletcher32
@ -167,7 +102,7 @@ H5Z_filter_fletcher32 (unsigned flags, size_t UNUSED cd_nelmts, const unsigned U
UINT32DECODE(tmp_src, stored_fletcher);
/* Compute checksum (can't fail) */
fletcher = H5Z_filter_fletcher32_compute(src,src_nbytes);
fletcher = H5_fletcher32(src, src_nbytes);
/* The reversed checksum. There was a bug in the calculating code of
* the Fletcher32 checksum in the library before v1.6.3. The checksum
@ -201,7 +136,7 @@ H5Z_filter_fletcher32 (unsigned flags, size_t UNUSED cd_nelmts, const unsigned U
unsigned char *dst; /* Temporary pointer to destination buffer */
/* Compute checksum (can't fail) */
fletcher = H5Z_filter_fletcher32_compute(src,nbytes);
fletcher = H5_fletcher32(src, nbytes);
if (NULL==(dst=outbuf=H5MM_malloc(nbytes+FLETCHER_LEN)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "unable to allocate Fletcher32 checksum destination buffer")

View File

@ -80,6 +80,11 @@
* http://en.wikipedia.org/wiki/Fletcher%27s_checksum
* for more details, etc.
*
* Note #2: The algorithm below differs from that given in the Wikipedia
* page by copying the data into 'sum1' in a more portable way
* and also by initializing 'sum1' and 'sum2' to 0 instead of
* 0xffff (for backward compatibility reasons, mostly).
*
* Return: 32-bit fletcher checksum of input buffer (can't fail)
*
* Programmer: Quincey Koziol
@ -92,7 +97,7 @@ H5_fletcher32(const void *_data, size_t _len)
{
const uint8_t *data = (const uint8_t *)_data; /* Pointer to the data to be summed */
size_t len = _len / 2; /* Length in 16-bit words */
uint32_t sum1 = 0xffff, sum2 = 0xffff;
uint32_t sum1 = 0, sum2 = 0;
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5_fletcher32)
@ -128,6 +133,6 @@ H5_fletcher32(const void *_data, size_t _len)
sum1 = (sum1 & 0xffff) + (sum1 >> 16);
sum2 = (sum2 & 0xffff) + (sum2 >> 16);
FUNC_LEAVE_NOAPI(sum2 << 16 | sum1)
FUNC_LEAVE_NOAPI((sum2 << 16) | sum1)
} /* end H5_fletcher32() */

View File

@ -57,7 +57,7 @@ test_chksum_size_one(void)
/* Buffer w/zero(s) for data */
HDmemset(buf, 0, sizeof(buf));
chksum = H5_fletcher32(buf, sizeof(buf));
VERIFY(chksum, 0xffffffff, "H5_fletcher32");
VERIFY(chksum, 0, "H5_fletcher32");
} /* test_chksum_size_one() */
@ -79,7 +79,7 @@ test_chksum_size_two(void)
/* Buffer w/zero(s) for data */
HDmemset(buf, 0, sizeof(buf));
chksum = H5_fletcher32(buf, sizeof(buf));
VERIFY(chksum, 0xffffffff, "H5_fletcher32");
VERIFY(chksum, 0, "H5_fletcher32");
} /* test_chksum_size_two() */
@ -101,7 +101,7 @@ test_chksum_size_three(void)
/* Buffer w/zero(s) for data */
HDmemset(buf, 0, sizeof(buf));
chksum = H5_fletcher32(buf, sizeof(buf));
VERIFY(chksum, 0xffffffff, "H5_fletcher32");
VERIFY(chksum, 0, "H5_fletcher32");
} /* test_chksum_size_three() */
@ -123,7 +123,7 @@ test_chksum_size_four(void)
/* Buffer w/zero(s) for data */
HDmemset(buf, 0, sizeof(buf));
chksum = H5_fletcher32(buf, sizeof(buf));
VERIFY(chksum, 0xffffffff, "H5_fletcher32");
VERIFY(chksum, 0, "H5_fletcher32");
} /* test_chksum_size_four() */
@ -149,7 +149,7 @@ test_chksum_large(void)
/* Buffer w/zero(s) for data */
HDmemset(large_buf, 0, sizeof(large_buf));
chksum = H5_fletcher32(large_buf, sizeof(large_buf));
VERIFY(chksum, 0xffffffff, "H5_fletcher32");
VERIFY(chksum, 0, "H5_fletcher32");
} /* test_chksum_large() */