Commit 4a4e9285 authored by Wojciech Malikowski's avatar Wojciech Malikowski Committed by Jim Harris
Browse files

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: default avatarWojciech Malikowski <wojciech.malikowski@intel.com>
Reviewed-on: https://review.gerrithub.io/c/440721


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 1fa0283f
Loading
Loading
Loading
Loading
+26 −2
Original line number Diff line number Diff line
@@ -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;

}