diff --git a/test/common/lib/test_env.c b/test/common/lib/test_env.c index a37cc855b..bed0383ed 100644 --- a/test/common/lib/test_env.c +++ b/test/common/lib/test_env.c @@ -292,6 +292,7 @@ struct spdk_ring_ele { struct spdk_ring { TAILQ_HEAD(, spdk_ring_ele) elements; + pthread_mutex_t lock; }; DEFINE_RETURN_MOCK(spdk_ring_create, struct spdk_ring *); @@ -303,16 +304,33 @@ spdk_ring_create(enum spdk_ring_type type, size_t count, int socket_id) HANDLE_RETURN_MOCK(spdk_ring_create); ring = calloc(1, sizeof(*ring)); - if (ring) { - TAILQ_INIT(&ring->elements); + if (!ring) { + return NULL; } + if (pthread_mutex_init(&ring->lock, NULL)) { + free(ring); + return NULL; + } + + TAILQ_INIT(&ring->elements); return ring; } void spdk_ring_free(struct spdk_ring *ring) { + struct spdk_ring_ele *ele, *tmp; + + if (!ring) { + return; + } + + TAILQ_FOREACH_SAFE(ele, &ring->elements, link, tmp) { + free(ele); + } + + pthread_mutex_destroy(&ring->lock); free(ring); } @@ -325,6 +343,8 @@ spdk_ring_enqueue(struct spdk_ring *ring, void **objs, size_t count) HANDLE_RETURN_MOCK(spdk_ring_enqueue); + pthread_mutex_lock(&ring->lock); + for (i = 0; i < count; i++) { ele = calloc(1, sizeof(*ele)); if (!ele) { @@ -335,6 +355,7 @@ spdk_ring_enqueue(struct spdk_ring *ring, void **objs, size_t count) TAILQ_INSERT_TAIL(&ring->elements, ele, link); } + pthread_mutex_unlock(&ring->lock); return i; } @@ -351,6 +372,8 @@ spdk_ring_dequeue(struct spdk_ring *ring, void **objs, size_t count) return 0; } + pthread_mutex_lock(&ring->lock); + TAILQ_FOREACH_SAFE(ele, &ring->elements, link, tmp) { TAILQ_REMOVE(&ring->elements, ele, link); objs[i] = ele->ele; @@ -361,6 +384,7 @@ spdk_ring_dequeue(struct spdk_ring *ring, void **objs, size_t count) } } + pthread_mutex_unlock(&ring->lock); return i; }