{
if (*trie) {
trie_cleanup_build_data(*trie);
+ trie_unlock(*trie);
p_delete(&(*trie)->entries);
p_delete(&(*trie)->c);
p_delete(trie);
}
}
-
-static inline void trie_shrink(trie_t *trie)
-{
- p_shrink(&trie->entries, trie->entries_len, &trie->entries_size);
- p_shrink(&trie->c, trie->c_len, &trie->c_size);
-}
-
-static inline void trie_lock(trie_t *trie)
-{
- if (mlock(trie->entries, sizeof(trie_entry_t) * trie->entries_len) != 0) {
- UNIXERR("mlock");
- return;
- }
- if (mlock(trie->c, trie->c_len) != 0) {
- UNIXERR("mlock");
- munlock(trie->entries, sizeof(trie_entry_t) * trie->entries_len);
- return;
- }
- trie->locked = true;
-}
-
typedef char *str_t;
void trie_compile(trie_t *trie, bool memlock)
trie_compile_aux(trie, trie_add_leaf(trie, trie->keys[0]),
0, trie->keys_len, 0, 0);
trie_cleanup_build_data(trie);
- trie_shrink(trie);
+ p_shrink(&trie->entries, trie->entries_len, &trie->entries_size);
+ p_shrink(&trie->c, trie->c_len, &trie->c_size);
if (memlock) {
trie_lock(trie);
}
}
}
+void trie_lock(trie_t *trie)
+{
+ if (trie->locked) {
+ return;
+ }
+ if (mlock(trie->entries, sizeof(trie_entry_t) * trie->entries_len) != 0) {
+ UNIXERR("mlock");
+ return;
+ }
+ if (mlock(trie->c, trie->c_len) != 0) {
+ UNIXERR("mlock");
+ munlock(trie->entries, sizeof(trie_entry_t) * trie->entries_len);
+ return;
+ }
+ trie->locked = true;
+}
+
+void trie_unlock(trie_t *trie)
+{
+ if (!trie->locked) {
+ return;
+ }
+ munlock(trie->entries, sizeof(trie_entry_t) * trie->entries_len);
+ munlock(trie->c, trie->c_len);
+ trie->locked = false;
+}
/* Debug {{{1
*/
__attribute__((nonnull(1)))
void trie_compile(trie_t *trie, bool memlock);
+__attribute__((nonnull(1)))
+void trie_lock(trie_t *trie);
+
+__attribute__((nonnull(1)))
+void trie_unlock(trie_t *trie);
+
__attribute__((nonnull(1,2)))
bool trie_lookup(const trie_t *trie, const char* key);