xref: /spdk/include/spdk_internal/init.h (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2*a6dbe372Spaul luse  *   Copyright (C) 2021 Intel Corporation.  All rights reserved.
3af935f76SBen Walker  */
4af935f76SBen Walker 
5dc9374ddSBen Walker #ifndef SPDK_INIT_INTERNAL_H
6dc9374ddSBen Walker #define SPDK_INIT_INTERNAL_H
7af935f76SBen Walker 
8af935f76SBen Walker #include "spdk/stdinc.h"
9af935f76SBen Walker #include "spdk/queue.h"
10af935f76SBen Walker 
11af935f76SBen Walker struct spdk_json_write_ctx;
12af935f76SBen Walker 
13af935f76SBen Walker struct spdk_subsystem {
14af935f76SBen Walker 	const char *name;
15af935f76SBen Walker 	/* User must call spdk_subsystem_init_next() when they are done with their initialization. */
16af935f76SBen Walker 	void (*init)(void);
17af935f76SBen Walker 	void (*fini)(void);
18af935f76SBen Walker 
19af935f76SBen Walker 	/**
20af935f76SBen Walker 	 * Write JSON configuration handler.
21af935f76SBen Walker 	 *
22af935f76SBen Walker 	 * \param w JSON write context
23af935f76SBen Walker 	 */
24af935f76SBen Walker 	void (*write_config_json)(struct spdk_json_write_ctx *w);
25af935f76SBen Walker 	TAILQ_ENTRY(spdk_subsystem) tailq;
26af935f76SBen Walker };
27af935f76SBen Walker 
28af935f76SBen Walker struct spdk_subsystem_depend {
29af935f76SBen Walker 	const char *name;
30af935f76SBen Walker 	const char *depends_on;
31af935f76SBen Walker 	TAILQ_ENTRY(spdk_subsystem_depend) tailq;
32af935f76SBen Walker };
33af935f76SBen Walker 
34af935f76SBen Walker void spdk_add_subsystem(struct spdk_subsystem *subsystem);
35af935f76SBen Walker void spdk_add_subsystem_depend(struct spdk_subsystem_depend *depend);
36af935f76SBen Walker 
37af935f76SBen Walker void spdk_subsystem_init_next(int rc);
38af935f76SBen Walker void spdk_subsystem_fini_next(void);
39af935f76SBen Walker 
40af935f76SBen Walker /**
41af935f76SBen Walker  * \brief Register a new subsystem
42af935f76SBen Walker  */
43af935f76SBen Walker #define SPDK_SUBSYSTEM_REGISTER(_name) \
44af935f76SBen Walker 	__attribute__((constructor)) static void _name ## _register(void)	\
45af935f76SBen Walker 	{									\
46af935f76SBen Walker 		spdk_add_subsystem(&_name);					\
47af935f76SBen Walker 	}
48af935f76SBen Walker 
49af935f76SBen Walker /**
50af935f76SBen Walker  * \brief Declare that a subsystem depends on another subsystem.
51af935f76SBen Walker  */
52af935f76SBen Walker #define SPDK_SUBSYSTEM_DEPEND(_name, _depends_on)						\
53af935f76SBen Walker 	static struct spdk_subsystem_depend __subsystem_ ## _name ## _depend_on ## _depends_on = { \
54af935f76SBen Walker 	.name = #_name,										\
55af935f76SBen Walker 	.depends_on = #_depends_on,								\
56af935f76SBen Walker 	};											\
57af935f76SBen Walker 	__attribute__((constructor)) static void _name ## _depend_on ## _depends_on(void)	\
58af935f76SBen Walker 	{											\
59af935f76SBen Walker 		spdk_add_subsystem_depend(&__subsystem_ ## _name ## _depend_on ## _depends_on); \
60af935f76SBen Walker 	}
61af935f76SBen Walker 
62af935f76SBen Walker #endif
63