52
52
extern crate slog;
53
53
extern crate thread_local;
54
54
extern crate take_mut;
55
+ extern crate crossbeam_channel;
56
+
57
+ use crossbeam_channel:: Sender ;
55
58
56
59
use slog:: { Record , RecordStatic , Level , SingleKV , KV , BorrowedKV } ;
57
60
use slog:: { Serializer , OwnedKVList , Key } ;
@@ -62,7 +65,7 @@ use std::error::Error;
62
65
use std:: fmt;
63
66
use std:: sync;
64
67
65
- use std:: sync:: { mpsc , Mutex } ;
68
+ use std:: sync:: Mutex ;
66
69
use std:: sync:: atomic:: AtomicUsize ;
67
70
use std:: sync:: atomic:: Ordering ;
68
71
use take_mut:: take;
@@ -184,19 +187,14 @@ pub enum AsyncError {
184
187
Fatal ( Box < std:: error:: Error > ) ,
185
188
}
186
189
187
- impl < T > From < mpsc:: TrySendError < T > > for AsyncError {
188
- fn from ( _: mpsc:: TrySendError < T > ) -> AsyncError {
189
- AsyncError :: Full
190
- }
191
- }
192
- impl < T > From < std:: sync:: TryLockError < T > > for AsyncError {
193
- fn from ( _: std:: sync:: TryLockError < T > ) -> AsyncError {
190
+ impl < T > From < crossbeam_channel:: TrySendError < T > > for AsyncError {
191
+ fn from ( _: crossbeam_channel:: TrySendError < T > ) -> AsyncError {
194
192
AsyncError :: Full
195
193
}
196
194
}
197
195
198
- impl < T > From < mpsc :: SendError < T > > for AsyncError {
199
- fn from ( _: mpsc :: SendError < T > ) -> AsyncError {
196
+ impl < T > From < crossbeam_channel :: SendError < T > > for AsyncError {
197
+ fn from ( _: crossbeam_channel :: SendError < T > ) -> AsyncError {
200
198
AsyncError :: Fatal ( Box :: new (
201
199
io:: Error :: new ( io:: ErrorKind :: BrokenPipe , "The logger thread terminated" ) ,
202
200
) )
@@ -210,6 +208,7 @@ impl<T> From<std::sync::PoisonError<T>> for AsyncError {
210
208
) )
211
209
}
212
210
}
211
+
213
212
/// `AsyncResult` alias
214
213
pub type AsyncResult < T > = std:: result:: Result < T , AsyncError > ;
215
214
@@ -271,8 +270,8 @@ where
271
270
272
271
fn spawn_thread (
273
272
self ,
274
- ) -> ( thread:: JoinHandle < ( ) > , mpsc :: SyncSender < AsyncMsg > ) {
275
- let ( tx, rx) = mpsc :: sync_channel ( self . chan_size ) ;
273
+ ) -> ( thread:: JoinHandle < ( ) > , Sender < AsyncMsg > ) {
274
+ let ( tx, rx) = crossbeam_channel :: bounded ( self . chan_size ) ;
276
275
let mut builder = thread:: Builder :: new ( ) ;
277
276
if let Some ( thread_name) = self . thread_name {
278
277
builder = builder. name ( thread_name) ;
@@ -316,7 +315,7 @@ where
316
315
let ( join, tx) = self . spawn_thread ( ) ;
317
316
318
317
AsyncCore {
319
- ref_sender : Mutex :: new ( tx ) ,
318
+ ref_sender : tx ,
320
319
tl_sender : thread_local:: ThreadLocal :: new ( ) ,
321
320
join : Mutex :: new ( Some ( join) ) ,
322
321
blocking,
@@ -332,7 +331,7 @@ where
332
331
333
332
(
334
333
AsyncCore {
335
- ref_sender : Mutex :: new ( tx. clone ( ) ) ,
334
+ ref_sender : tx. clone ( ) ,
336
335
tl_sender : thread_local:: ThreadLocal :: new ( ) ,
337
336
join : Mutex :: new ( None ) ,
338
337
blocking,
@@ -363,7 +362,7 @@ pub struct AsyncGuard {
363
362
// Should always be `Some`. `None` only
364
363
// after `drop`
365
364
join : Option < thread:: JoinHandle < ( ) > > ,
366
- tx : mpsc :: SyncSender < AsyncMsg > ,
365
+ tx : Sender < AsyncMsg > ,
367
366
}
368
367
369
368
impl Drop for AsyncGuard {
@@ -395,8 +394,8 @@ impl Drop for AsyncGuard {
395
394
/// handling all previous `Record`s sent to it). If you can't tolerate the
396
395
/// delay, make sure you drop it eg. in another thread.
397
396
pub struct AsyncCore {
398
- ref_sender : Mutex < mpsc :: SyncSender < AsyncMsg > > ,
399
- tl_sender : thread_local:: ThreadLocal < mpsc :: SyncSender < AsyncMsg > > ,
397
+ ref_sender : Sender < AsyncMsg > ,
398
+ tl_sender : thread_local:: ThreadLocal < Sender < AsyncMsg > > ,
400
399
join : Mutex < Option < thread:: JoinHandle < ( ) > > > ,
401
400
blocking : bool ,
402
401
}
@@ -422,11 +421,11 @@ impl AsyncCore {
422
421
fn get_sender (
423
422
& self ,
424
423
) -> Result <
425
- & mpsc :: SyncSender < AsyncMsg > ,
426
- std:: sync:: PoisonError < sync:: MutexGuard < mpsc :: SyncSender < AsyncMsg > > > ,
424
+ & crossbeam_channel :: Sender < AsyncMsg > ,
425
+ std:: sync:: PoisonError < sync:: MutexGuard < crossbeam_channel :: Sender < AsyncMsg > > > ,
427
426
> {
428
427
self . tl_sender
429
- . get_or_try ( || Ok ( Box :: new ( self . ref_sender . lock ( ) ? . clone ( ) ) ) )
428
+ . get_or_try ( || Ok ( Box :: new ( self . ref_sender . clone ( ) ) ) )
430
429
}
431
430
432
431
/// Send `AsyncRecord` to a worker thread.
0 commit comments