Cleanly destroy all allocated resources.
https://bugs.linaro.org/show_bug.cgi?id=1706

Signed-off-by: Maxim Uvarov <[email protected]>
---
 example/classifier/odp_classifier.c | 45 ++++++++++++++++++++++++++++---------
 1 file changed, 34 insertions(+), 11 deletions(-)

diff --git a/example/classifier/odp_classifier.c 
b/example/classifier/odp_classifier.c
index 2f47e74..abf3d26 100644
--- a/example/classifier/odp_classifier.c
+++ b/example/classifier/odp_classifier.c
@@ -81,6 +81,8 @@ enum packet_mode {
        APPL_MODE_REPLY         /**< Packet is sent back */
 };
 
+static int shutdown; /**< Shutdown threads if !0 */
+
 /* helper funcs */
 static int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned len);
 static void swap_pkt_addrs(odp_packet_t pkt_tbl[], unsigned len);
@@ -270,8 +272,12 @@ static void *pktio_receive_thread(void *arg)
        for (;;) {
                odp_pktio_t pktio_tmp;
 
+               if (shutdown)
+                       break;
+
                /* Use schedule to get buf from any input queue */
-               ev = odp_schedule(&queue, ODP_SCHED_WAIT);
+               ev = odp_schedule(&queue,
+                                 odp_schedule_wait_time(ODP_TIME_SEC_IN_NS));
 
                /* Loop back to receive packets incase of invalid event */
                if (odp_unlikely(ev == ODP_EVENT_INVALID))
@@ -397,7 +403,7 @@ static void configure_cos(odp_cos_t default_cos, 
appl_args_t *args)
        global_statistics *stats;
        odp_queue_param_t qparam;
 
-       for (i = 0; i < args->policy_count; i++) {
+       for (i = 0; i < args->policy_count - 1; i++) {
                stats = &args->stats[i];
 
                odp_queue_param_init(&qparam);
@@ -475,6 +481,7 @@ int main(int argc, char *argv[])
        appl_args_t *args;
        odp_cos_t default_cos;
        odp_shm_t shm;
+       int ret;
 
        /* Init ODP before calling anything else */
        if (odp_init_global(NULL, NULL)) {
@@ -573,21 +580,37 @@ int main(int argc, char *argv[])
 
        print_cls_statistics(args);
 
+       odp_pktio_stop(pktio);
+       shutdown = 1;
+       odph_linux_pthread_join(thread_tbl, num_workers);
+
        for (i = 0; i < args->policy_count; i++) {
-               odp_cls_pmr_destroy(args->stats[i].pmr);
-               odp_cos_destroy(args->stats[i].cos);
-               odp_pool_destroy(args->stats[i].pool);
-               odp_queue_destroy(args->stats[i].queue);
-               odp_pool_destroy(args->stats[i].pool);
+               if ((i !=  args->policy_count - 1) &&
+                   odp_cls_pmr_destroy(args->stats[i].pmr))
+                       EXAMPLE_ERR("err: odp_cls_pmr_destroy for %d\n", i);
+               if (odp_cos_destroy(args->stats[i].cos))
+                       EXAMPLE_ERR("err: odp_cos_destroy for %d\n", i);
+               if (odp_queue_destroy(args->stats[i].queue))
+                       EXAMPLE_ERR("err: odp_queue_destroy for %d\n", i);
+               if (odp_pool_destroy(args->stats[i].pool))
+                       EXAMPLE_ERR("err: odp_pool_destroy for %d\n", i);
        }
 
        free(args->if_name);
        odp_shm_free(shm);
-       odp_pktio_close(pktio);
-       odp_pool_destroy(pool);
+       if (odp_pktio_close(pktio))
+               EXAMPLE_ERR("err: close pktio error\n");
+       if (odp_pool_destroy(pool))
+               EXAMPLE_ERR("err: odp_pool_destroy error\n");
+
+       ret = odp_term_local();
+       if (ret)
+               EXAMPLE_ERR("odp_term_local error %d\n", ret);
+       ret = odp_term_global();
+       if (ret)
+               EXAMPLE_ERR("odp_term_global error %d\n", ret);
        printf("Exit\n\n");
-
-       return 0;
+       return ret;
 }
 
 /**
-- 
2.7.1.250.gff4ea60

_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to