@@ -76,6 +76,24 @@ odp_buffer_pool_t odp_buffer_pool_create(const char *name,
odp_shm_t shm,
odp_buffer_pool_param_t *params);
+/**
+ * Destroy a buffer pool previously created by odp_buffer_pool_create()
+ *
+ * @param pool Handle of the buffer pool to be destroyed
+ *
+ * @retval 0 Success
+ * @retval -1 Failure
+ *
+ * @note This routine destroys a previously created buffer pool. This call
+ * does not destroy any shared memory object passed to
+ * odp_buffer_pool_create() used to store the buffer pool contents. The caller
+ * takes responsibility for that. If no shared memory object was passed as
+ * part of the create call, then this routine will destroy any internal shared
+ * memory objects associated with the buffer pool. Results are undefined if
+ * an attempt is made to destroy a buffer pool that contains allocated or
+ * otherwise active buffers.
+ */
+int odp_buffer_pool_destroy(odp_buffer_pool_t pool);
/**
* Find a buffer pool by name
@@ -390,6 +390,40 @@ odp_buffer_pool_t odp_buffer_pool_lookup(const char *name)
return ODP_BUFFER_POOL_INVALID;
}
+int odp_buffer_pool_destroy(odp_buffer_pool_t pool_hdl)
+{
+ uint32_t pool_id = pool_handle_to_index(pool_hdl);
+ pool_entry_t *pool = get_pool_entry(pool_id);
+
+ if (pool == NULL)
+ return -1;
+
+ POOL_LOCK(&pool->s.lock);
+
+ /* Call fails if pool is not allocated or predefined*/
+ if (pool->s.pool_shm == ODP_SHM_INVALID ||
+ pool->s.flags.predefined) {
+ POOL_UNLOCK(&pool->s.lock);
+ return -1;
+ }
+
+ /* Make sure local cache is empty */
+ flush_cache(&local_cache[pool_id], &pool->s);
+
+ /* Call fails if pool has allocated buffers */
+ if (odp_atomic_load_u32(&pool->s.bufcount) < pool->s.params.num_bufs) {
+ POOL_UNLOCK(&pool->s.lock);
+ return -1;
+ }
+
+ if (!pool->s.flags.user_supplied_shm)
+ odp_shm_free(pool->s.pool_shm);
+
+ pool->s.pool_shm = ODP_SHM_INVALID;
+ POOL_UNLOCK(&pool->s.lock);
+
+ return 0;
+}
odp_buffer_t buffer_alloc(odp_buffer_pool_t pool_hdl, size_t size)
{