@@ -19,32 +19,47 @@ pub(crate) struct RuntimeRegistry {
1919pub enum RegistryAccessError {
2020 #[ error( "the runtime registry is poisoned" ) ]
2121 Poisoned ,
22+
23+ #[ error( "The SDK ShutdownManager already exists" ) ]
24+ ExistingShutdownManager ,
25+
26+ #[ error( "No existing SDK ShutdownManager" ) ]
27+ MissingShutdownManager ,
2228}
2329
2430impl RuntimeRegistry {
25- /// Get or create a ShutdownManager for SDK use.
31+ /// Create a ShutdownManager for SDK use.
2632 /// This manager doesn't listen to OS signals, making it suitable for library use.
27- pub ( crate ) fn get_or_create_sdk ( ) -> Result < Arc < ShutdownManager > , RegistryAccessError > {
28- let guard = REGISTRY
29- . sdk_manager
30- . read ( )
31- . map_err ( |_| RegistryAccessError :: Poisoned ) ?;
32- if let Some ( manager) = guard. as_ref ( ) {
33- return Ok ( manager. clone ( ) ) ;
34- }
35- drop ( guard) ;
36-
33+ /// This function overwrite any existing manager!
34+ pub ( crate ) fn create_sdk ( ) -> Result < Arc < ShutdownManager > , RegistryAccessError > {
3735 let mut guard = REGISTRY
3836 . sdk_manager
3937 . write ( )
4038 . map_err ( |_| RegistryAccessError :: Poisoned ) ?;
39+
4140 Ok ( guard
42- . get_or_insert_with ( || {
43- Arc :: new ( ShutdownManager :: new_without_signals ( ) . with_cancel_on_panic ( ) )
44- } )
41+ . insert ( Arc :: new (
42+ ShutdownManager :: new_without_signals ( ) . with_cancel_on_panic ( ) ,
43+ ) )
4544 . clone ( ) )
4645 }
4746
47+ /// Get the ShutdownManager for SDK use.
48+ /// This manager doesn't listen to OS signals, making it suitable for library use.
49+ /// Not yet used, but maybe in the future
50+ #[ allow( dead_code) ]
51+ pub ( crate ) fn get_sdk ( ) -> Result < Arc < ShutdownManager > , RegistryAccessError > {
52+ let guard = REGISTRY
53+ . sdk_manager
54+ . read ( )
55+ . map_err ( |_| RegistryAccessError :: Poisoned ) ?;
56+ if let Some ( manager) = guard. as_ref ( ) {
57+ Ok ( manager. clone ( ) )
58+ } else {
59+ Err ( RegistryAccessError :: MissingShutdownManager )
60+ }
61+ }
62+
4863 /// Check if an SDK manager has been created.
4964 /// Useful for testing and debugging.
5065 #[ allow( dead_code) ]
@@ -85,10 +100,13 @@ mod tests {
85100
86101 assert ! ( !RuntimeRegistry :: has_sdk_manager( ) . unwrap( ) ) ;
87102
88- let manager1 = RuntimeRegistry :: get_or_create_sdk ( ) . unwrap ( ) ;
103+ // Error if nothing was created
104+ assert ! ( RuntimeRegistry :: get_sdk( ) . is_err( ) ) ;
105+
106+ let manager1 = RuntimeRegistry :: create_sdk ( ) . unwrap ( ) ;
89107 assert ! ( RuntimeRegistry :: has_sdk_manager( ) . unwrap( ) ) ;
90108
91- let manager2 = RuntimeRegistry :: get_or_create_sdk ( ) . unwrap ( ) ;
109+ let manager2 = RuntimeRegistry :: get_sdk ( ) . unwrap ( ) ;
92110 // Should return the same instance
93111 assert ! ( Arc :: ptr_eq( & manager1, & manager2) ) ;
94112
0 commit comments