/* This is the root of the list of all pattern_ref avalaibles. */
struct list pattern_reference = LIST_HEAD_INIT(pattern_reference);
-static struct lru64_head *pat_lru_tree;
-__decl_spinlock(pat_lru_tree_lock);
+static THREAD_LOCAL struct lru64_head *pat_lru_tree;
static unsigned long long pat_lru_seed;
/*
if (pat_lru_tree) {
unsigned long long seed = pat_lru_seed ^ (long)expr;
- HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock);
lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed),
pat_lru_tree, expr, expr->revision);
- if (!lru) {
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
- else if (lru->domain) {
+ if (lru && lru->domain) {
ret = lru->data;
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
return ret;
}
}
}
}
- if (lru) {
+ if (lru)
lru64_commit(lru, ret, expr, expr->revision, NULL);
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
return ret;
}
if (pat_lru_tree) {
unsigned long long seed = pat_lru_seed ^ (long)expr;
- HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock);
lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed),
pat_lru_tree, expr, expr->revision);
- if (!lru) {
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
- else if (lru->domain) {
+ if (lru && lru->domain) {
ret = lru->data;
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
return ret;
}
}
}
}
- if (lru) {
+ if (lru)
lru64_commit(lru, ret, expr, expr->revision, NULL);
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
return ret;
}
if (pat_lru_tree) {
unsigned long long seed = pat_lru_seed ^ (long)expr;
- HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock);
lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed),
pat_lru_tree, expr, expr->revision);
- if (!lru) {
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
- else if (lru->domain) {
+ if (lru && lru->domain) {
ret = lru->data;
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
return ret;
}
}
}
}
- if (lru) {
+ if (lru)
lru64_commit(lru, ret, expr, expr->revision, NULL);
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
return ret;
}
if (pat_lru_tree) {
unsigned long long seed = pat_lru_seed ^ (long)expr;
- HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock);
lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed),
pat_lru_tree, expr, expr->revision);
- if (!lru) {
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
- else if (lru->domain) {
+ if (lru && lru->domain) {
ret = lru->data;
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
return ret;
}
}
break;
}
- if (lru) {
+ if (lru)
lru64_commit(lru, ret, expr, expr->revision, NULL);
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
return ret;
}
if (pat_lru_tree) {
unsigned long long seed = pat_lru_seed ^ (long)expr;
- HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock);
lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed),
pat_lru_tree, expr, expr->revision);
- if (!lru) {
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
- else if (lru->domain) {
+ if (lru && lru->domain) {
ret = lru->data;
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
return ret;
}
}
break;
}
- if (lru) {
+ if (lru)
lru64_commit(lru, ret, expr, expr->revision, NULL);
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
return ret;
}
if (pat_lru_tree) {
unsigned long long seed = pat_lru_seed ^ (long)expr;
- HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock);
lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed),
pat_lru_tree, expr, expr->revision);
- if (!lru) {
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
- else if (lru->domain) {
+ if (lru && lru->domain) {
ret = lru->data;
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
return ret;
}
}
}
}
leave:
- if (lru) {
+ if (lru)
lru64_commit(lru, ret, expr, expr->revision, NULL);
- HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock);
- }
return ret;
}
struct list pr = LIST_HEAD_INIT(pr);
pat_lru_seed = random();
- if (global.tune.pattern_cache) {
- pat_lru_tree = lru64_new(global.tune.pattern_cache);
- }
list_for_each_entry(ref, &pattern_reference, list) {
if (ref->unique_id == -1) {
LIST_ADD(&pr, &pattern_reference);
LIST_DEL(&pr);
}
+
+static int pattern_per_thread_lru_alloc()
+{
+ if (!global.tune.pattern_cache)
+ return 1;
+ pat_lru_tree = lru64_new(global.tune.pattern_cache);
+ return !!pat_lru_tree;
+}
+
+static void pattern_per_thread_lru_free()
+{
+ lru64_destroy(pat_lru_tree);
+}
+
+REGISTER_PER_THREAD_ALLOC(pattern_per_thread_lru_alloc);
+REGISTER_PER_THREAD_FREE(pattern_per_thread_lru_free);