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:
parent
1fa0283f31
commit
4a4e928524
@ -292,6 +292,7 @@ struct spdk_ring_ele {
|
|||||||
|
|
||||||
struct spdk_ring {
|
struct spdk_ring {
|
||||||
TAILQ_HEAD(, spdk_ring_ele) elements;
|
TAILQ_HEAD(, spdk_ring_ele) elements;
|
||||||
|
pthread_mutex_t lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
DEFINE_RETURN_MOCK(spdk_ring_create, struct spdk_ring *);
|
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);
|
HANDLE_RETURN_MOCK(spdk_ring_create);
|
||||||
|
|
||||||
ring = calloc(1, sizeof(*ring));
|
ring = calloc(1, sizeof(*ring));
|
||||||
if (ring) {
|
if (!ring) {
|
||||||
TAILQ_INIT(&ring->elements);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pthread_mutex_init(&ring->lock, NULL)) {
|
||||||
|
free(ring);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
TAILQ_INIT(&ring->elements);
|
||||||
return ring;
|
return ring;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
spdk_ring_free(struct spdk_ring *ring)
|
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);
|
free(ring);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,6 +343,8 @@ spdk_ring_enqueue(struct spdk_ring *ring, void **objs, size_t count)
|
|||||||
|
|
||||||
HANDLE_RETURN_MOCK(spdk_ring_enqueue);
|
HANDLE_RETURN_MOCK(spdk_ring_enqueue);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&ring->lock);
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
ele = calloc(1, sizeof(*ele));
|
ele = calloc(1, sizeof(*ele));
|
||||||
if (!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);
|
TAILQ_INSERT_TAIL(&ring->elements, ele, link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&ring->lock);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -351,6 +372,8 @@ spdk_ring_dequeue(struct spdk_ring *ring, void **objs, size_t count)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_mutex_lock(&ring->lock);
|
||||||
|
|
||||||
TAILQ_FOREACH_SAFE(ele, &ring->elements, link, tmp) {
|
TAILQ_FOREACH_SAFE(ele, &ring->elements, link, tmp) {
|
||||||
TAILQ_REMOVE(&ring->elements, ele, link);
|
TAILQ_REMOVE(&ring->elements, ele, link);
|
||||||
objs[i] = ele->ele;
|
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;
|
return i;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user