thread-safe functions in fchash.c
diff --git a/src/fchash.c b/src/fchash.c
index 7a320d5..9857abc 100644
--- a/src/fchash.c
+++ b/src/fchash.c
@@ -169,13 +169,15 @@
 
 	return !ret;
     }
+  retry:
     for (prev = &table->buckets[hash % FC_HASH_SIZE];
-	 (b = *prev); prev = &(b->next))
+	 (b = fc_atomic_ptr_get (prev)); prev = &(b->next))
     {
 	if (!table->compare_func (bucket->key, key))
 	    goto destroy;
     }
-    *prev = bucket;
+    if (!fc_atomic_ptr_cmpexch (prev, b, bucket))
+	goto retry;
 
     return FcTrue;
 }