xref: /spdk/test/unit/lib/blob/bs_scheduler.c (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2018 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "spdk/thread.h"
7 
8 bool g_scheduler_delay = false;
9 
10 struct scheduled_ops {
11 	spdk_msg_fn	fn;
12 	void		*ctx;
13 
14 	TAILQ_ENTRY(scheduled_ops)	ops_queue;
15 };
16 
17 static TAILQ_HEAD(, scheduled_ops) g_scheduled_ops = TAILQ_HEAD_INITIALIZER(g_scheduled_ops);
18 
19 void _bs_flush_scheduler(uint32_t);
20 
21 static void
_bs_send_msg(spdk_msg_fn fn,void * ctx,void * thread_ctx)22 _bs_send_msg(spdk_msg_fn fn, void *ctx, void *thread_ctx)
23 {
24 	if (g_scheduler_delay) {
25 		struct scheduled_ops *ops = calloc(1, sizeof(*ops));
26 
27 		SPDK_CU_ASSERT_FATAL(ops != NULL);
28 		ops->fn = fn;
29 		ops->ctx = ctx;
30 		TAILQ_INSERT_TAIL(&g_scheduled_ops, ops, ops_queue);
31 
32 	} else {
33 		fn(ctx);
34 	}
35 }
36 
37 static void
_bs_flush_scheduler_single(void)38 _bs_flush_scheduler_single(void)
39 {
40 	struct scheduled_ops *op;
41 	TAILQ_HEAD(, scheduled_ops) ops;
42 	TAILQ_INIT(&ops);
43 
44 	TAILQ_SWAP(&g_scheduled_ops, &ops, scheduled_ops, ops_queue);
45 
46 	while (!TAILQ_EMPTY(&ops)) {
47 		op = TAILQ_FIRST(&ops);
48 		TAILQ_REMOVE(&ops, op, ops_queue);
49 
50 		op->fn(op->ctx);
51 		free(op);
52 	}
53 }
54 
55 void
_bs_flush_scheduler(uint32_t n)56 _bs_flush_scheduler(uint32_t n)
57 {
58 	while (n--) {
59 		_bs_flush_scheduler_single();
60 	}
61 }
62