Add _ring_destroy() to release shared memory allocated by _ring_create() calls. previously this was accomplished by manually odp_shm_lookup() and odp_shm_free().
Signed-off-by: Yi He <yi...@linaro.org> --- .../include/odp_packet_io_ring_internal.h | 8 +++++ platform/linux-generic/pktio/ipc.c | 34 +++++++++++++--------- platform/linux-generic/pktio/ring.c | 17 +++++++++++ platform/linux-generic/test/ring/ring_basic.c | 3 ++ platform/linux-generic/test/ring/ring_stress.c | 1 + 5 files changed, 49 insertions(+), 14 deletions(-) diff --git a/platform/linux-generic/include/odp_packet_io_ring_internal.h b/platform/linux-generic/include/odp_packet_io_ring_internal.h index 90d2216..f1188c3 100644 --- a/platform/linux-generic/include/odp_packet_io_ring_internal.h +++ b/platform/linux-generic/include/odp_packet_io_ring_internal.h @@ -201,6 +201,14 @@ _ring_t *_ring_create(const char *name, unsigned count, unsigned flags); /** + * Destroy the ring created with *name*. + * + * @param name name of the ring to be destroyed. + * @return 0 on success and negative value on error. + */ +int _ring_destroy(const char *name); + +/** * Change the high water mark. * * If *count* is 0, water marking is disabled. Otherwise, it is set to the diff --git a/platform/linux-generic/pktio/ipc.c b/platform/linux-generic/pktio/ipc.c index e11da86..0845f41 100644 --- a/platform/linux-generic/pktio/ipc.c +++ b/platform/linux-generic/pktio/ipc.c @@ -141,7 +141,6 @@ static int _ipc_init_master(pktio_entry_t *pktio_entry, uint32_t pool_id; struct pktio_info *pinfo; const char *pool_name; - odp_shm_t shm; pool_id = pool_handle_to_index(pool); pool_entry = get_pool_entry(pool_id); @@ -230,16 +229,13 @@ static int _ipc_init_master(pktio_entry_t *pktio_entry, free_s_prod: snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_prod", dev); - shm = odp_shm_lookup(ipc_shm_name); - odp_shm_free(shm); + _ring_destroy(ipc_shm_name); free_m_cons: snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_cons", dev); - shm = odp_shm_lookup(ipc_shm_name); - odp_shm_free(shm); + _ring_destroy(ipc_shm_name); free_m_prod: snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_prod", dev); - shm = odp_shm_lookup(ipc_shm_name); - odp_shm_free(shm); + _ring_destroy(ipc_shm_name); return -1; } @@ -709,16 +705,26 @@ static int ipc_stop(pktio_entry_t *pktio_entry) static int ipc_close(pktio_entry_t *pktio_entry) { - ipc_stop(pktio_entry); + odp_shm_t shm; + char ipc_shm_name[ODP_POOL_NAME_LEN + sizeof("_m_prod")]; + char *dev = pktio_entry->s.name; - if (pktio_entry->s.ipc.type == PKTIO_TYPE_IPC_MASTER) { - char ipc_shm_name[ODP_POOL_NAME_LEN + sizeof("_m_prod")]; - char *dev = pktio_entry->s.name; - odp_shm_t shm; + ipc_stop(pktio_entry); - /* unlink this pktio info */ - odp_shm_free(pktio_entry->s.ipc.pinfo_shm); + /* unlink this pktio info for both master and slave */ + odp_shm_free(pktio_entry->s.ipc.pinfo_shm); + if (pktio_entry->s.ipc.type == PKTIO_TYPE_IPC_MASTER) { + /* destroy rings */ + snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_cons", dev); + _ring_destroy(ipc_shm_name); + snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_prod", dev); + _ring_destroy(ipc_shm_name); + snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_cons", dev); + _ring_destroy(ipc_shm_name); + snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_prod", dev); + _ring_destroy(ipc_shm_name); + } else { /* unlink rings */ snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_cons", dev); shm = odp_shm_lookup(ipc_shm_name); diff --git a/platform/linux-generic/pktio/ring.c b/platform/linux-generic/pktio/ring.c index d2f16a5..ec27f2c 100644 --- a/platform/linux-generic/pktio/ring.c +++ b/platform/linux-generic/pktio/ring.c @@ -209,6 +209,23 @@ _ring_create(const char *name, unsigned count, unsigned flags) return r; } +int _ring_destroy(const char *name) +{ + odp_shm_t shm = odp_shm_lookup(name); + + if (shm != ODP_SHM_INVALID) { + _ring_t *r = odp_shm_addr(shm); + + odp_rwlock_write_lock(&qlock); + if (!(r->flags & _RING_NO_LIST)) + TAILQ_REMOVE(&odp_ring_list, r, next); + odp_rwlock_write_unlock(&qlock); + + return odp_shm_free(shm); + } + return 0; +} + /* * change the high water mark. If *count* is 0, water marking is * disabled diff --git a/platform/linux-generic/test/ring/ring_basic.c b/platform/linux-generic/test/ring/ring_basic.c index 19e24f1..926dc46 100644 --- a/platform/linux-generic/test/ring/ring_basic.c +++ b/platform/linux-generic/test/ring/ring_basic.c @@ -66,6 +66,9 @@ int ring_test_basic_start(void) int ring_test_basic_end(void) { + _ring_destroy(st_ring_name); + _ring_destroy(mt_ring_name); + free(test_enq_data); free(test_deq_data); return 0; diff --git a/platform/linux-generic/test/ring/ring_stress.c b/platform/linux-generic/test/ring/ring_stress.c index 8287d35..bc61c3e 100644 --- a/platform/linux-generic/test/ring/ring_stress.c +++ b/platform/linux-generic/test/ring/ring_stress.c @@ -75,6 +75,7 @@ int ring_test_stress_start(void) int ring_test_stress_end(void) { + _ring_destroy(ring_name); return 0; } -- 2.7.4 _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp