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 {
|
||||
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;
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user