mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
gst/gstregistrybinary.*: Don't write and check a CRC for the binary registry file. It's guaranteed that the registry ...
Original commit message from CVS: * gst/gstregistrybinary.c: (gst_registry_binary_write_chunk), (gst_registry_binary_initialize_magic), (gst_registry_binary_write_cache), (gst_registry_binary_check_magic): * gst/gstregistrybinary.h: Don't write and check a CRC for the binary registry file. It's guaranteed that the registry is completely written (it's first written to a temporary file and then moved) and if the registry was corrupted by some hardware failure we would have bigger problems. Bump binary registry version to 0.10.21.1 for this as it's an incompatible change and to ensure that the registry gets rebuild after the update. This saves some milliseconds for reading/writing the registry. Fixes bug #560399.
This commit is contained in:
parent
6f621b03a8
commit
681e4d01c8
3 changed files with 22 additions and 148 deletions
19
ChangeLog
19
ChangeLog
|
@ -1,3 +1,22 @@
|
||||||
|
2008-11-12 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst/gstregistrybinary.c: (gst_registry_binary_write_chunk),
|
||||||
|
(gst_registry_binary_initialize_magic),
|
||||||
|
(gst_registry_binary_write_cache),
|
||||||
|
(gst_registry_binary_check_magic):
|
||||||
|
* gst/gstregistrybinary.h:
|
||||||
|
Don't write and check a CRC for the binary registry file. It's
|
||||||
|
guaranteed that the registry is completely written (it's first written
|
||||||
|
to a temporary file and then moved) and if the registry was corrupted
|
||||||
|
by some hardware failure we would have bigger problems.
|
||||||
|
|
||||||
|
Bump binary registry version to 0.10.21.1 for this as it's an
|
||||||
|
incompatible change and to ensure that the registry gets rebuild
|
||||||
|
after the update.
|
||||||
|
|
||||||
|
This saves some milliseconds for reading/writing the registry.
|
||||||
|
Fixes bug #560399.
|
||||||
|
|
||||||
2008-11-11 Wim Taymans <wim.taymans@collabora.co.uk>
|
2008-11-11 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
* docs/random/wtay/poll-timeout:
|
* docs/random/wtay/poll-timeout:
|
||||||
|
|
|
@ -90,129 +90,6 @@
|
||||||
#define alignment(_address) (gsize)_address%ALIGNMENT
|
#define alignment(_address) (gsize)_address%ALIGNMENT
|
||||||
#define align(_ptr) _ptr += (( alignment(_ptr) == 0) ? 0 : ALIGNMENT-alignment(_ptr))
|
#define align(_ptr) _ptr += (( alignment(_ptr) == 0) ? 0 : ALIGNMENT-alignment(_ptr))
|
||||||
|
|
||||||
|
|
||||||
/* CRC32 calculation */
|
|
||||||
|
|
||||||
/* The crc32() function is copyrighted and licensed as specified below.
|
|
||||||
* This only applies to this single function:
|
|
||||||
|
|
||||||
crc32.c -- compute the CRC-32 of a data stream
|
|
||||||
Copyright (C) 1995-1998 Mark Adler
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
|
||||||
|
|
||||||
Jean-loup Gailly Mark Adler
|
|
||||||
jloup@gzip.org madler@alumni.caltech.edu
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Changes for gstreamer:
|
|
||||||
* - Changed to use GLib data types
|
|
||||||
* - Change function name to _gst_crc32
|
|
||||||
* - Return the old CRC instead of 0 when len or buf are 0/NULL
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ========================================================================
|
|
||||||
* Table of CRC-32's of all single-byte values (made by make_crc_table)
|
|
||||||
*/
|
|
||||||
static const guint32 crc_table[256] = {
|
|
||||||
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
|
|
||||||
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
|
|
||||||
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
|
|
||||||
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
|
|
||||||
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
|
|
||||||
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
|
|
||||||
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
|
|
||||||
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
|
|
||||||
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
|
|
||||||
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
|
|
||||||
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
|
|
||||||
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
|
|
||||||
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
|
|
||||||
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
|
|
||||||
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
|
|
||||||
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
|
|
||||||
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
|
|
||||||
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
|
|
||||||
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
|
|
||||||
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
|
|
||||||
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
|
|
||||||
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
|
|
||||||
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
|
|
||||||
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
|
|
||||||
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
|
|
||||||
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
|
|
||||||
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
|
|
||||||
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
|
|
||||||
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
|
|
||||||
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
|
|
||||||
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
|
|
||||||
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
|
|
||||||
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
|
|
||||||
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
|
|
||||||
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
|
|
||||||
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
|
|
||||||
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
|
|
||||||
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
|
|
||||||
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
|
|
||||||
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
|
|
||||||
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
|
|
||||||
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
|
|
||||||
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
|
|
||||||
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
|
|
||||||
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
|
|
||||||
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
|
|
||||||
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
|
|
||||||
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
|
|
||||||
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
|
|
||||||
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
|
|
||||||
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
|
|
||||||
0x2d02ef8dL
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
#define DO1(buf) crc = crc_table[((gint)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
|
|
||||||
#define DO2(buf) DO1(buf); DO1(buf);
|
|
||||||
#define DO4(buf) DO2(buf); DO2(buf);
|
|
||||||
#define DO8(buf) DO4(buf); DO4(buf);
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
static guint32
|
|
||||||
_gst_crc32 (guint32 crc, const gchar * buf, guint len)
|
|
||||||
{
|
|
||||||
if (buf == NULL || len == 0)
|
|
||||||
return crc;
|
|
||||||
|
|
||||||
crc = crc ^ 0xffffffffL;
|
|
||||||
while (len >= 8) {
|
|
||||||
DO8 (buf);
|
|
||||||
len -= 8;
|
|
||||||
}
|
|
||||||
if (len)
|
|
||||||
do {
|
|
||||||
DO1 (buf);
|
|
||||||
} while (--len);
|
|
||||||
return crc ^ 0xffffffffL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef DO1
|
|
||||||
#undef DO2
|
|
||||||
#undef DO4
|
|
||||||
#undef DO8
|
|
||||||
|
|
||||||
/* Registry saving */
|
/* Registry saving */
|
||||||
|
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
|
@ -378,8 +255,7 @@ rename_failed:
|
||||||
inline static gboolean
|
inline static gboolean
|
||||||
gst_registry_binary_write_chunk (GstRegistry * registry,
|
gst_registry_binary_write_chunk (GstRegistry * registry,
|
||||||
BinaryRegistryCache * cache, const void *mem,
|
BinaryRegistryCache * cache, const void *mem,
|
||||||
const gssize size, unsigned long *file_position, gboolean align,
|
const gssize size, unsigned long *file_position, gboolean align)
|
||||||
guint32 * crc32)
|
|
||||||
{
|
{
|
||||||
gchar padder[ALIGNMENT] = { 0, };
|
gchar padder[ALIGNMENT] = { 0, };
|
||||||
int padsize = 0;
|
int padsize = 0;
|
||||||
|
@ -392,8 +268,6 @@ gst_registry_binary_write_chunk (GstRegistry * registry,
|
||||||
GST_ERROR ("Failed to write binary registry padder");
|
GST_ERROR ("Failed to write binary registry padder");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (padsize > 0)
|
|
||||||
*crc32 = _gst_crc32 (*crc32, padder, padsize);
|
|
||||||
*file_position += padsize;
|
*file_position += padsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -402,8 +276,6 @@ gst_registry_binary_write_chunk (GstRegistry * registry,
|
||||||
GST_ERROR ("Failed to write binary registry element");
|
GST_ERROR ("Failed to write binary registry element");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (size > 0)
|
|
||||||
*crc32 = _gst_crc32 (*crc32, mem, size);
|
|
||||||
|
|
||||||
*file_position += size;
|
*file_position += size;
|
||||||
|
|
||||||
|
@ -430,8 +302,6 @@ gst_registry_binary_initialize_magic (GstBinaryRegistryMagic * m)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
m->crc32 = 0;
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -800,7 +670,7 @@ gst_registry_binary_write_cache (GstRegistry * registry, const char *location)
|
||||||
GstBinaryChunk *cur = walk->data;
|
GstBinaryChunk *cur = walk->data;
|
||||||
|
|
||||||
if (!gst_registry_binary_write_chunk (registry, cache, cur->data, cur->size,
|
if (!gst_registry_binary_write_chunk (registry, cache, cur->data, cur->size,
|
||||||
&file_position, cur->align, &magic.crc32)) {
|
&file_position, cur->align)) {
|
||||||
if (!(cur->flags & GST_BINARY_REGISTRY_FLAG_CONST))
|
if (!(cur->flags & GST_BINARY_REGISTRY_FLAG_CONST))
|
||||||
g_free (cur->data);
|
g_free (cur->data);
|
||||||
g_free (cur);
|
g_free (cur);
|
||||||
|
@ -814,12 +684,6 @@ gst_registry_binary_write_cache (GstRegistry * registry, const char *location)
|
||||||
}
|
}
|
||||||
g_list_free (to_write);
|
g_list_free (to_write);
|
||||||
|
|
||||||
if (gst_registry_binary_cache_write (registry, cache, 0, &magic,
|
|
||||||
sizeof (GstBinaryRegistryMagic)) != sizeof (GstBinaryRegistryMagic)) {
|
|
||||||
GST_ERROR ("Failed to rewrite binary registry magic");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gst_registry_binary_cache_finish (registry, cache, TRUE))
|
if (!gst_registry_binary_cache_finish (registry, cache, TRUE))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -862,7 +726,6 @@ static gint
|
||||||
gst_registry_binary_check_magic (gchar ** in, gsize size)
|
gst_registry_binary_check_magic (gchar ** in, gsize size)
|
||||||
{
|
{
|
||||||
GstBinaryRegistryMagic *m;
|
GstBinaryRegistryMagic *m;
|
||||||
guint32 crc32 = 0;
|
|
||||||
|
|
||||||
align (*in);
|
align (*in);
|
||||||
GST_DEBUG ("Reading/casting for GstBinaryRegistryMagic at address %p", *in);
|
GST_DEBUG ("Reading/casting for GstBinaryRegistryMagic at address %p", *in);
|
||||||
|
@ -890,13 +753,6 @@ gst_registry_binary_check_magic (gchar ** in, gsize size)
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
crc32 = _gst_crc32 (crc32, *in, size - sizeof (GstBinaryRegistryMagic));
|
|
||||||
if (crc32 != m->crc32) {
|
|
||||||
GST_WARNING ("Binary registry CRC32 different: 0x%x != 0x%x\n", crc32,
|
|
||||||
m->crc32);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@
|
||||||
* This _must_ be updated whenever the registry format changes,
|
* This _must_ be updated whenever the registry format changes,
|
||||||
* we currently use the core version where this change happened.
|
* we currently use the core version where this change happened.
|
||||||
*/
|
*/
|
||||||
#define GST_MAGIC_BINARY_VERSION_STR ("0.10.18.2")
|
#define GST_MAGIC_BINARY_VERSION_STR ("0.10.21.1")
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GST_MAGIC_BINARY_VERSION_LEN:
|
* GST_MAGIC_BINARY_VERSION_LEN:
|
||||||
|
@ -70,7 +70,6 @@ typedef struct _GstBinaryRegistryMagic
|
||||||
{
|
{
|
||||||
gchar magic[GST_MAGIC_BINARY_REGISTRY_LEN];
|
gchar magic[GST_MAGIC_BINARY_REGISTRY_LEN];
|
||||||
gchar version[GST_MAGIC_BINARY_VERSION_LEN];
|
gchar version[GST_MAGIC_BINARY_VERSION_LEN];
|
||||||
guint32 crc32;
|
|
||||||
} GstBinaryRegistryMagic;
|
} GstBinaryRegistryMagic;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue