Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/include/block_abi.h
39476 views
1
/*-
2
* Copyright (c) 2014 David T Chisnall
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*/
26
27
#ifdef __BLOCKS__
28
/**
29
* Declares a block variable. This macro is defined in the trivial way for
30
* compilers that support blocks and exposing the ABI in the source for other
31
* compilers.
32
*/
33
#define DECLARE_BLOCK(retTy, name, argTys, ...)\
34
retTy(^name)(argTys, ## __VA_ARGS__)
35
/**
36
* Calls a block variable. This macro is defined in the trivial way for
37
* compilers that support blocks and exposing the ABI in the source for other
38
* compilers.
39
*/
40
#define CALL_BLOCK(name, ...) (name)(__VA_ARGS__)
41
#else // !__BLOCKS__
42
#define DECLARE_BLOCK(retTy, name, argTys, ...)\
43
struct {\
44
void *isa;\
45
int flags;\
46
int reserved;\
47
retTy (*invoke)(void *, ...);\
48
} *name
49
#define CALL_BLOCK(name, ...) (name)->invoke(name, __VA_ARGS__)
50
#endif // __BLOCKS__
51
/**
52
* Returns the pointer to the block-invoke function. This is used for passing
53
* blocks to functions that want a function pointer and a data pointer.
54
*/
55
#define GET_BLOCK_FUNCTION(x) \
56
(((struct {\
57
void *isa;\
58
int flags;\
59
int reserved;\
60
void (*invoke)(void *, ...);\
61
}*)(void*)x)->invoke)
62
63