8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- use core :: sync :: atomic :: { AtomicPtr , Ordering } ;
12
- use core :: mem ;
11
+ # [ cfg ( target_has_atomic = "ptr" ) ]
12
+ pub use self :: imp :: set_oom_handler ;
13
13
use core:: intrinsics;
14
14
15
- static OOM_HANDLER : AtomicPtr < ( ) > = AtomicPtr :: new ( default_oom_handler as * mut ( ) ) ;
16
-
17
15
fn default_oom_handler ( ) -> ! {
18
16
// The default handler can't do much more since we can't assume the presence
19
17
// of libc or any way of printing an error message.
@@ -26,17 +24,38 @@ fn default_oom_handler() -> ! {
26
24
#[ unstable( feature = "oom" , reason = "not a scrutinized interface" ,
27
25
issue = "27700" ) ]
28
26
pub fn oom ( ) -> ! {
29
- let value = OOM_HANDLER . load ( Ordering :: SeqCst ) ;
30
- let handler: fn ( ) -> ! = unsafe { mem:: transmute ( value) } ;
31
- handler ( ) ;
27
+ self :: imp:: oom ( )
32
28
}
33
29
34
- /// Set a custom handler for out-of-memory conditions
35
- ///
36
- /// To avoid recursive OOM failures, it is critical that the OOM handler does
37
- /// not allocate any memory itself.
38
- #[ unstable( feature = "oom" , reason = "not a scrutinized interface" ,
39
- issue = "27700" ) ]
40
- pub fn set_oom_handler ( handler : fn ( ) -> !) {
41
- OOM_HANDLER . store ( handler as * mut ( ) , Ordering :: SeqCst ) ;
30
+ #[ cfg( target_has_atomic = "ptr" ) ]
31
+ mod imp {
32
+ use core:: mem;
33
+ use core:: sync:: atomic:: { AtomicPtr , Ordering } ;
34
+
35
+ static OOM_HANDLER : AtomicPtr < ( ) > = AtomicPtr :: new ( super :: default_oom_handler as * mut ( ) ) ;
36
+
37
+ #[ inline( always) ]
38
+ pub fn oom ( ) -> ! {
39
+ let value = OOM_HANDLER . load ( Ordering :: SeqCst ) ;
40
+ let handler: fn ( ) -> ! = unsafe { mem:: transmute ( value) } ;
41
+ handler ( ) ;
42
+ }
43
+
44
+ /// Set a custom handler for out-of-memory conditions
45
+ ///
46
+ /// To avoid recursive OOM failures, it is critical that the OOM handler does
47
+ /// not allocate any memory itself.
48
+ #[ unstable( feature = "oom" , reason = "not a scrutinized interface" ,
49
+ issue = "27700" ) ]
50
+ pub fn set_oom_handler ( handler : fn ( ) -> !) {
51
+ OOM_HANDLER . store ( handler as * mut ( ) , Ordering :: SeqCst ) ;
52
+ }
53
+ }
54
+
55
+ #[ cfg( not( target_has_atomic = "ptr" ) ) ]
56
+ mod imp {
57
+ #[ inline( always) ]
58
+ pub fn oom ( ) -> ! {
59
+ super :: default_oom_handler ( )
60
+ }
42
61
}
0 commit comments