mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-13 18:17:39 -04:00
Allocate indices directly in ramcache header. Add version code to
tagcache state dump header. Debug: hdr-structure corruption might happen after rebuilding of dircache. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30109 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
563a185ff4
commit
337e922685
2 changed files with 10 additions and 6 deletions
|
@ -206,15 +206,16 @@ static struct master_header current_tcmh;
|
||||||
#ifdef HAVE_TC_RAMCACHE
|
#ifdef HAVE_TC_RAMCACHE
|
||||||
/* Header is created when loading database to ram. */
|
/* Header is created when loading database to ram. */
|
||||||
struct ramcache_header {
|
struct ramcache_header {
|
||||||
struct index_entry *indices; /* Master index file content */
|
|
||||||
char *tags[TAG_COUNT]; /* Tag file content (not including filename tag) */
|
char *tags[TAG_COUNT]; /* Tag file content (not including filename tag) */
|
||||||
int entry_count[TAG_COUNT]; /* Number of entries in the indices. */
|
int entry_count[TAG_COUNT]; /* Number of entries in the indices. */
|
||||||
|
struct index_entry indices[0]; /* Master index file content */
|
||||||
};
|
};
|
||||||
|
|
||||||
# ifdef HAVE_EEPROM_SETTINGS
|
# ifdef HAVE_EEPROM_SETTINGS
|
||||||
struct statefile_header {
|
struct statefile_header {
|
||||||
|
int32_t magic; /* Statefile version number */
|
||||||
struct master_header mh; /* Header from the master index */
|
struct master_header mh; /* Header from the master index */
|
||||||
struct ramcache_header *hdr;
|
struct ramcache_header *hdr; /* Old load address of hdr for relocation */
|
||||||
struct tagcache_stat tc_stat;
|
struct tagcache_stat tc_stat;
|
||||||
};
|
};
|
||||||
# endif
|
# endif
|
||||||
|
@ -3793,7 +3794,6 @@ static bool allocate_tagcache(void)
|
||||||
hdr = buffer_alloc(tc_stat.ramcache_allocated + 128);
|
hdr = buffer_alloc(tc_stat.ramcache_allocated + 128);
|
||||||
memset(hdr, 0, sizeof(struct ramcache_header));
|
memset(hdr, 0, sizeof(struct ramcache_header));
|
||||||
memcpy(¤t_tcmh, &tcmh, sizeof current_tcmh);
|
memcpy(¤t_tcmh, &tcmh, sizeof current_tcmh);
|
||||||
hdr->indices = (struct index_entry *)(hdr + 1);
|
|
||||||
logf("tagcache: %d bytes allocated.", tc_stat.ramcache_allocated);
|
logf("tagcache: %d bytes allocated.", tc_stat.ramcache_allocated);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -3818,6 +3818,7 @@ static bool tagcache_dumpload(void)
|
||||||
hdr = buffer_alloc(0);
|
hdr = buffer_alloc(0);
|
||||||
rc = read(fd, &shdr, sizeof(struct statefile_header));
|
rc = read(fd, &shdr, sizeof(struct statefile_header));
|
||||||
if (rc != sizeof(struct statefile_header)
|
if (rc != sizeof(struct statefile_header)
|
||||||
|
|| shdr.magic != TAGCACHE_STATEFILE_MAGIC
|
||||||
|| shdr.mh.tch.magic != TAGCACHE_MAGIC)
|
|| shdr.mh.tch.magic != TAGCACHE_MAGIC)
|
||||||
{
|
{
|
||||||
logf("incorrect statefile");
|
logf("incorrect statefile");
|
||||||
|
@ -3843,7 +3844,6 @@ static bool tagcache_dumpload(void)
|
||||||
memcpy(&tc_stat, &shdr.tc_stat, sizeof(struct tagcache_stat));
|
memcpy(&tc_stat, &shdr.tc_stat, sizeof(struct tagcache_stat));
|
||||||
|
|
||||||
/* Now fix the pointers */
|
/* Now fix the pointers */
|
||||||
hdr->indices = (struct index_entry *)((long)hdr->indices + offpos);
|
|
||||||
for (i = 0; i < TAG_COUNT; i++)
|
for (i = 0; i < TAG_COUNT; i++)
|
||||||
hdr->tags[i] += offpos;
|
hdr->tags[i] += offpos;
|
||||||
|
|
||||||
|
@ -3869,6 +3869,7 @@ static bool tagcache_dumpsave(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the header */
|
/* Create the header */
|
||||||
|
shdr.magic = TAGCACHE_STATEFILE_MAGIC;
|
||||||
shdr.hdr = hdr;
|
shdr.hdr = hdr;
|
||||||
memcpy(&shdr.mh, ¤t_tcmh, sizeof current_tcmh);
|
memcpy(&shdr.mh, ¤t_tcmh, sizeof current_tcmh);
|
||||||
memcpy(&shdr.tc_stat, &tc_stat, sizeof tc_stat);
|
memcpy(&shdr.tc_stat, &tc_stat, sizeof tc_stat);
|
||||||
|
@ -3924,6 +3925,8 @@ static bool load_tagcache(void)
|
||||||
/* Load the master index table. */
|
/* Load the master index table. */
|
||||||
for (i = 0; i < tcmh.tch.entry_count; i++)
|
for (i = 0; i < tcmh.tch.entry_count; i++)
|
||||||
{
|
{
|
||||||
|
/* DEBUG: After tagcache commit and dircache rebuild, hdr-sturcture
|
||||||
|
* may become corrupt. */
|
||||||
rc = ecread_index_entry(fd, idx);
|
rc = ecread_index_entry(fd, idx);
|
||||||
if (rc != sizeof(struct index_entry))
|
if (rc != sizeof(struct index_entry))
|
||||||
{
|
{
|
||||||
|
@ -3997,8 +4000,6 @@ static bool load_tagcache(void)
|
||||||
int dc;
|
int dc;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
// FIXME: This is wrong!
|
|
||||||
// idx = &hdr->indices[hdr->entry_count[i]];
|
|
||||||
idx = &hdr->indices[fe->idx_id];
|
idx = &hdr->indices[fe->idx_id];
|
||||||
|
|
||||||
if (fe->tag_length >= (long)sizeof(buf)-1)
|
if (fe->tag_length >= (long)sizeof(buf)-1)
|
||||||
|
|
|
@ -52,6 +52,9 @@ enum tag_type { tag_artist = 0, tag_album, tag_genre, tag_title,
|
||||||
/* Tag Cache Header version 'TCHxx'. Increment when changing internal structures. */
|
/* Tag Cache Header version 'TCHxx'. Increment when changing internal structures. */
|
||||||
#define TAGCACHE_MAGIC 0x5443480e
|
#define TAGCACHE_MAGIC 0x5443480e
|
||||||
|
|
||||||
|
/* Dump store/restore header version 'TCSxx'. */
|
||||||
|
#define TAGCACHE_STATEFILE_MAGIC 0x54435301
|
||||||
|
|
||||||
/* How much to allocate extra space for ramcache. */
|
/* How much to allocate extra space for ramcache. */
|
||||||
#define TAGCACHE_RESERVE 32768
|
#define TAGCACHE_RESERVE 32768
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue