diff options
Diffstat (limited to 'svm/persist.c')
-rw-r--r-- | svm/persist.c | 336 |
1 files changed, 179 insertions, 157 deletions
diff --git a/svm/persist.c b/svm/persist.c index 591072dfd59..023c596b9cf 100644 --- a/svm/persist.c +++ b/svm/persist.c @@ -1,4 +1,4 @@ -/* +/* *------------------------------------------------------------------ * persist.c - persistent data structure storage test / demo code * @@ -42,195 +42,217 @@ #include <vppinfra/serialize.h> #include <svmdb.h> -typedef struct { - svmdb_client_t *c; +typedef struct +{ + svmdb_client_t *c; } persist_main_t; persist_main_t persist_main; -typedef struct { - u8 * string1; - u8 * string2; +typedef struct +{ + u8 *string1; + u8 *string2; } demo_struct2_t; -typedef struct { - demo_struct2_t * demo2; - u8 * name; +typedef struct +{ + demo_struct2_t *demo2; + u8 *name; } demo_struct1_t; -/* +/* * Data structures in persistent shared memory, all the time */ -clib_error_t * persist_malloc (persist_main_t * pm) +clib_error_t * +persist_malloc (persist_main_t * pm) { - demo_struct2_t *demo2; - demo_struct1_t *demo1; - time_t starttime = time(0); - char *datestring = ctime(&starttime); - void *oldheap; - - /* Get back the root pointer */ - demo1 = svmdb_local_get_variable_reference - (pm->c, SVMDB_NAMESPACE_VEC, "demo1_location"); - - /* It doesnt exist create our data structures */ - if (demo1 == 0) { - /* If you want MP / thread safety, lock the region... */ - pthread_mutex_lock(&pm->c->db_rp->mutex); - - /* Switch to the shared memory region heap */ - oldheap = svm_push_data_heap (pm->c->db_rp); - - /* Allocate the top-level structure as a single element vector */ - vec_validate (demo1, 0); - - /* Allocate the next-level structure as a plain old memory obj */ - demo2 = clib_mem_alloc (sizeof (*demo2)); - - demo1->demo2 = demo2; - demo1->name = format (0, "My name is Ishmael%c", 0); - demo2->string1 = format (0, "Here is string1%c", 0); - demo2->string2 = format (0, "Born at %s%c", datestring, 0); - - /* Back to the process-private heap */ - svm_pop_heap(oldheap); - pthread_mutex_unlock(&pm->c->db_rp->mutex); - - /* - * Set the root pointer. Note: this guy switches heaps, locks, etc. - * We allocated demo1 as a vector to make this "just work..." - */ - svmdb_local_set_vec_variable (pm->c, "demo1_location", - demo1, sizeof (demo1)); + demo_struct2_t *demo2; + demo_struct1_t *demo1; + time_t starttime = time (0); + char *datestring = ctime (&starttime); + void *oldheap; + + /* Get back the root pointer */ + demo1 = svmdb_local_get_variable_reference + (pm->c, SVMDB_NAMESPACE_VEC, "demo1_location"); + + /* It doesnt exist create our data structures */ + if (demo1 == 0) + { + /* If you want MP / thread safety, lock the region... */ + pthread_mutex_lock (&pm->c->db_rp->mutex); + + /* Switch to the shared memory region heap */ + oldheap = svm_push_data_heap (pm->c->db_rp); + + /* Allocate the top-level structure as a single element vector */ + vec_validate (demo1, 0); + + /* Allocate the next-level structure as a plain old memory obj */ + demo2 = clib_mem_alloc (sizeof (*demo2)); + + demo1->demo2 = demo2; + demo1->name = format (0, "My name is Ishmael%c", 0); + demo2->string1 = format (0, "Here is string1%c", 0); + demo2->string2 = format (0, "Born at %s%c", datestring, 0); + + /* Back to the process-private heap */ + svm_pop_heap (oldheap); + pthread_mutex_unlock (&pm->c->db_rp->mutex); + + /* + * Set the root pointer. Note: this guy switches heaps, locks, etc. + * We allocated demo1 as a vector to make this "just work..." + */ + svmdb_local_set_vec_variable (pm->c, "demo1_location", + demo1, sizeof (demo1)); } - else { - /* retrieve and print data from shared memory */ - demo2 = demo1->demo2; - fformat (stdout, "name: %s\n", demo1->name); - fformat (stdout, "demo2 location: %llx\n", demo2); - fformat (stdout, "string1: %s\n", demo2->string1); - fformat (stdout, "string2: %s\n", demo2->string2); + else + { + /* retrieve and print data from shared memory */ + demo2 = demo1->demo2; + fformat (stdout, "name: %s\n", demo1->name); + fformat (stdout, "demo2 location: %llx\n", demo2); + fformat (stdout, "string1: %s\n", demo2->string1); + fformat (stdout, "string2: %s\n", demo2->string2); } - return 0; + return 0; } -void unserialize_demo1 (serialize_main_t *sm, va_list * args) +void +unserialize_demo1 (serialize_main_t * sm, va_list * args) { - demo_struct1_t ** result = va_arg (*args, demo_struct1_t **); - demo_struct1_t * demo1; - demo_struct2_t * demo2; - - /* Allocate data structures in process private memory */ - demo1 = clib_mem_alloc (sizeof (*demo1)); - demo2 = clib_mem_alloc (sizeof (*demo2)); - demo1->demo2 = demo2; - - /* retrieve data from shared memory checkpoint */ - unserialize_cstring (sm, (char **) &demo1->name); - unserialize_cstring (sm, (char **) &demo2->string1); - unserialize_cstring (sm, (char **) &demo2->string2); - *result = demo1; + demo_struct1_t **result = va_arg (*args, demo_struct1_t **); + demo_struct1_t *demo1; + demo_struct2_t *demo2; + + /* Allocate data structures in process private memory */ + demo1 = clib_mem_alloc (sizeof (*demo1)); + demo2 = clib_mem_alloc (sizeof (*demo2)); + demo1->demo2 = demo2; + + /* retrieve data from shared memory checkpoint */ + unserialize_cstring (sm, (char **) &demo1->name); + unserialize_cstring (sm, (char **) &demo2->string1); + unserialize_cstring (sm, (char **) &demo2->string2); + *result = demo1; } -void serialize_demo1 (serialize_main_t *sm, va_list * args) +void +serialize_demo1 (serialize_main_t * sm, va_list * args) { - demo_struct1_t * demo1 = va_arg (*args, demo_struct1_t *); - demo_struct2_t * demo2 = demo1->demo2; + demo_struct1_t *demo1 = va_arg (*args, demo_struct1_t *); + demo_struct2_t *demo2 = demo1->demo2; - serialize_cstring (sm, (char *)demo1->name); - serialize_cstring (sm, (char *)demo2->string1); - serialize_cstring (sm, (char *)demo2->string2); -} + serialize_cstring (sm, (char *) demo1->name); + serialize_cstring (sm, (char *) demo2->string1); + serialize_cstring (sm, (char *) demo2->string2); +} /* Serialize / unserialize variant */ -clib_error_t * +clib_error_t * persist_serialize (persist_main_t * pm) { - u8 * checkpoint; - serialize_main_t sm; - - demo_struct2_t *demo2; - demo_struct1_t *demo1; - time_t starttime = time(0); - char *datestring = ctime(&starttime); - - /* Get back the root pointer */ - checkpoint = svmdb_local_get_vec_variable (pm->c, "demo1_checkpoint", - sizeof (u8)); - - /* It doesnt exist create our data structures */ - if (checkpoint == 0) { - /* Allocate data structures in process-private memory */ - demo1 = clib_mem_alloc (sizeof (*demo2)); - vec_validate (demo1, 0); - demo2 = clib_mem_alloc (sizeof (*demo2)); - - demo1->demo2 = demo2; - demo1->name = format (0, "My name is Ishmael%c", 0); - demo2->string1 = format (0, "Here is string1%c", 0); - demo2->string2 = format (0, "Born at %s%c", datestring, 0); - - /* Create checkpoint */ - serialize_open_vector (&sm, checkpoint); - serialize (&sm, serialize_demo1, demo1); - checkpoint = serialize_close_vector (&sm); - - /* Copy checkpoint into shared memory */ - svmdb_local_set_vec_variable (pm->c, "demo1_checkpoint", - checkpoint, sizeof (u8)); - /* Toss the process-private-memory original.. */ - vec_free (checkpoint); + u8 *checkpoint; + serialize_main_t sm; + + demo_struct2_t *demo2; + demo_struct1_t *demo1; + time_t starttime = time (0); + char *datestring = ctime (&starttime); + + /* Get back the root pointer */ + checkpoint = svmdb_local_get_vec_variable (pm->c, "demo1_checkpoint", + sizeof (u8)); + + /* It doesnt exist create our data structures */ + if (checkpoint == 0) + { + /* Allocate data structures in process-private memory */ + demo1 = clib_mem_alloc (sizeof (*demo2)); + vec_validate (demo1, 0); + demo2 = clib_mem_alloc (sizeof (*demo2)); + + demo1->demo2 = demo2; + demo1->name = format (0, "My name is Ishmael%c", 0); + demo2->string1 = format (0, "Here is string1%c", 0); + demo2->string2 = format (0, "Born at %s%c", datestring, 0); + + /* Create checkpoint */ + serialize_open_vector (&sm, checkpoint); + serialize (&sm, serialize_demo1, demo1); + checkpoint = serialize_close_vector (&sm); + + /* Copy checkpoint into shared memory */ + svmdb_local_set_vec_variable (pm->c, "demo1_checkpoint", + checkpoint, sizeof (u8)); + /* Toss the process-private-memory original.. */ + vec_free (checkpoint); } - else { - /* Open the checkpoint */ - unserialize_open_data (&sm, checkpoint, vec_len (checkpoint)); - unserialize (&sm, unserialize_demo1, &demo1); - - /* Toss the process-private-memory checkpoint copy */ - vec_free (checkpoint); - - /* Off we go... */ - demo2 = demo1->demo2; - fformat (stdout, "name: %s\n", demo1->name); - fformat (stdout, "demo2 location: %llx\n", demo2); - fformat (stdout, "string1: %s\n", demo2->string1); - fformat (stdout, "string2: %s\n", demo2->string2); + else + { + /* Open the checkpoint */ + unserialize_open_data (&sm, checkpoint, vec_len (checkpoint)); + unserialize (&sm, unserialize_demo1, &demo1); + + /* Toss the process-private-memory checkpoint copy */ + vec_free (checkpoint); + + /* Off we go... */ + demo2 = demo1->demo2; + fformat (stdout, "name: %s\n", demo1->name); + fformat (stdout, "demo2 location: %llx\n", demo2); + fformat (stdout, "string1: %s\n", demo2->string1); + fformat (stdout, "string2: %s\n", demo2->string2); } - return 0; + return 0; } -int main (int argc, char **argv) +int +main (int argc, char **argv) { - unformat_input_t _input, *input=&_input; - persist_main_t * pm = &persist_main; - clib_error_t * error = 0; - - /* Make a 4mb database arena, chroot so it's truly private */ - pm->c = svmdb_map_chroot_size ("/ptest", 4<<20); - - ASSERT(pm->c); - - unformat_init_command_line (input, argv); - - while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) { - if (unformat (input, "malloc")) - error = persist_malloc (pm); - else if (unformat (input, "serialize")) - error = persist_serialize (pm); - else { - error = clib_error_return (0, "Unknown flavor '%U'", - format_unformat_error, input); - break; - } + unformat_input_t _input, *input = &_input; + persist_main_t *pm = &persist_main; + clib_error_t *error = 0; + + /* Make a 4mb database arena, chroot so it's truly private */ + pm->c = svmdb_map_chroot_size ("/ptest", 4 << 20); + + ASSERT (pm->c); + + unformat_init_command_line (input, argv); + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "malloc")) + error = persist_malloc (pm); + else if (unformat (input, "serialize")) + error = persist_serialize (pm); + else + { + error = clib_error_return (0, "Unknown flavor '%U'", + format_unformat_error, input); + break; + } } - svmdb_unmap (pm->c); + svmdb_unmap (pm->c); - if (error) { - clib_error_report (error); - exit (1); + if (error) + { + clib_error_report (error); + exit (1); } - return 0; + return 0; } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ |