Replace uuid in the table properly when -r

This commit is contained in:
Akira TAGOH 2017-12-18 20:05:14 +09:00
parent 0378790ca3
commit 8ab4d67995
3 changed files with 42 additions and 6 deletions

View File

@ -62,6 +62,7 @@ FcDirCacheCreateUUID (FcChar8 *dir,
int fd;
uuid_t uuid;
char out[37];
FcBool (* hash_add) (FcHashTable *, void*, void*);
atomic = FcAtomicCreate (uuidname);
if (!atomic)
@ -81,7 +82,11 @@ FcDirCacheCreateUUID (FcChar8 *dir,
goto bail3;
}
uuid_generate_random (uuid);
if (!FcHashTableAdd (config->uuid_table, dir, uuid))
if (force)
hash_add = FcHashTableReplace;
else
hash_add = FcHashTableAdd;
if (!hash_add (config->uuid_table, dir, uuid))
{
ret = FcFalse;
goto bail3;

View File

@ -137,10 +137,11 @@ FcHashTableFind (FcHashTable *table,
return FcFalse;
}
FcBool
FcHashTableAdd (FcHashTable *table,
static FcBool
FcHashTableAddInternal (FcHashTable *table,
void *key,
void *value)
void *value,
FcBool replace)
{
FcHashBucket **prev, *bucket, *b;
FcChar32 hash = table->hash_func (key);
@ -167,17 +168,43 @@ FcHashTableAdd (FcHashTable *table,
table->value_destroy_func (bucket->value);
free (bucket);
return FcFalse;
return !ret;
}
retry:
for (prev = &table->buckets[hash % FC_HASH_SIZE];
(b = fc_atomic_ptr_get (prev)); prev = &(b->next))
{
if (!table->compare_func (bucket->key, key))
{
if (replace)
{
if (!fc_atomic_ptr_cmpexch (prev, b, bucket))
goto retry;
bucket = b;
}
else
ret = FcTrue;
goto destroy;
}
}
if (!fc_atomic_ptr_cmpexch (prev, b, bucket))
goto retry;
return FcTrue;
}
FcBool
FcHashTableAdd (FcHashTable *table,
void *key,
void *value)
{
return FcHashTableAddInternal (table, key, value, FcFalse);
}
FcBool
FcHashTableReplace (FcHashTable *table,
void *key,
void *value)
{
return FcHashTableAddInternal (table, key, value, FcTrue);
}

View File

@ -1335,5 +1335,9 @@ FcHashTableAdd (FcHashTable *table,
void *key,
void *value);
FcPrivate FcBool
FcHashTableReplace (FcHashTable *table,
void *key,
void *value);
#endif /* _FC_INT_H_ */