session: segment manager refactor

- use valloc as a 'central' segment baseva manager
- use per segment manager segment pools and use rwlocks to guard them
- add session test that exercises segment creation
- embed segment manager properties into application since they're shared
- fix rw locks

Change-Id: I761164c147275d9e8a926f1eda395e090d231f9a
Signed-off-by: Florin Coras <fcoras@cisco.com>
diff --git a/src/vnet/session-apps/echo_client.c b/src/vnet/session-apps/echo_client.c
index c38b533..27e253a 100644
--- a/src/vnet/session-apps/echo_client.c
+++ b/src/vnet/session-apps/echo_client.c
@@ -413,13 +413,21 @@
   return 0;
 }
 
+int
+echo_client_add_segment_callback (u32 client_index, const ssvm_private_t * sp)
+{
+  /* New heaps may be added */
+  return 0;
+}
+
 /* *INDENT-OFF* */
 static session_cb_vft_t echo_clients = {
   .session_reset_callback = echo_clients_session_reset_callback,
   .session_connected_callback = echo_clients_session_connected_callback,
   .session_accept_callback = echo_clients_session_create_callback,
   .session_disconnect_callback = echo_clients_session_disconnect_callback,
-  .builtin_server_rx_callback = echo_clients_rx_callback
+  .builtin_server_rx_callback = echo_clients_rx_callback,
+  .add_segment_callback = echo_client_add_segment_callback
 };
 /* *INDENT-ON* */
 
@@ -445,6 +453,7 @@
 
   options[APP_OPTIONS_ACCEPT_COOKIE] = 0x12345678;
   options[APP_OPTIONS_SEGMENT_SIZE] = segment_size;
+  options[APP_OPTIONS_ADD_SEGMENT_SIZE] = segment_size;
   options[APP_OPTIONS_RX_FIFO_SIZE] = ecm->fifo_size;
   options[APP_OPTIONS_TX_FIFO_SIZE] = ecm->fifo_size;
   options[APP_OPTIONS_PRIVATE_SEGMENT_COUNT] = ecm->private_segment_count;
@@ -625,7 +634,7 @@
       else if (unformat (input, "test-bytes"))
 	ecm->test_bytes = 1;
       else
-	return clib_error_return (0, "unknown input `%U'",
+	return clib_error_return (0, "failed: unknown input `%U'",
 				  format_unformat_error, input);
     }