api: remove clib_mem_init from vppapiclient contructor 14/29114/2
authorOle Troan <ot@cisco.com>
Mon, 28 Sep 2020 14:15:18 +0000 (16:15 +0200)
committerDamjan Marion <dmarion@me.com>
Mon, 28 Sep 2020 16:17:25 +0000 (16:17 +0000)
Having the constructor in the vppapiclient library led to
conflicts with applications wanting to allocate their own heap.
Note: Change of behaviour, applications that do not use a CLIB
heap must now call vac_mem_init() before using any functions from
vppapiclient.

Type: fix
Signed-off-by: Ole Troan <ot@cisco.com>
Change-Id: Ib155a54579ea5a0dbc26cb4b6daca1274e1dfdfa

src/vpp-api/client/client.c
src/vpp-api/client/vppapiclient.h
src/vpp-api/python/vpp_papi/vpp_transport_shmem.py

index 5dcca22..0d7b1dc 100644 (file)
@@ -12,6 +12,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stddef.h>
@@ -78,29 +79,6 @@ u16 read_timeout = 0;
 bool rx_is_running = false;
 bool timeout_thread_cancelled = false;
 
-/* Set to true to enable memory tracing */
-bool mem_trace = false;
-
-__attribute__((constructor))
-static void
-vac_client_constructor (void)
-{
-  clib_mem_init (0, 1 << 30);
-  if (mem_trace)
-    clib_mem_trace (1);
-}
-
-__attribute__((destructor))
-static void
-vac_client_destructor (void)
-{
-  if (mem_trace)
-    fformat(stderr, "TRACE: %s",
-           format (0, "%U\n",
-                   format_mheap, clib_mem_get_heap (), 1));
-}
-
-
 static void
 init (void)
 {
@@ -308,12 +286,13 @@ vac_msg_table_size(void)
 
 int
 vac_connect (char * name, char * chroot_prefix, vac_callback_t cb,
-               int rx_qlen)
+             int rx_qlen)
 {
   rx_thread_done = false;
   int rv = 0;
   vac_main_t *pm = &vac_main;
 
+  assert (clib_mem_get_heap ());
   init();
   if (chroot_prefix != NULL)
     vl_set_memory_root_path (chroot_prefix);
@@ -575,5 +554,18 @@ vac_msg_table_max_index(void)
 void
 vac_set_error_handler (vac_error_callback_t cb)
 {
+  assert (clib_mem_get_heap ());
   if (cb) clib_error_register_handler (cb, 0);
 }
+
+/*
+ * Required if application doesn't use a VPP heap.
+ */
+void
+vac_mem_init (size_t size)
+{
+  if (size == 0)
+    clib_mem_init (0, 1 << 30);  // default
+  else
+    clib_mem_init (0, size);
+}
index 839ec1f..680003e 100644 (file)
@@ -16,6 +16,7 @@
 #define included_vppapiclient_h
 
 #include <stdint.h>
+#include <stdbool.h>
 
 typedef void (*vac_callback_t)(unsigned char * data, int len);
 typedef void (*vac_error_callback_t)(void *, unsigned char *, int);
@@ -33,4 +34,6 @@ int vac_msg_table_max_index(void);
 void vac_rx_suspend (void);
 void vac_rx_resume (void);
 void vac_set_error_handler(vac_error_callback_t);
+void vac_mem_init (size_t size);
+
 #endif
index 2563a6e..fbf19e4 100644 (file)
@@ -24,7 +24,8 @@ int vac_msg_table_max_index(void);
 void vac_rx_suspend (void);
 void vac_rx_resume (void);
 void vac_set_error_handler(vac_error_callback_t);
- """)
+void vac_mem_init (size_t size);
+""")
 
 vpp_object = None
 
@@ -67,6 +68,8 @@ class VppTransport(object):
         global vpp_object
         vpp_object = parent
 
+        vpp_api.vac_mem_init(0);
+
         # Register error handler
         vpp_api.vac_set_error_handler(vac_error_handler)