Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/servers/server_wrap_mt_common.h
9887 views
1
/**************************************************************************/
2
/* server_wrap_mt_common.h */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#pragma once
32
33
#ifdef DEBUG_ENABLED
34
#define MAIN_THREAD_SYNC_CHECK \
35
if (unlikely(Thread::is_main_thread() && Engine::get_singleton()->notify_frame_server_synced())) { \
36
MAIN_THREAD_SYNC_WARN \
37
}
38
#else
39
#define MAIN_THREAD_SYNC_CHECK
40
#endif
41
42
#define FUNC0R(m_r, m_type) \
43
virtual m_r m_type() override { \
44
if (ASYNC_COND_PUSH_AND_RET) { \
45
m_r ret; \
46
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret); \
47
SYNC_DEBUG \
48
MAIN_THREAD_SYNC_CHECK \
49
return ret; \
50
} else { \
51
command_queue.flush_if_pending(); \
52
return server_name->m_type(); \
53
} \
54
}
55
56
#define FUNCRIDSPLIT(m_type) \
57
virtual RID m_type##_create() override { \
58
RID ret = server_name->m_type##_allocate(); \
59
if (ASYNC_COND_PUSH) { \
60
command_queue.push(server_name, &ServerName::m_type##_initialize, ret); \
61
} else { \
62
server_name->m_type##_initialize(ret); \
63
} \
64
return ret; \
65
}
66
67
//RID now returns directly, ensure thread safety yourself
68
#define FUNCRID(m_type) \
69
virtual RID m_type##_create() override { \
70
return server_name->m_type##_create(); \
71
}
72
73
#define FUNC0RC(m_r, m_type) \
74
virtual m_r m_type() const override { \
75
WRITE_ACTION \
76
if (ASYNC_COND_PUSH_AND_RET) { \
77
m_r ret; \
78
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret); \
79
SYNC_DEBUG \
80
MAIN_THREAD_SYNC_CHECK \
81
return ret; \
82
} else { \
83
command_queue.flush_if_pending(); \
84
return server_name->m_type(); \
85
} \
86
}
87
88
#define FUNC0(m_type) \
89
virtual void m_type() override { \
90
WRITE_ACTION \
91
if (ASYNC_COND_PUSH) { \
92
command_queue.push(server_name, &ServerName::m_type); \
93
} else { \
94
command_queue.flush_if_pending(); \
95
server_name->m_type(); \
96
} \
97
}
98
99
#define FUNC0C(m_type) \
100
virtual void m_type() const override { \
101
if (ASYNC_COND_PUSH) { \
102
command_queue.push(server_name, &ServerName::m_type); \
103
} else { \
104
command_queue.flush_if_pending(); \
105
server_name->m_type(); \
106
} \
107
}
108
109
#define FUNC0S(m_type) \
110
virtual void m_type() override { \
111
WRITE_ACTION \
112
if (ASYNC_COND_PUSH_AND_SYNC) { \
113
command_queue.push_and_sync(server_name, &ServerName::m_type); \
114
SYNC_DEBUG \
115
MAIN_THREAD_SYNC_CHECK \
116
} else { \
117
command_queue.flush_if_pending(); \
118
server_name->m_type(); \
119
} \
120
}
121
122
#define FUNC0SC(m_type) \
123
virtual void m_type() const override { \
124
if (ASYNC_COND_PUSH_AND_SYNC) { \
125
command_queue.push_and_sync(server_name, &ServerName::m_type); \
126
SYNC_DEBUG \
127
MAIN_THREAD_SYNC_CHECK \
128
} else { \
129
command_queue.flush_if_pending(); \
130
server_name->m_type(); \
131
} \
132
}
133
134
///////////////////////////////////////////////
135
136
#define FUNC1R(m_r, m_type, m_arg1) \
137
virtual m_r m_type(m_arg1 p1) override { \
138
WRITE_ACTION \
139
if (ASYNC_COND_PUSH_AND_RET) { \
140
m_r ret; \
141
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1); \
142
SYNC_DEBUG \
143
MAIN_THREAD_SYNC_CHECK \
144
return ret; \
145
} else { \
146
command_queue.flush_if_pending(); \
147
return server_name->m_type(p1); \
148
} \
149
}
150
151
#define FUNC1RC(m_r, m_type, m_arg1) \
152
virtual m_r m_type(m_arg1 p1) const override { \
153
if (ASYNC_COND_PUSH_AND_RET) { \
154
m_r ret; \
155
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1); \
156
SYNC_DEBUG \
157
MAIN_THREAD_SYNC_CHECK \
158
return ret; \
159
} else { \
160
command_queue.flush_if_pending(); \
161
return server_name->m_type(p1); \
162
} \
163
}
164
165
#define FUNC1S(m_type, m_arg1) \
166
virtual void m_type(m_arg1 p1) override { \
167
WRITE_ACTION \
168
if (ASYNC_COND_PUSH_AND_SYNC) { \
169
command_queue.push_and_sync(server_name, &ServerName::m_type, p1); \
170
SYNC_DEBUG \
171
MAIN_THREAD_SYNC_CHECK \
172
} else { \
173
command_queue.flush_if_pending(); \
174
server_name->m_type(p1); \
175
} \
176
}
177
178
#define FUNC1SC(m_type, m_arg1) \
179
virtual void m_type(m_arg1 p1) const override { \
180
if (ASYNC_COND_PUSH_AND_SYNC) { \
181
command_queue.push_and_sync(server_name, &ServerName::m_type, p1); \
182
SYNC_DEBUG \
183
MAIN_THREAD_SYNC_CHECK \
184
} else { \
185
command_queue.flush_if_pending(); \
186
server_name->m_type(p1); \
187
} \
188
}
189
190
#define FUNC1(m_type, m_arg1) \
191
virtual void m_type(m_arg1 p1) override { \
192
WRITE_ACTION \
193
if (ASYNC_COND_PUSH) { \
194
command_queue.push(server_name, &ServerName::m_type, p1); \
195
} else { \
196
command_queue.flush_if_pending(); \
197
server_name->m_type(p1); \
198
} \
199
}
200
201
#define FUNC1C(m_type, m_arg1) \
202
virtual void m_type(m_arg1 p1) const override { \
203
if (ASYNC_COND_PUSH) { \
204
command_queue.push(server_name, &ServerName::m_type, p1); \
205
} else { \
206
command_queue.flush_if_pending(); \
207
server_name->m_type(p1); \
208
} \
209
}
210
211
#define FUNC2R(m_r, m_type, m_arg1, m_arg2) \
212
virtual m_r m_type(m_arg1 p1, m_arg2 p2) override { \
213
WRITE_ACTION \
214
if (ASYNC_COND_PUSH_AND_RET) { \
215
m_r ret; \
216
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2); \
217
SYNC_DEBUG \
218
MAIN_THREAD_SYNC_CHECK \
219
return ret; \
220
} else { \
221
command_queue.flush_if_pending(); \
222
return server_name->m_type(p1, p2); \
223
} \
224
}
225
226
#define FUNC2RC(m_r, m_type, m_arg1, m_arg2) \
227
virtual m_r m_type(m_arg1 p1, m_arg2 p2) const override { \
228
if (ASYNC_COND_PUSH_AND_RET) { \
229
m_r ret; \
230
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2); \
231
SYNC_DEBUG \
232
MAIN_THREAD_SYNC_CHECK \
233
return ret; \
234
} else { \
235
command_queue.flush_if_pending(); \
236
return server_name->m_type(p1, p2); \
237
} \
238
}
239
240
#define FUNC2S(m_type, m_arg1, m_arg2) \
241
virtual void m_type(m_arg1 p1, m_arg2 p2) override { \
242
WRITE_ACTION \
243
if (ASYNC_COND_PUSH_AND_SYNC) { \
244
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2); \
245
SYNC_DEBUG \
246
MAIN_THREAD_SYNC_CHECK \
247
} else { \
248
command_queue.flush_if_pending(); \
249
server_name->m_type(p1, p2); \
250
} \
251
}
252
253
#define FUNC2SC(m_type, m_arg1, m_arg2) \
254
virtual void m_type(m_arg1 p1, m_arg2 p2) const override { \
255
if (ASYNC_COND_PUSH_AND_SYNC) { \
256
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2); \
257
SYNC_DEBUG \
258
MAIN_THREAD_SYNC_CHECK \
259
} else { \
260
command_queue.flush_if_pending(); \
261
server_name->m_type(p1, p2); \
262
} \
263
}
264
265
#define FUNC2(m_type, m_arg1, m_arg2) \
266
virtual void m_type(m_arg1 p1, m_arg2 p2) override { \
267
WRITE_ACTION \
268
if (ASYNC_COND_PUSH) { \
269
command_queue.push(server_name, &ServerName::m_type, p1, p2); \
270
} else { \
271
command_queue.flush_if_pending(); \
272
server_name->m_type(p1, p2); \
273
} \
274
}
275
276
#define FUNC2C(m_type, m_arg1, m_arg2) \
277
virtual void m_type(m_arg1 p1, m_arg2 p2) const override { \
278
if (ASYNC_COND_PUSH) { \
279
command_queue.push(server_name, &ServerName::m_type, p1, p2); \
280
} else { \
281
command_queue.flush_if_pending(); \
282
server_name->m_type(p1, p2); \
283
} \
284
}
285
286
#define FUNC3R(m_r, m_type, m_arg1, m_arg2, m_arg3) \
287
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) override { \
288
WRITE_ACTION \
289
if (ASYNC_COND_PUSH_AND_RET) { \
290
m_r ret; \
291
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3); \
292
SYNC_DEBUG \
293
MAIN_THREAD_SYNC_CHECK \
294
return ret; \
295
} else { \
296
command_queue.flush_if_pending(); \
297
return server_name->m_type(p1, p2, p3); \
298
} \
299
}
300
301
#define FUNC3RC(m_r, m_type, m_arg1, m_arg2, m_arg3) \
302
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) const override { \
303
if (ASYNC_COND_PUSH_AND_RET) { \
304
m_r ret; \
305
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3); \
306
SYNC_DEBUG \
307
MAIN_THREAD_SYNC_CHECK \
308
return ret; \
309
} else { \
310
command_queue.flush_if_pending(); \
311
return server_name->m_type(p1, p2, p3); \
312
} \
313
}
314
315
#define FUNC3S(m_type, m_arg1, m_arg2, m_arg3) \
316
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) override { \
317
WRITE_ACTION \
318
if (ASYNC_COND_PUSH_AND_SYNC) { \
319
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3); \
320
SYNC_DEBUG \
321
MAIN_THREAD_SYNC_CHECK \
322
} else { \
323
command_queue.flush_if_pending(); \
324
server_name->m_type(p1, p2, p3); \
325
} \
326
}
327
328
#define FUNC3SC(m_type, m_arg1, m_arg2, m_arg3) \
329
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) const override { \
330
if (ASYNC_COND_PUSH_AND_SYNC) { \
331
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3); \
332
SYNC_DEBUG \
333
MAIN_THREAD_SYNC_CHECK \
334
} else { \
335
command_queue.flush_if_pending(); \
336
server_name->m_type(p1, p2, p3); \
337
} \
338
}
339
340
#define FUNC3(m_type, m_arg1, m_arg2, m_arg3) \
341
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) override { \
342
WRITE_ACTION \
343
if (ASYNC_COND_PUSH) { \
344
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3); \
345
} else { \
346
command_queue.flush_if_pending(); \
347
server_name->m_type(p1, p2, p3); \
348
} \
349
}
350
351
#define FUNC3C(m_type, m_arg1, m_arg2, m_arg3) \
352
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) const override { \
353
if (ASYNC_COND_PUSH) { \
354
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3); \
355
} else { \
356
command_queue.flush_if_pending(); \
357
server_name->m_type(p1, p2, p3); \
358
} \
359
}
360
361
#define FUNC4R(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
362
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) override { \
363
WRITE_ACTION \
364
if (ASYNC_COND_PUSH_AND_RET) { \
365
m_r ret; \
366
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3, p4); \
367
SYNC_DEBUG \
368
MAIN_THREAD_SYNC_CHECK \
369
return ret; \
370
} else { \
371
command_queue.flush_if_pending(); \
372
return server_name->m_type(p1, p2, p3, p4); \
373
} \
374
}
375
376
#define FUNC4RC(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
377
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) const override { \
378
if (ASYNC_COND_PUSH_AND_RET) { \
379
m_r ret; \
380
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3, p4); \
381
SYNC_DEBUG \
382
MAIN_THREAD_SYNC_CHECK \
383
return ret; \
384
} else { \
385
command_queue.flush_if_pending(); \
386
return server_name->m_type(p1, p2, p3, p4); \
387
} \
388
}
389
390
#define FUNC4S(m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
391
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) override { \
392
WRITE_ACTION \
393
if (ASYNC_COND_PUSH_AND_SYNC) { \
394
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4); \
395
SYNC_DEBUG \
396
MAIN_THREAD_SYNC_CHECK \
397
} else { \
398
command_queue.flush_if_pending(); \
399
server_name->m_type(p1, p2, p3, p4); \
400
} \
401
}
402
403
#define FUNC4SC(m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
404
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) const override { \
405
if (ASYNC_COND_PUSH_AND_SYNC) { \
406
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4); \
407
SYNC_DEBUG \
408
MAIN_THREAD_SYNC_CHECK \
409
} else { \
410
command_queue.flush_if_pending(); \
411
server_name->m_type(p1, p2, p3, p4); \
412
} \
413
}
414
415
#define FUNC4(m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
416
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) override { \
417
WRITE_ACTION \
418
if (ASYNC_COND_PUSH) { \
419
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4); \
420
} else { \
421
command_queue.flush_if_pending(); \
422
server_name->m_type(p1, p2, p3, p4); \
423
} \
424
}
425
426
#define FUNC4C(m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
427
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) const override { \
428
if (ASYNC_COND_PUSH) { \
429
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4); \
430
} else { \
431
command_queue.flush_if_pending(); \
432
server_name->m_type(p1, p2, p3, p4); \
433
} \
434
}
435
436
#define FUNC5R(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
437
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) { \
438
WRITE_ACTION \
439
if (ASYNC_COND_PUSH_AND_RET) { \
440
m_r ret; \
441
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3, p4, p5); \
442
SYNC_DEBUG \
443
MAIN_THREAD_SYNC_CHECK \
444
return ret; \
445
} else { \
446
command_queue.flush_if_pending(); \
447
return server_name->m_type(p1, p2, p3, p4, p5); \
448
} \
449
}
450
451
#define FUNC5RC(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
452
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) const override { \
453
if (ASYNC_COND_PUSH_AND_RET) { \
454
m_r ret; \
455
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3, p4, p5); \
456
SYNC_DEBUG \
457
MAIN_THREAD_SYNC_CHECK \
458
return ret; \
459
} else { \
460
command_queue.flush_if_pending(); \
461
return server_name->m_type(p1, p2, p3, p4, p5); \
462
} \
463
}
464
465
#define FUNC5S(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
466
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) override { \
467
WRITE_ACTION \
468
if (ASYNC_COND_PUSH_AND_SYNC) { \
469
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5); \
470
SYNC_DEBUG \
471
MAIN_THREAD_SYNC_CHECK \
472
} else { \
473
command_queue.flush_if_pending(); \
474
server_name->m_type(p1, p2, p3, p4, p5); \
475
} \
476
}
477
478
#define FUNC5SC(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
479
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) const override { \
480
if (ASYNC_COND_PUSH_AND_SYNC) { \
481
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5); \
482
SYNC_DEBUG \
483
MAIN_THREAD_SYNC_CHECK \
484
} else { \
485
command_queue.flush_if_pending(); \
486
server_name->m_type(p1, p2, p3, p4, p5); \
487
} \
488
}
489
490
#define FUNC5(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
491
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) override { \
492
WRITE_ACTION \
493
if (ASYNC_COND_PUSH) { \
494
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5); \
495
} else { \
496
command_queue.flush_if_pending(); \
497
server_name->m_type(p1, p2, p3, p4, p5); \
498
} \
499
}
500
501
#define FUNC5C(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
502
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) const override { \
503
if (ASYNC_COND_PUSH) { \
504
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5); \
505
} else { \
506
command_queue.flush_if_pending(); \
507
server_name->m_type(p1, p2, p3, p4, p5); \
508
} \
509
}
510
511
#define FUNC6R(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
512
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) { \
513
WRITE_ACTION \
514
if (ASYNC_COND_PUSH_AND_RET) { \
515
m_r ret; \
516
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3, p4, p5, p6); \
517
SYNC_DEBUG \
518
MAIN_THREAD_SYNC_CHECK \
519
return ret; \
520
} else { \
521
command_queue.flush_if_pending(); \
522
return server_name->m_type(p1, p2, p3, p4, p5, p6); \
523
} \
524
}
525
526
#define FUNC6RC(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
527
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) const override { \
528
if (ASYNC_COND_PUSH_AND_RET) { \
529
m_r ret; \
530
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3, p4, p5, p6); \
531
SYNC_DEBUG \
532
MAIN_THREAD_SYNC_CHECK \
533
return ret; \
534
} else { \
535
command_queue.flush_if_pending(); \
536
return server_name->m_type(p1, p2, p3, p4, p5, p6); \
537
} \
538
}
539
540
#define FUNC6S(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
541
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) override { \
542
WRITE_ACTION \
543
if (ASYNC_COND_PUSH_AND_SYNC) { \
544
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6); \
545
SYNC_DEBUG \
546
MAIN_THREAD_SYNC_CHECK \
547
} else { \
548
command_queue.flush_if_pending(); \
549
server_name->m_type(p1, p2, p3, p4, p5, p6); \
550
} \
551
}
552
553
#define FUNC6SC(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
554
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) const override { \
555
if (ASYNC_COND_PUSH_AND_SYNC) { \
556
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6); \
557
SYNC_DEBUG \
558
MAIN_THREAD_SYNC_CHECK \
559
} else { \
560
command_queue.flush_if_pending(); \
561
server_name->m_type(p1, p2, p3, p4, p5, p6); \
562
} \
563
}
564
565
#define FUNC6(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
566
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) override { \
567
WRITE_ACTION \
568
if (ASYNC_COND_PUSH) { \
569
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6); \
570
} else { \
571
command_queue.flush_if_pending(); \
572
server_name->m_type(p1, p2, p3, p4, p5, p6); \
573
} \
574
}
575
576
#define FUNC6C(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
577
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) const override { \
578
if (ASYNC_COND_PUSH) { \
579
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6); \
580
} else { \
581
command_queue.flush_if_pending(); \
582
server_name->m_type(p1, p2, p3, p4, p5, p6); \
583
} \
584
}
585
586
#define FUNC7R(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
587
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) override { \
588
WRITE_ACTION \
589
if (ASYNC_COND_PUSH_AND_RET) { \
590
m_r ret; \
591
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3, p4, p5, p6, p7); \
592
SYNC_DEBUG \
593
MAIN_THREAD_SYNC_CHECK \
594
return ret; \
595
} else { \
596
command_queue.flush_if_pending(); \
597
return server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
598
} \
599
}
600
601
#define FUNC7RC(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
602
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) const override { \
603
if (ASYNC_COND_PUSH_AND_RET) { \
604
m_r ret; \
605
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3, p4, p5, p6, p7); \
606
SYNC_DEBUG \
607
MAIN_THREAD_SYNC_CHECK \
608
return ret; \
609
} else { \
610
command_queue.flush_if_pending(); \
611
return server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
612
} \
613
}
614
615
#define FUNC7S(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
616
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) override { \
617
WRITE_ACTION \
618
if (ASYNC_COND_PUSH_AND_SYNC) { \
619
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7); \
620
SYNC_DEBUG \
621
MAIN_THREAD_SYNC_CHECK \
622
} else { \
623
command_queue.flush_if_pending(); \
624
server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
625
} \
626
}
627
628
#define FUNC7SC(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
629
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) const override { \
630
if (ASYNC_COND_PUSH_AND_SYNC) { \
631
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7); \
632
SYNC_DEBUG \
633
MAIN_THREAD_SYNC_CHECK \
634
} else { \
635
command_queue.flush_if_pending(); \
636
server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
637
} \
638
}
639
640
#define FUNC7(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
641
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) override { \
642
WRITE_ACTION \
643
if (ASYNC_COND_PUSH) { \
644
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7); \
645
} else { \
646
command_queue.flush_if_pending(); \
647
server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
648
} \
649
}
650
651
#define FUNC7C(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
652
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) const override { \
653
if (ASYNC_COND_PUSH) { \
654
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7); \
655
} else { \
656
command_queue.flush_if_pending(); \
657
server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
658
} \
659
}
660
661
#define FUNC8R(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
662
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) override { \
663
WRITE_ACTION \
664
if (ASYNC_COND_PUSH_AND_RET) { \
665
m_r ret; \
666
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3, p4, p5, p6, p7, p8); \
667
SYNC_DEBUG \
668
MAIN_THREAD_SYNC_CHECK \
669
return ret; \
670
} else { \
671
command_queue.flush_if_pending(); \
672
return server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
673
} \
674
}
675
676
#define FUNC8RC(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
677
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) const override { \
678
if (ASYNC_COND_PUSH_AND_RET) { \
679
m_r ret; \
680
command_queue.push_and_ret(server_name, &ServerName::m_type, &ret, p1, p2, p3, p4, p5, p6, p7, p8); \
681
SYNC_DEBUG \
682
MAIN_THREAD_SYNC_CHECK \
683
return ret; \
684
} else { \
685
command_queue.flush_if_pending(); \
686
return server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
687
} \
688
}
689
690
#define FUNC8S(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
691
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) override { \
692
WRITE_ACTION \
693
if (ASYNC_COND_PUSH_AND_SYNC) { \
694
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8); \
695
SYNC_DEBUG \
696
MAIN_THREAD_SYNC_CHECK \
697
} else { \
698
command_queue.flush_if_pending(); \
699
server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
700
} \
701
}
702
703
#define FUNC8SC(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
704
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) const override { \
705
if (ASYNC_COND_PUSH_AND_SYNC) { \
706
command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8); \
707
SYNC_DEBUG \
708
MAIN_THREAD_SYNC_CHECK \
709
} else { \
710
command_queue.flush_if_pending(); \
711
server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
712
} \
713
}
714
715
#define FUNC8(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
716
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) override { \
717
WRITE_ACTION \
718
if (ASYNC_COND_PUSH) { \
719
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8); \
720
} else { \
721
command_queue.flush_if_pending(); \
722
server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
723
} \
724
}
725
726
#define FUNC8C(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
727
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) const override { \
728
if (ASYNC_COND_PUSH) { \
729
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8); \
730
} else { \
731
command_queue.flush_if_pending(); \
732
server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
733
} \
734
}
735
736
#define FUNC9(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8, m_arg9) \
737
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8, m_arg9 p9) override { \
738
WRITE_ACTION \
739
if (ASYNC_COND_PUSH) { \
740
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8, p9); \
741
} else { \
742
command_queue.flush_if_pending(); \
743
server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8, p9); \
744
} \
745
}
746
747
#define FUNC10(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8, m_arg9, m_arg10) \
748
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8, m_arg9 p9, m_arg10 p10) override { \
749
WRITE_ACTION \
750
if (ASYNC_COND_PUSH) { \
751
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); \
752
} else { \
753
command_queue.flush_if_pending(); \
754
server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); \
755
} \
756
}
757
758
#define FUNC11(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8, m_arg9, m_arg10, m_arg11) \
759
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8, m_arg9 p9, m_arg10 p10, m_arg11 p11) override { \
760
WRITE_ACTION \
761
if (ASYNC_COND_PUSH) { \
762
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); \
763
} else { \
764
command_queue.flush_if_pending(); \
765
server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); \
766
} \
767
}
768
769
#define FUNC12(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8, m_arg9, m_arg10, m_arg11, m_arg12) \
770
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8, m_arg9 p9, m_arg10 p10, m_arg11 p11, m_arg12 p12) override { \
771
WRITE_ACTION \
772
if (ASYNC_COND_PUSH) { \
773
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); \
774
} else { \
775
command_queue.flush_if_pending(); \
776
server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); \
777
} \
778
}
779
780
#define FUNC13(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8, m_arg9, m_arg10, m_arg11, m_arg12, m_arg13) \
781
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8, m_arg9 p9, m_arg10 p10, m_arg11 p11, m_arg12 p12, m_arg13 p13) override { \
782
WRITE_ACTION \
783
if (ASYNC_COND_PUSH) { \
784
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); \
785
} else { \
786
command_queue.flush_if_pending(); \
787
server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); \
788
} \
789
}
790
791
#define FUNC14(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8, m_arg9, m_arg10, m_arg11, m_arg12, m_arg13, m_arg14) \
792
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8, m_arg9 p9, m_arg10 p10, m_arg11 p11, m_arg12 p12, m_arg13 p13, m_arg14 p14) override { \
793
WRITE_ACTION \
794
if (ASYNC_COND_PUSH) { \
795
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); \
796
} else { \
797
command_queue.flush_if_pending(); \
798
server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); \
799
} \
800
}
801
802
#define FUNC15(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8, m_arg9, m_arg10, m_arg11, m_arg12, m_arg13, m_arg14, m_arg15) \
803
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8, m_arg9 p9, m_arg10 p10, m_arg11 p11, m_arg12 p12, m_arg13 p13, m_arg14 p14, m_arg15 p15) override { \
804
WRITE_ACTION \
805
if (ASYNC_COND_PUSH) { \
806
command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); \
807
} else { \
808
command_queue.flush_if_pending(); \
809
server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); \
810
} \
811
}
812
813