summaryrefslogtreecommitdiffstats
path: root/svm/svmdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'svm/svmdb.c')
-rw-r--r--svm/svmdb.c798
1 files changed, 426 insertions, 372 deletions
diff --git a/svm/svmdb.c b/svm/svmdb.c
index 481224a6742..b22d2fab1bb 100644
--- a/svm/svmdb.c
+++ b/svm/svmdb.c
@@ -1,4 +1,4 @@
-/*
+/*
*------------------------------------------------------------------
* svmdb.c -- simple shared memory database
*
@@ -42,479 +42,533 @@
#include "svmdb.h"
-static void local_set_variable_nolock (svmdb_client_t *client,
- svmdb_namespace_t namespace,
- u8 * var, u8 * val, u32 elsize);
+static void local_set_variable_nolock (svmdb_client_t * client,
+ svmdb_namespace_t namespace,
+ u8 * var, u8 * val, u32 elsize);
-always_inline void region_lock(svm_region_t *rp, int tag)
+always_inline void
+region_lock (svm_region_t * rp, int tag)
{
- pthread_mutex_lock(&rp->mutex);
+ pthread_mutex_lock (&rp->mutex);
#ifdef MUTEX_DEBUG
- rp->mutex_owner_pid = getpid();
- rp->mutex_owner_tag = tag;
-#endif
+ rp->mutex_owner_pid = getpid ();
+ rp->mutex_owner_tag = tag;
+#endif
}
-always_inline void region_unlock(svm_region_t *rp)
+always_inline void
+region_unlock (svm_region_t * rp)
{
#ifdef MUTEX_DEBUG
- rp->mutex_owner_pid = 0;
- rp->mutex_owner_tag = 0;
-#endif
- pthread_mutex_unlock(&rp->mutex);
+ rp->mutex_owner_pid = 0;
+ rp->mutex_owner_tag = 0;
+#endif
+ pthread_mutex_unlock (&rp->mutex);
}
-static svmdb_client_t *svmdb_map_internal (char *root_path, uword size)
+static svmdb_client_t *
+svmdb_map_internal (char *root_path, uword size)
{
- svmdb_client_t *client = 0;
- svm_map_region_args_t *a = 0;
- svm_region_t *db_rp;
- void *oldheap;
- svmdb_shm_hdr_t *hp = 0;
-
- vec_validate (client, 0);
- vec_validate (a, 0);
-
- svm_region_init_chroot(root_path);
-
- a->root_path = root_path;
- a->name = "/db";
- a->size = size ? size : SVMDB_DEFAULT_SIZE;
- a->flags = SVM_FLAGS_MHEAP;
-
- db_rp = client->db_rp = svm_region_find_or_create (a);
-
- ASSERT(db_rp);
-
- vec_free (a);
-
- region_lock (client->db_rp, 10);
- /* Has someone else set up the shared-memory variable table? */
- if (db_rp->user_ctx) {
- client->shm = (void *) db_rp->user_ctx;
- client->pid = getpid();
- region_unlock (client->db_rp);
- ASSERT (client->shm->version == SVMDB_SHM_VERSION);
- return (client);
+ svmdb_client_t *client = 0;
+ svm_map_region_args_t *a = 0;
+ svm_region_t *db_rp;
+ void *oldheap;
+ svmdb_shm_hdr_t *hp = 0;
+
+ vec_validate (client, 0);
+ vec_validate (a, 0);
+
+ svm_region_init_chroot (root_path);
+
+ a->root_path = root_path;
+ a->name = "/db";
+ a->size = size ? size : SVMDB_DEFAULT_SIZE;
+ a->flags = SVM_FLAGS_MHEAP;
+
+ db_rp = client->db_rp = svm_region_find_or_create (a);
+
+ ASSERT (db_rp);
+
+ vec_free (a);
+
+ region_lock (client->db_rp, 10);
+ /* Has someone else set up the shared-memory variable table? */
+ if (db_rp->user_ctx)
+ {
+ client->shm = (void *) db_rp->user_ctx;
+ client->pid = getpid ();
+ region_unlock (client->db_rp);
+ ASSERT (client->shm->version == SVMDB_SHM_VERSION);
+ return (client);
}
- /* Nope, it's our problem... */
-
- /* Add a bogus client (pid=0) so the svm won't be deallocated */
- oldheap = svm_push_pvt_heap (db_rp);
- vec_add1(client->db_rp->client_pids, 0);
- svm_pop_heap (oldheap);
-
- oldheap = svm_push_data_heap (db_rp);
-
- vec_validate(hp, 0);
- hp->version = SVMDB_SHM_VERSION;
- hp->namespaces[SVMDB_NAMESPACE_STRING]
- = hash_create_string(0, sizeof(uword));
- hp->namespaces[SVMDB_NAMESPACE_VEC]
- = hash_create_string(0, sizeof(uword));
-
- db_rp->user_ctx = hp;
- client->shm = hp;
-
- svm_pop_heap (oldheap);
- region_unlock (client->db_rp);
- client->pid = getpid();
-
- return (client);
+ /* Nope, it's our problem... */
+
+ /* Add a bogus client (pid=0) so the svm won't be deallocated */
+ oldheap = svm_push_pvt_heap (db_rp);
+ vec_add1 (client->db_rp->client_pids, 0);
+ svm_pop_heap (oldheap);
+
+ oldheap = svm_push_data_heap (db_rp);
+
+ vec_validate (hp, 0);
+ hp->version = SVMDB_SHM_VERSION;
+ hp->namespaces[SVMDB_NAMESPACE_STRING]
+ = hash_create_string (0, sizeof (uword));
+ hp->namespaces[SVMDB_NAMESPACE_VEC]
+ = hash_create_string (0, sizeof (uword));
+
+ db_rp->user_ctx = hp;
+ client->shm = hp;
+
+ svm_pop_heap (oldheap);
+ region_unlock (client->db_rp);
+ client->pid = getpid ();
+
+ return (client);
}
-svmdb_client_t *svmdb_map (void)
+
+svmdb_client_t *
+svmdb_map (void)
{
- return svmdb_map_internal (0, 0);
+ return svmdb_map_internal (0, 0);
}
-svmdb_client_t *svmdb_map_size (uword size)
+svmdb_client_t *
+svmdb_map_size (uword size)
{
- return svmdb_map_internal (0, size);
+ return svmdb_map_internal (0, size);
}
-svmdb_client_t *svmdb_map_chroot (char *root_path)
+svmdb_client_t *
+svmdb_map_chroot (char *root_path)
{
- return svmdb_map_internal (root_path, 0);
+ return svmdb_map_internal (root_path, 0);
}
-svmdb_client_t *svmdb_map_chroot_size (char *root_path, uword size)
+svmdb_client_t *
+svmdb_map_chroot_size (char *root_path, uword size)
{
- return svmdb_map_internal (root_path, size);
+ return svmdb_map_internal (root_path, size);
}
-void svmdb_unmap (svmdb_client_t *client)
+void
+svmdb_unmap (svmdb_client_t * client)
{
- ASSERT(client);
+ ASSERT (client);
- if (! svm_get_root_rp())
- return;
+ if (!svm_get_root_rp ())
+ return;
- svm_region_unmap ((void *) client->db_rp);
- svm_region_exit ();
- vec_free(client);
+ svm_region_unmap ((void *) client->db_rp);
+ svm_region_exit ();
+ vec_free (client);
}
-static void notify_value (svmdb_value_t * v, svmdb_action_t a)
+static void
+notify_value (svmdb_value_t * v, svmdb_action_t a)
{
- int i;
- int rv;
- union sigval sv;
- u32 value;
- u32 *dead_registrations = 0;
-
- svmdb_notify_t *np;
-
- for (i = 0; i < vec_len (v->notifications); i++) {
- np = vec_elt_at_index (v->notifications, i);
- if (np->action == a) {
- value = (np->action<<28) | (np->opaque);
- sv.sival_ptr = (void *)(uword)value;
- do {
- rv = 0;
- if (sigqueue (np->pid, np->signum, sv) == 0)
- break;
- rv = errno;
- } while (rv == EAGAIN);
- if (rv == 0)
- continue;
- vec_add1 (dead_registrations, i);
- }
+ int i;
+ int rv;
+ union sigval sv;
+ u32 value;
+ u32 *dead_registrations = 0;
+
+ svmdb_notify_t *np;
+
+ for (i = 0; i < vec_len (v->notifications); i++)
+ {
+ np = vec_elt_at_index (v->notifications, i);
+ if (np->action == a)
+ {
+ value = (np->action << 28) | (np->opaque);
+ sv.sival_ptr = (void *) (uword) value;
+ do
+ {
+ rv = 0;
+ if (sigqueue (np->pid, np->signum, sv) == 0)
+ break;
+ rv = errno;
+ }
+ while (rv == EAGAIN);
+ if (rv == 0)
+ continue;
+ vec_add1 (dead_registrations, i);
+ }
}
- for (i = 0; i < vec_len (dead_registrations); i++) {
- np = vec_elt_at_index (v->notifications, dead_registrations[i]);
- clib_warning ("dead reg pid %d sig %d action %d opaque %x",
- np->pid, np->signum, np->action, np->opaque);
- vec_delete (v->notifications, 1, dead_registrations[i]);
+ for (i = 0; i < vec_len (dead_registrations); i++)
+ {
+ np = vec_elt_at_index (v->notifications, dead_registrations[i]);
+ clib_warning ("dead reg pid %d sig %d action %d opaque %x",
+ np->pid, np->signum, np->action, np->opaque);
+ vec_delete (v->notifications, 1, dead_registrations[i]);
}
- vec_free (dead_registrations);
+ vec_free (dead_registrations);
}
-int svmdb_local_add_del_notification (svmdb_client_t *client,
- svmdb_notification_args_t *a)
+int
+svmdb_local_add_del_notification (svmdb_client_t * client,
+ svmdb_notification_args_t * a)
{
- uword *h;
- void *oldheap;
- hash_pair_t *hp;
- svmdb_shm_hdr_t * shm;
- u8 *dummy_value = 0;
- svmdb_value_t *value;
- svmdb_notify_t *np;
- int i;
- int rv = 0;
-
- ASSERT (a->elsize);
-
- region_lock (client->db_rp, 18);
- shm = client->shm;
- oldheap = svm_push_data_heap (client->db_rp);
-
- h = shm->namespaces[a->nspace];
-
- hp = hash_get_pair_mem (h, a->var);
- if (hp == 0) {
- local_set_variable_nolock (client, a->nspace, (u8 *)a->var,
- dummy_value, a->elsize);
- /* might have moved */
- h = shm->namespaces[a->nspace];
- hp = hash_get_pair_mem (h, a->var);
- ASSERT(hp);
+ uword *h;
+ void *oldheap;
+ hash_pair_t *hp;
+ svmdb_shm_hdr_t *shm;
+ u8 *dummy_value = 0;
+ svmdb_value_t *value;
+ svmdb_notify_t *np;
+ int i;
+ int rv = 0;
+
+ ASSERT (a->elsize);
+
+ region_lock (client->db_rp, 18);
+ shm = client->shm;
+ oldheap = svm_push_data_heap (client->db_rp);
+
+ h = shm->namespaces[a->nspace];
+
+ hp = hash_get_pair_mem (h, a->var);
+ if (hp == 0)
+ {
+ local_set_variable_nolock (client, a->nspace, (u8 *) a->var,
+ dummy_value, a->elsize);
+ /* might have moved */
+ h = shm->namespaces[a->nspace];
+ hp = hash_get_pair_mem (h, a->var);
+ ASSERT (hp);
}
-
- value = pool_elt_at_index (shm->values, hp->value[0]);
-
- for (i = 0; i < vec_len (value->notifications); i++) {
- np = vec_elt_at_index (value->notifications, i);
- if ((np->pid == client->pid)
- && (np->signum == a->signum)
- && (np->action == a->action)
- && (np->opaque == a->opaque)) {
- if (a->add_del == 0 /* delete */) {
- vec_delete (value->notifications, 1, i);
- goto out;
- } else { /* add */
- clib_warning (
- "%s: ignore dup reg pid %d signum %d action %d opaque %x",
- a->var, client->pid, a->signum, a->action, a->opaque);
- rv = -2;
- goto out;
- }
- }
+
+ value = pool_elt_at_index (shm->values, hp->value[0]);
+
+ for (i = 0; i < vec_len (value->notifications); i++)
+ {
+ np = vec_elt_at_index (value->notifications, i);
+ if ((np->pid == client->pid)
+ && (np->signum == a->signum)
+ && (np->action == a->action) && (np->opaque == a->opaque))
+ {
+ if (a->add_del == 0 /* delete */ )
+ {
+ vec_delete (value->notifications, 1, i);
+ goto out;
+ }
+ else
+ { /* add */
+ clib_warning
+ ("%s: ignore dup reg pid %d signum %d action %d opaque %x",
+ a->var, client->pid, a->signum, a->action, a->opaque);
+ rv = -2;
+ goto out;
+ }
+ }
}
- if (a->add_del == 0) {
- rv = -3;
- goto out;
+ if (a->add_del == 0)
+ {
+ rv = -3;
+ goto out;
}
-
- vec_add2 (value->notifications, np, 1);
- np->pid = client->pid;
- np->signum = a->signum;
- np->action = a->action;
- np->opaque = a->opaque;
+
+ vec_add2 (value->notifications, np, 1);
+ np->pid = client->pid;
+ np->signum = a->signum;
+ np->action = a->action;
+ np->opaque = a->opaque;
out:
- svm_pop_heap(oldheap);
- region_unlock (client->db_rp);
- return rv;
+ svm_pop_heap (oldheap);
+ region_unlock (client->db_rp);
+ return rv;
}
-static void local_unset_variable_nolock (svmdb_client_t *client,
- svmdb_namespace_t namespace,
- char * var)
+static void
+local_unset_variable_nolock (svmdb_client_t * client,
+ svmdb_namespace_t namespace, char *var)
{
- uword *h;
- svmdb_value_t *oldvalue;
- hash_pair_t *hp;
-
- h = client->shm->namespaces[namespace];
- hp = hash_get_pair_mem (h, var);
- if (hp) {
- oldvalue = pool_elt_at_index (client->shm->values, hp->value[0]);
- if (vec_len (oldvalue->notifications))
- notify_value (oldvalue, SVMDB_ACTION_UNSET);
- /* zero length value means unset */
- _vec_len (oldvalue->value) = 0;
+ uword *h;
+ svmdb_value_t *oldvalue;
+ hash_pair_t *hp;
+
+ h = client->shm->namespaces[namespace];
+ hp = hash_get_pair_mem (h, var);
+ if (hp)
+ {
+ oldvalue = pool_elt_at_index (client->shm->values, hp->value[0]);
+ if (vec_len (oldvalue->notifications))
+ notify_value (oldvalue, SVMDB_ACTION_UNSET);
+ /* zero length value means unset */
+ _vec_len (oldvalue->value) = 0;
}
- client->shm->namespaces[namespace] = h;
+ client->shm->namespaces[namespace] = h;
}
-void svmdb_local_unset_string_variable (svmdb_client_t *client, char *var)
+void
+svmdb_local_unset_string_variable (svmdb_client_t * client, char *var)
{
- void *oldheap;
+ void *oldheap;
- region_lock (client->db_rp, 11);
- oldheap = svm_push_data_heap (client->db_rp);
- local_unset_variable_nolock (client, SVMDB_NAMESPACE_STRING, var);
- svm_pop_heap(oldheap);
- region_unlock (client->db_rp);
+ region_lock (client->db_rp, 11);
+ oldheap = svm_push_data_heap (client->db_rp);
+ local_unset_variable_nolock (client, SVMDB_NAMESPACE_STRING, var);
+ svm_pop_heap (oldheap);
+ region_unlock (client->db_rp);
}
-static void local_set_variable_nolock (svmdb_client_t *client,
- svmdb_namespace_t namespace,
- u8 * var, u8 * val, u32 elsize)
+static void
+local_set_variable_nolock (svmdb_client_t * client,
+ svmdb_namespace_t namespace,
+ u8 * var, u8 * val, u32 elsize)
{
- uword *h;
- hash_pair_t *hp;
- u8 *name;
- svmdb_shm_hdr_t * shm;
-
- shm = client->shm;
- h = shm->namespaces[namespace];
- hp = hash_get_pair_mem (h, var);
- if (hp) {
- svmdb_value_t * oldvalue;
- oldvalue = pool_elt_at_index (client->shm->values, hp->value[0]);
- vec_alloc (oldvalue->value, vec_len(val)*elsize);
- clib_memcpy (oldvalue->value, val, vec_len(val)*elsize);
- _vec_len (oldvalue->value) = vec_len(val);
- notify_value (oldvalue, SVMDB_ACTION_SET);
- } else {
- svmdb_value_t * newvalue;
- pool_get (shm->values, newvalue);
- memset (newvalue, 0, sizeof (*newvalue));
- newvalue->elsize = elsize;
- vec_alloc (newvalue->value, vec_len(val)*elsize);
- clib_memcpy (newvalue->value, val, vec_len(val)*elsize);
- _vec_len (newvalue->value) = vec_len(val);
- name = format (0, "%s%c", var, 0);
- hash_set_mem (h, name, newvalue - shm->values);
+ uword *h;
+ hash_pair_t *hp;
+ u8 *name;
+ svmdb_shm_hdr_t *shm;
+
+ shm = client->shm;
+ h = shm->namespaces[namespace];
+ hp = hash_get_pair_mem (h, var);
+ if (hp)
+ {
+ svmdb_value_t *oldvalue;
+ oldvalue = pool_elt_at_index (client->shm->values, hp->value[0]);
+ vec_alloc (oldvalue->value, vec_len (val) * elsize);
+ clib_memcpy (oldvalue->value, val, vec_len (val) * elsize);
+ _vec_len (oldvalue->value) = vec_len (val);
+ notify_value (oldvalue, SVMDB_ACTION_SET);
+ }
+ else
+ {
+ svmdb_value_t *newvalue;
+ pool_get (shm->values, newvalue);
+ memset (newvalue, 0, sizeof (*newvalue));
+ newvalue->elsize = elsize;
+ vec_alloc (newvalue->value, vec_len (val) * elsize);
+ clib_memcpy (newvalue->value, val, vec_len (val) * elsize);
+ _vec_len (newvalue->value) = vec_len (val);
+ name = format (0, "%s%c", var, 0);
+ hash_set_mem (h, name, newvalue - shm->values);
}
- shm->namespaces[namespace] = h;
+ shm->namespaces[namespace] = h;
}
-void svmdb_local_set_string_variable (svmdb_client_t *client,
- char *var, char *val)
+void
+svmdb_local_set_string_variable (svmdb_client_t * client,
+ char *var, char *val)
{
- void *oldheap;
+ void *oldheap;
- region_lock (client->db_rp, 12);
- oldheap = svm_push_data_heap (client->db_rp);
+ region_lock (client->db_rp, 12);
+ oldheap = svm_push_data_heap (client->db_rp);
- local_unset_variable_nolock (client, SVMDB_NAMESPACE_STRING, var);
+ local_unset_variable_nolock (client, SVMDB_NAMESPACE_STRING, var);
- local_set_variable_nolock (client, SVMDB_NAMESPACE_STRING,
- (u8 *) var, (u8 *) val, 1 /* elsize */);
- svm_pop_heap(oldheap);
- region_unlock (client->db_rp);
+ local_set_variable_nolock (client, SVMDB_NAMESPACE_STRING,
+ (u8 *) var, (u8 *) val, 1 /* elsize */ );
+ svm_pop_heap (oldheap);
+ region_unlock (client->db_rp);
}
-static u8 * local_get_variable_nolock (svmdb_client_t *client,
- svmdb_namespace_t namespace,
- u8 * var)
+static u8 *
+local_get_variable_nolock (svmdb_client_t * client,
+ svmdb_namespace_t namespace, u8 * var)
{
- uword *h;
- uword *p;
- svmdb_shm_hdr_t * shm;
- svmdb_value_t *oldvalue;
-
- shm = client->shm;
- h = shm->namespaces[namespace];
- p = hash_get_mem (h, var);
- if (p) {
- oldvalue = pool_elt_at_index (shm->values, p[0]);
- notify_value (oldvalue, SVMDB_ACTION_GET);
- return (oldvalue->value);
+ uword *h;
+ uword *p;
+ svmdb_shm_hdr_t *shm;
+ svmdb_value_t *oldvalue;
+
+ shm = client->shm;
+ h = shm->namespaces[namespace];
+ p = hash_get_mem (h, var);
+ if (p)
+ {
+ oldvalue = pool_elt_at_index (shm->values, p[0]);
+ notify_value (oldvalue, SVMDB_ACTION_GET);
+ return (oldvalue->value);
}
- return 0;
+ return 0;
}
-void *svmdb_local_get_variable_reference (svmdb_client_t *client,
- svmdb_namespace_t namespace,
- char *var)
+void *
+svmdb_local_get_variable_reference (svmdb_client_t * client,
+ svmdb_namespace_t namespace, char *var)
{
- u8 *rv;
+ u8 *rv;
- region_lock (client->db_rp, 19);
- rv = local_get_variable_nolock (client, namespace, (u8 *)var);
- region_unlock (client->db_rp);
- return (void *)rv;
+ region_lock (client->db_rp, 19);
+ rv = local_get_variable_nolock (client, namespace, (u8 *) var);
+ region_unlock (client->db_rp);
+ return (void *) rv;
}
-char *svmdb_local_get_string_variable (svmdb_client_t *client, char *var)
+char *
+svmdb_local_get_string_variable (svmdb_client_t * client, char *var)
{
- u8 *rv = 0;
+ u8 *rv = 0;
- region_lock (client->db_rp, 13);
- rv = local_get_variable_nolock (client, SVMDB_NAMESPACE_STRING, (u8 *) var);
+ region_lock (client->db_rp, 13);
+ rv = local_get_variable_nolock (client, SVMDB_NAMESPACE_STRING, (u8 *) var);
- if (rv && vec_len (rv)) {
- rv = format (0, "%s", rv);
- vec_add1(rv, 0);
+ if (rv && vec_len (rv))
+ {
+ rv = format (0, "%s", rv);
+ vec_add1 (rv, 0);
}
- region_unlock (client->db_rp);
- return ((char *) rv);
+ region_unlock (client->db_rp);
+ return ((char *) rv);
}
-void svmdb_local_dump_strings (svmdb_client_t *client)
+void
+svmdb_local_dump_strings (svmdb_client_t * client)
{
- uword *h;
- u8 *key;
- u32 value;
- svmdb_shm_hdr_t *shm = client->shm;
-
- region_lock (client->db_rp, 14);
-
- h = client->shm->namespaces [SVMDB_NAMESPACE_STRING];
-
- hash_foreach_mem(key, value, h,
- ({
- svmdb_value_t *v = pool_elt_at_index (shm->values, value);
-
- fformat(stdout, "%s: %s\n", key,
- vec_len(v->value) ? v->value : (u8 *)"(nil)");
- }));
- region_unlock (client->db_rp);
+ uword *h;
+ u8 *key;
+ u32 value;
+ svmdb_shm_hdr_t *shm = client->shm;
+
+ region_lock (client->db_rp, 14);
+
+ h = client->shm->namespaces[SVMDB_NAMESPACE_STRING];
+
+ /* *INDENT-OFF* */
+ hash_foreach_mem(key, value, h,
+ ({
+ svmdb_value_t *v = pool_elt_at_index (shm->values, value);
+
+ fformat(stdout, "%s: %s\n", key,
+ vec_len(v->value) ? v->value : (u8 *)"(nil)");
+ }));
+ /* *INDENT-ON* */
+ region_unlock (client->db_rp);
}
-void svmdb_local_unset_vec_variable (svmdb_client_t *client, char *var)
+void
+svmdb_local_unset_vec_variable (svmdb_client_t * client, char *var)
{
- void *oldheap;
+ void *oldheap;
- region_lock (client->db_rp, 15);
- oldheap = svm_push_data_heap (client->db_rp);
- local_unset_variable_nolock (client, SVMDB_NAMESPACE_VEC, var);
- svm_pop_heap(oldheap);
- region_unlock (client->db_rp);
+ region_lock (client->db_rp, 15);
+ oldheap = svm_push_data_heap (client->db_rp);
+ local_unset_variable_nolock (client, SVMDB_NAMESPACE_VEC, var);
+ svm_pop_heap (oldheap);
+ region_unlock (client->db_rp);
}
-void svmdb_local_set_vec_variable (svmdb_client_t *client,
- char *var, void *val_arg, u32 elsize)
+void
+svmdb_local_set_vec_variable (svmdb_client_t * client,
+ char *var, void *val_arg, u32 elsize)
{
- u8 *val = (u8 *)val_arg;
- void *oldheap;
+ u8 *val = (u8 *) val_arg;
+ void *oldheap;
- region_lock (client->db_rp, 16);
- oldheap = svm_push_data_heap (client->db_rp);
+ region_lock (client->db_rp, 16);
+ oldheap = svm_push_data_heap (client->db_rp);
- local_unset_variable_nolock (client, SVMDB_NAMESPACE_VEC, var);
- local_set_variable_nolock (client, SVMDB_NAMESPACE_VEC, (u8 *) var,
- val, elsize);
+ local_unset_variable_nolock (client, SVMDB_NAMESPACE_VEC, var);
+ local_set_variable_nolock (client, SVMDB_NAMESPACE_VEC, (u8 *) var,
+ val, elsize);
- svm_pop_heap(oldheap);
- region_unlock (client->db_rp);
+ svm_pop_heap (oldheap);
+ region_unlock (client->db_rp);
}
-void *svmdb_local_get_vec_variable (svmdb_client_t *client, char *var,
- u32 elsize)
+void *
+svmdb_local_get_vec_variable (svmdb_client_t * client, char *var, u32 elsize)
{
- u8 *rv = 0;
- u8 *copy = 0;
+ u8 *rv = 0;
+ u8 *copy = 0;
- region_lock (client->db_rp, 17);
+ region_lock (client->db_rp, 17);
- rv = local_get_variable_nolock (client, SVMDB_NAMESPACE_VEC, (u8 *) var);
+ rv = local_get_variable_nolock (client, SVMDB_NAMESPACE_VEC, (u8 *) var);
- if (rv && vec_len(rv)) {
- /* Make a copy in process-local memory */
- vec_alloc (copy, vec_len(rv)*elsize);
- clib_memcpy (copy, rv, vec_len(rv)*elsize);
- _vec_len(copy) = vec_len(rv);
- region_unlock (client->db_rp);
- return (copy);
+ if (rv && vec_len (rv))
+ {
+ /* Make a copy in process-local memory */
+ vec_alloc (copy, vec_len (rv) * elsize);
+ clib_memcpy (copy, rv, vec_len (rv) * elsize);
+ _vec_len (copy) = vec_len (rv);
+ region_unlock (client->db_rp);
+ return (copy);
}
- region_unlock (client->db_rp);
- return (0);
+ region_unlock (client->db_rp);
+ return (0);
}
-void svmdb_local_dump_vecs (svmdb_client_t *client)
+void
+svmdb_local_dump_vecs (svmdb_client_t * client)
{
- uword *h;
- u8 *key;
- u32 value;
- svmdb_shm_hdr_t *shm;
-
- region_lock (client->db_rp, 17);
- shm = client->shm;
+ uword *h;
+ u8 *key;
+ u32 value;
+ svmdb_shm_hdr_t *shm;
+
+ region_lock (client->db_rp, 17);
+ shm = client->shm;
+
+ h = client->shm->namespaces[SVMDB_NAMESPACE_VEC];
+
+ /* *INDENT-OFF* */
+ hash_foreach_mem(key, value, h,
+ ({
+ svmdb_value_t *v = pool_elt_at_index (shm->values, value);
+ (void) fformat(stdout, "%s:\n %U (%.2f)\n", key,
+ format_hex_bytes, v->value,
+ vec_len(v->value)*v->elsize, ((f64 *)(v->value))[0]);
+ }));
+ /* *INDENT-ON* */
+
+ region_unlock (client->db_rp);
+}
- h = client->shm->namespaces [SVMDB_NAMESPACE_VEC];
+void *
+svmdb_local_find_or_add_vec_variable (svmdb_client_t * client,
+ char *var, u32 nbytes)
+{
+ void *oldheap;
+ u8 *rv = 0;
- hash_foreach_mem(key, value, h,
- ({
- svmdb_value_t *v = pool_elt_at_index (shm->values, value);
- (void) fformat(stdout, "%s:\n %U (%.2f)\n", key,
- format_hex_bytes, v->value,
- vec_len(v->value)*v->elsize, ((f64 *)(v->value))[0]);
- }));
+ region_lock (client->db_rp, 18);
+ oldheap = svm_push_data_heap (client->db_rp);
- region_unlock (client->db_rp);
-}
+ rv = local_get_variable_nolock (client, SVMDB_NAMESPACE_VEC, (u8 *) var);
-void *svmdb_local_find_or_add_vec_variable (svmdb_client_t *client,
- char *var, u32 nbytes)
-{
- void *oldheap;
- u8 *rv = 0;
-
- region_lock (client->db_rp, 18);
- oldheap = svm_push_data_heap (client->db_rp);
-
- rv = local_get_variable_nolock (client, SVMDB_NAMESPACE_VEC, (u8 *)var);
-
- if (rv) {
- goto out;
- } else {
- uword *h;
- u8 *name;
- svmdb_shm_hdr_t * shm;
- svmdb_value_t * newvalue;
-
- shm = client->shm;
- h = shm->namespaces[SVMDB_NAMESPACE_VEC];
-
- pool_get (shm->values, newvalue);
- memset (newvalue, 0, sizeof (*newvalue));
- newvalue->elsize = 1;
- vec_alloc (newvalue->value, nbytes);
- _vec_len (newvalue->value) = nbytes;
- name = format (0, "%s%c", var, 0);
- hash_set_mem (h, name, newvalue - shm->values);
- shm->namespaces[SVMDB_NAMESPACE_VEC] = h;
- rv = newvalue->value;
+ if (rv)
+ {
+ goto out;
+ }
+ else
+ {
+ uword *h;
+ u8 *name;
+ svmdb_shm_hdr_t *shm;
+ svmdb_value_t *newvalue;
+
+ shm = client->shm;
+ h = shm->namespaces[SVMDB_NAMESPACE_VEC];
+
+ pool_get (shm->values, newvalue);
+ memset (newvalue, 0, sizeof (*newvalue));
+ newvalue->elsize = 1;
+ vec_alloc (newvalue->value, nbytes);
+ _vec_len (newvalue->value) = nbytes;
+ name = format (0, "%s%c", var, 0);
+ hash_set_mem (h, name, newvalue - shm->values);
+ shm->namespaces[SVMDB_NAMESPACE_VEC] = h;
+ rv = newvalue->value;
}
out:
- svm_pop_heap(oldheap);
- region_unlock (client->db_rp);
- return (rv);
+ svm_pop_heap (oldheap);
+ region_unlock (client->db_rp);
+ return (rv);
}
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */