Commit 8ab4d679 authored by Akira TAGOH's avatar Akira TAGOH

Replace uuid in the table properly when -r

parent 0378790c
......@@ -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;
......
......@@ -137,10 +137,11 @@ FcHashTableFind (FcHashTable *table,
return FcFalse;
}
FcBool
FcHashTableAdd (FcHashTable *table,
void *key,
void *value)
static FcBool
FcHashTableAddInternal (FcHashTable *table,
void *key,
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);
}
......@@ -1335,5 +1335,9 @@ FcHashTableAdd (FcHashTable *table,
void *key,
void *value);
FcPrivate FcBool
FcHashTableReplace (FcHashTable *table,
void *key,
void *value);
#endif /* _FC_INT_H_ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment