1 | /* |
2 | * Copyright 2016-present Facebook, Inc. |
3 | * |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. |
6 | * You may obtain a copy of the License at |
7 | * |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * |
10 | * Unless required by applicable law or agreed to in writing, software |
11 | * distributed under the License is distributed on an "AS IS" BASIS, |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | * See the License for the specific language governing permissions and |
14 | * limitations under the License. |
15 | */ |
16 | |
17 | #pragma once |
18 | |
19 | #include <exception> |
20 | #include <typeinfo> |
21 | |
22 | namespace folly { |
23 | namespace exception_tracer { |
24 | |
25 | namespace detail { |
26 | /* |
27 | * Unfortunately due to ambiguous nature of exception specifiers, |
28 | * standard does not allow them to appear in typedefs or alias-declarations. |
29 | * We, however, want callbacks to be exception safe. |
30 | * This dummies are an ugly workaround that problem. |
31 | */ |
32 | void dummyCxaThrow(void*, std::type_info*, void (*)(void*)) noexcept; |
33 | void dummyCxaBeginCatch(void*) noexcept; |
34 | void dummyCxaRethrow() noexcept; |
35 | void dummyCxaEndCatch() noexcept; |
36 | void dummyRethrowException(std::exception_ptr) noexcept; |
37 | } // namespace detail |
38 | |
39 | using CxaThrowType = decltype(&detail::dummyCxaThrow); |
40 | using CxaBeginCatchType = decltype(&detail::dummyCxaBeginCatch); |
41 | using CxaRethrowType = decltype(&detail::dummyCxaRethrow); |
42 | using CxaEndCatchType = decltype(&detail::dummyCxaEndCatch); |
43 | using RethrowExceptionType = decltype(&detail::dummyRethrowException); |
44 | |
45 | void registerCxaThrowCallback(CxaThrowType callback); |
46 | void registerCxaBeginCatchCallback(CxaBeginCatchType callback); |
47 | void registerCxaRethrowCallback(CxaRethrowType callback); |
48 | void registerCxaEndCatchCallback(CxaEndCatchType callback); |
49 | void registerRethrowExceptionCallback(RethrowExceptionType callback); |
50 | } // namespace exception_tracer |
51 | } // namespace folly |
52 | |