rmagick 5.0.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rmagick might be problematic. Click here for more details.

@@ -0,0 +1,224 @@
1
+ #ifndef _RMAGICK_GVL_H_
2
+ #define _RMAGICK_GVL_H_
3
+
4
+ #include "ruby/thread.h"
5
+
6
+ typedef void *(gvl_function_t)(void *);
7
+
8
+ #define GVL_FUNC(name) name##_gvl
9
+ #define GVL_STRUCT_TYPE(name) name##_args_t
10
+ #define CALL_FUNC_WITHOUT_GVL(fp, args) \
11
+ rb_thread_call_without_gvl(fp, args, RUBY_UBF_PROCESS, NULL)
12
+
13
+
14
+ #define DEFINE_GVL_STRUCT1(name, type1) \
15
+ typedef struct { \
16
+ type1 arg1; \
17
+ } GVL_STRUCT_TYPE(name)
18
+ #define DEFINE_GVL_FUNC1(func_name, struct_name) \
19
+ static void *func_name##_gvl(void *p) \
20
+ { \
21
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
22
+ return (void *)func_name(args->arg1); \
23
+ }
24
+
25
+ #define DEFINE_GVL_STUB1(name, type1) \
26
+ DEFINE_GVL_STRUCT1(name, type1); \
27
+ DEFINE_GVL_FUNC1(name, name)
28
+
29
+
30
+ #define DEFINE_GVL_STRUCT2(name, type1, type2) \
31
+ typedef struct { \
32
+ type1 arg1; \
33
+ type2 arg2; \
34
+ } GVL_STRUCT_TYPE(name)
35
+ #define DEFINE_GVL_FUNC2(func_name, struct_name) \
36
+ static void *func_name##_gvl(void *p) \
37
+ { \
38
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
39
+ return (void *)func_name(args->arg1, args->arg2); \
40
+ }
41
+
42
+ #define DEFINE_GVL_STUB2(name, type1, type2) \
43
+ DEFINE_GVL_STRUCT2(name, type1, type2); \
44
+ DEFINE_GVL_FUNC2(name, name)
45
+
46
+
47
+ #define DEFINE_GVL_STRUCT3(name, type1, type2, type3) \
48
+ typedef struct { \
49
+ type1 arg1; \
50
+ type2 arg2; \
51
+ type3 arg3; \
52
+ } GVL_STRUCT_TYPE(name)
53
+ #define DEFINE_GVL_FUNC3(func_name, struct_name) \
54
+ static void *func_name##_gvl(void *p) \
55
+ { \
56
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
57
+ return (void *)func_name(args->arg1, args->arg2, args->arg3); \
58
+ }
59
+
60
+ #define DEFINE_GVL_STUB3(name, type1, type2, type3) \
61
+ DEFINE_GVL_STRUCT3(name, type1, type2, type3); \
62
+ DEFINE_GVL_FUNC3(name, name)
63
+
64
+
65
+ #define DEFINE_GVL_STRUCT4(name, type1, type2, type3, type4) \
66
+ typedef struct { \
67
+ type1 arg1; \
68
+ type2 arg2; \
69
+ type3 arg3; \
70
+ type4 arg4; \
71
+ } GVL_STRUCT_TYPE(name)
72
+ #define DEFINE_GVL_FUNC4(func_name, struct_name) \
73
+ static void *func_name##_gvl(void *p) \
74
+ { \
75
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
76
+ return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4); \
77
+ }
78
+
79
+ #define DEFINE_GVL_STUB4(name, type1, type2, type3, type4) \
80
+ DEFINE_GVL_STRUCT4(name, type1, type2, type3, type4); \
81
+ DEFINE_GVL_FUNC4(name, name)
82
+
83
+
84
+ #define DEFINE_GVL_STRUCT5(name, type1, type2, type3, type4, type5) \
85
+ typedef struct { \
86
+ type1 arg1; \
87
+ type2 arg2; \
88
+ type3 arg3; \
89
+ type4 arg4; \
90
+ type5 arg5; \
91
+ } GVL_STRUCT_TYPE(name)
92
+ #define DEFINE_GVL_FUNC5(func_name, struct_name) \
93
+ static void *func_name##_gvl(void *p) \
94
+ { \
95
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
96
+ return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5); \
97
+ }
98
+ #define DEFINE_GVL_STUB5(name, type1, type2, type3, type4, type5) \
99
+ DEFINE_GVL_STRUCT5(name, type1, type2, type3, type4, type5); \
100
+ DEFINE_GVL_FUNC5(name, name)
101
+
102
+
103
+ #define DEFINE_GVL_STRUCT6(name, type1, type2, type3, type4, type5, type6) \
104
+ typedef struct { \
105
+ type1 arg1; \
106
+ type2 arg2; \
107
+ type3 arg3; \
108
+ type4 arg4; \
109
+ type5 arg5; \
110
+ type6 arg6; \
111
+ } GVL_STRUCT_TYPE(name)
112
+ #define DEFINE_GVL_FUNC6(func_name, struct_name) \
113
+ static void *func_name##_gvl(void *p) \
114
+ { \
115
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
116
+ return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6); \
117
+ }
118
+ #define DEFINE_GVL_STUB6(name, type1, type2, type3, type4, type5, type6) \
119
+ DEFINE_GVL_STRUCT6(name, type1, type2, type3, type4, type5, type6); \
120
+ DEFINE_GVL_FUNC6(name, name)
121
+
122
+
123
+ #define DEFINE_GVL_STRUCT7(name, type1, type2, type3, type4, type5, type6, type7) \
124
+ typedef struct { \
125
+ type1 arg1; \
126
+ type2 arg2; \
127
+ type3 arg3; \
128
+ type4 arg4; \
129
+ type5 arg5; \
130
+ type6 arg6; \
131
+ type7 arg7; \
132
+ } GVL_STRUCT_TYPE(name)
133
+ #define DEFINE_GVL_FUNC7(func_name, struct_name) \
134
+ static void *func_name##_gvl(void *p) \
135
+ { \
136
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
137
+ return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6, args->arg7); \
138
+ }
139
+ #define DEFINE_GVL_STUB7(name, type1, type2, type3, type4, type5, type6, type7) \
140
+ DEFINE_GVL_STRUCT7(name, type1, type2, type3, type4, type5, type6, type7); \
141
+ DEFINE_GVL_FUNC7(name, name)
142
+
143
+
144
+ #define DEFINE_GVL_STRUCT8(name, type1, type2, type3, type4, type5, type6, type7, type8) \
145
+ typedef struct { \
146
+ type1 arg1; \
147
+ type2 arg2; \
148
+ type3 arg3; \
149
+ type4 arg4; \
150
+ type5 arg5; \
151
+ type6 arg6; \
152
+ type7 arg7; \
153
+ type8 arg8; \
154
+ } GVL_STRUCT_TYPE(name)
155
+ #define DEFINE_GVL_FUNC8(func_name, struct_name) \
156
+ static void *func_name##_gvl(void *p) \
157
+ { \
158
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
159
+ return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6, args->arg7, args->arg8); \
160
+ }
161
+ #define DEFINE_GVL_STUB8(name, type1, type2, type3, type4, type5, type6, type7, type8) \
162
+ DEFINE_GVL_STRUCT8(name, type1, type2, type3, type4, type5, type6, type7, type8); \
163
+ DEFINE_GVL_FUNC8(name, name)
164
+
165
+
166
+ #define DEFINE_GVL_STRUCT9(name, type1, type2, type3, type4, type5, type6, type7, type8, type9) \
167
+ typedef struct { \
168
+ type1 arg1; \
169
+ type2 arg2; \
170
+ type3 arg3; \
171
+ type4 arg4; \
172
+ type5 arg5; \
173
+ type6 arg6; \
174
+ type7 arg7; \
175
+ type8 arg8; \
176
+ type9 arg9; \
177
+ } GVL_STRUCT_TYPE(name)
178
+ #define DEFINE_GVL_FUNC9(func_name, struct_name) \
179
+ static void *func_name##_gvl(void *p) \
180
+ { \
181
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
182
+ return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6, args->arg7, args->arg8, args->arg9); \
183
+ }
184
+ #define DEFINE_GVL_STUB9(name, type1, type2, type3, type4, type5, type6, type7, type8, type9) \
185
+ DEFINE_GVL_STRUCT9(name, type1, type2, type3, type4, type5, type6, type7, type8, type9); \
186
+ DEFINE_GVL_FUNC9(name, name)
187
+
188
+
189
+ #define DEFINE_GVL_VOID_FUNC2(func_name, struct_name) \
190
+ static void *func_name##_gvl(void *p) \
191
+ { \
192
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
193
+ func_name(args->arg1, args->arg2); \
194
+ return NULL; \
195
+ }
196
+ #define DEFINE_GVL_VOID_STUB2(name, type1, type2) \
197
+ DEFINE_GVL_STRUCT2(name, type1, type2); \
198
+ DEFINE_GVL_VOID_FUNC2(name, name)
199
+
200
+
201
+ #define DEFINE_GVL_VOID_FUNC3(func_name, struct_name) \
202
+ static void *func_name##_gvl(void *p) \
203
+ { \
204
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
205
+ func_name(args->arg1, args->arg2, args->arg3); \
206
+ return NULL; \
207
+ }
208
+ #define DEFINE_GVL_VOID_STUB3(name, type1, type2, type3) \
209
+ DEFINE_GVL_STRUCT3(name, type1, type2, type3); \
210
+ DEFINE_GVL_VOID_FUNC3(name, name)
211
+
212
+
213
+ #define DEFINE_GVL_VOID_FUNC6(func_name, struct_name) \
214
+ static void *func_name##_gvl(void *p) \
215
+ { \
216
+ GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
217
+ func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6); \
218
+ return NULL; \
219
+ }
220
+ #define DEFINE_GVL_VOID_STUB6(name, type1, type2, type3, type4, type5, type6) \
221
+ DEFINE_GVL_STRUCT6(name, type1, type2, type3, type4, type5, type6); \
222
+ DEFINE_GVL_VOID_FUNC6(name, name)
223
+
224
+ #endif