@@ -7,7 +7,7 @@ use std::sync::atomic::AtomicBool;
7
7
use super :: callbacks:: clear_callbacks;
8
8
use super :: callbacks:: { CallbackContext , NotificationHandler , ProcessHandler } ;
9
9
use crate :: client:: client_impl:: Client ;
10
- use crate :: client:: common:: { sleep_on_test , CREATE_OR_DESTROY_CLIENT_MUTEX } ;
10
+ use crate :: client:: common:: CREATE_OR_DESTROY_CLIENT_MUTEX ;
11
11
use crate :: Error ;
12
12
13
13
/// A JACK client that is processing data asynchronously, in real-time.
@@ -20,7 +20,7 @@ use crate::Error;
20
20
/// ```
21
21
/// // Create a client and a handler
22
22
/// let (client, _status) =
23
- /// jack::Client::new("my_client", jack::ClientOptions::NO_START_SERVER ).unwrap();
23
+ /// jack::Client::new("my_client", jack::ClientOptions::default() ).unwrap();
24
24
/// let process_handler = jack::contrib::ClosureProcessHandler::new(
25
25
/// move |_: &jack::Client, _: &jack::ProcessScope| jack::Control::Continue,
26
26
/// );
@@ -56,19 +56,15 @@ where
56
56
pub fn new ( client : Client , notification_handler : N , process_handler : P ) -> Result < Self , Error > {
57
57
let _m = CREATE_OR_DESTROY_CLIENT_MUTEX . lock ( ) . ok ( ) ;
58
58
unsafe {
59
- sleep_on_test ( ) ;
60
59
let mut callback_context = Box :: new ( CallbackContext {
61
60
client,
62
61
notification : notification_handler,
63
62
process : process_handler,
64
- is_valid : AtomicBool :: new ( true ) ,
63
+ is_valid_for_callback : AtomicBool :: new ( true ) ,
64
+ has_panic : AtomicBool :: new ( false ) ,
65
65
} ) ;
66
66
CallbackContext :: register_callbacks ( & mut callback_context) ?;
67
- sleep_on_test ( ) ;
68
67
let res = j:: jack_activate ( callback_context. client . raw ( ) ) ;
69
- for _ in 0 ..4 {
70
- sleep_on_test ( ) ;
71
- }
72
68
match res {
73
69
0 => Ok ( AsyncClient {
74
70
callback : Some ( callback_context) ,
@@ -114,25 +110,21 @@ impl<N, P> AsyncClient<N, P> {
114
110
return Err ( Error :: ClientIsNoLongerAlive ) ;
115
111
}
116
112
let cb = self . callback . take ( ) . ok_or ( Error :: ClientIsNoLongerAlive ) ?;
117
- let client = cb. client . raw ( ) ;
113
+ let client_ptr = cb. client . raw ( ) ;
118
114
119
115
// deactivate
120
- sleep_on_test ( ) ;
121
- if j:: jack_deactivate ( client) != 0 {
116
+ if j:: jack_deactivate ( client_ptr) != 0 {
122
117
return Err ( Error :: ClientDeactivationError ) ;
123
118
}
124
119
125
120
// clear the callbacks
126
- sleep_on_test ( ) ;
127
- clear_callbacks ( client) ?;
121
+ clear_callbacks ( client_ptr) ?;
128
122
// done, take ownership of callback
129
- if cb. is_valid . load ( std:: sync:: atomic:: Ordering :: Relaxed ) {
130
- Ok ( cb)
131
- } else {
132
- std:: mem:: forget ( cb. notification ) ;
133
- std:: mem:: forget ( cb. process ) ;
134
- Err ( Error :: ClientIsNoLongerAlive )
123
+ if cb. has_panic . load ( std:: sync:: atomic:: Ordering :: Relaxed ) {
124
+ std:: mem:: forget ( cb) ;
125
+ return Err ( Error :: ClientPanicked ) ;
135
126
}
127
+ Ok ( cb)
136
128
}
137
129
}
138
130
0 commit comments