]> git.proxmox.com Git - ceph.git/blame - ceph/src/spdk/ocf/src/utils/utils_pipeline.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / ocf / src / utils / utils_pipeline.h
CommitLineData
9f95a23c
TL
1/*
2 * Copyright(c) 2019 Intel Corporation
3 * SPDX-License-Identifier: BSD-3-Clause-Clear
4 */
5
6#ifndef __UTILS_PIPELINE_H__
7#define __UTILS_PIPELINE_H__
8
9#include "../ocf_cache_priv.h"
10
11enum ocf_pipeline_step_type {
12 ocf_pipeline_step_single,
13 ocf_pipeline_step_foreach,
14 ocf_pipeline_step_terminator,
15};
16
17enum ocf_pipeline_arg_type {
18 ocf_pipeline_arg_none,
19 ocf_pipeline_arg_int,
20 ocf_pipeline_arg_ptr,
21 ocf_pipeline_arg_terminator,
22};
23
24struct ocf_pipeline_arg {
25 enum ocf_pipeline_arg_type type;
26 union {
27 int i;
28 void *p;
29 } val;
30};
31
32typedef struct ocf_pipeline_arg *ocf_pipeline_arg_t;
33
34#define OCF_PL_ARG_NONE() \
35 { .type = ocf_pipeline_arg_none, }
36
37#define OCF_PL_ARG_INT(_int) \
38 { .type = ocf_pipeline_arg_int, .val.i = _int }
39
40#define OCF_PL_ARG_PTR(_ptr) \
41 { .type = ocf_pipeline_arg_ptr, .val.p = _ptr }
42
43#define OCF_PL_ARG_TERMINATOR() \
44 { .type = ocf_pipeline_arg_terminator, }
45
46static inline int ocf_pipeline_arg_get_int(ocf_pipeline_arg_t arg)
47{
48 ENV_BUG_ON(arg->type != ocf_pipeline_arg_int);
49
50 return arg->val.i;
51}
52
53static inline void *ocf_pipeline_arg_get_ptr(ocf_pipeline_arg_t arg)
54{
55 ENV_BUG_ON(arg->type != ocf_pipeline_arg_ptr);
56
57 return arg->val.p;
58}
59
60typedef struct ocf_pipeline *ocf_pipeline_t;
61
62typedef void (*ocf_pipeline_step_hndl_t)(ocf_pipeline_t pipeline,
63 void *priv, ocf_pipeline_arg_t arg);
64
65typedef void (*ocf_pipeline_finish_t)(ocf_pipeline_t pipeline,
66 void *priv, int error);
67
68struct ocf_pipeline_step {
69 enum ocf_pipeline_step_type type;
70 ocf_pipeline_step_hndl_t hndl;
71 union {
72 struct ocf_pipeline_arg arg;
73 struct ocf_pipeline_arg *args;
74 };
75};
76
77#define OCF_PL_STEP(_hndl) \
78 { \
79 .type = ocf_pipeline_step_single, \
80 .hndl = _hndl, \
81 }
82
83#define OCF_PL_STEP_ARG_INT(_hndl, _int) \
84 { \
85 .type = ocf_pipeline_step_single, \
86 .hndl = _hndl, \
87 .arg = { \
88 .type = ocf_pipeline_arg_int, \
89 .val.i = _int, \
90 } \
91 }
92
93#define OCF_PL_STEP_ARG_PTR(_hndl, _ptr) \
94 { \
95 .type = ocf_pipeline_step_single, \
96 .hndl = _hndl, \
97 .arg = { \
98 .type = ocf_pipeline_arg_ptr, \
99 .val.p = _ptr, \
100 } \
101 }
102
103#define OCF_PL_STEP_FOREACH(_hndl, _args) \
104 { \
105 .type = ocf_pipeline_step_foreach, \
106 .hndl = _hndl, \
107 .args = _args, \
108 }
109
110#define OCF_PL_STEP_TERMINATOR() \
111 { \
112 .type = ocf_pipeline_step_terminator, \
113 }
114
115struct ocf_pipeline_properties {
116 uint32_t priv_size;
117 ocf_pipeline_finish_t finish;
118 struct ocf_pipeline_step steps[];
119};
120
121int ocf_pipeline_create(ocf_pipeline_t *pipeline, ocf_cache_t cache,
122 struct ocf_pipeline_properties *properties);
123
124void ocf_pipeline_set_priv(ocf_pipeline_t pipeline, void *priv);
125
126void *ocf_pipeline_get_priv(ocf_pipeline_t pipeline);
127
128void ocf_pipeline_destroy(ocf_pipeline_t pipeline);
129
130void ocf_pipeline_next(ocf_pipeline_t pipeline);
131
132void ocf_pipeline_finish(ocf_pipeline_t pipeline, int error);
133
f67539c2
TL
134#define OCF_PL_NEXT_RET(pipeline) ({ \
135 ocf_pipeline_next(pipeline); \
136 return; \
137})
138
139#define OCF_PL_FINISH_RET(pipeline, error) ({ \
140 ocf_pipeline_finish(pipeline, error); \
141 return; \
142})
143
144#define OCF_PL_NEXT_ON_SUCCESS_RET(pipeline, error) ({ \
145 if (error) \
146 ocf_pipeline_finish(pipeline, error); \
147 else \
148 ocf_pipeline_next(pipeline); \
149 return; \
150})
151
152
9f95a23c 153#endif /* __UTILS_PIPELINE_H__ */