test/common: Changed spdk_ring mock to be thread safe

This change is required for unit tests that use spdk_ring mock
in multithreaded scenarios.

Change-Id: I8f5e83de69a685078cbb01e55daac650f6ae1db1
Signed-off-by: Wojciech Malikowski <wojciech.malikowski@intel.com>
Reviewed-on: https://review.gerrithub.io/c/440721
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Wojciech Malikowski 2019-01-16 08:43:09 -05:00 committed by Jim Harris
parent 1fa0283f31
commit 4a4e928524

View File

@ -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;
}