11use std:: fmt;
2+ use std:: sync:: atomic:: { AtomicU16 , AtomicU64 , Ordering } ;
23use std:: sync:: Arc ;
34
4- use util:: sync:: Mutex ;
5-
65/// Sequencer generates sequential sequence numbers for building RTP packets
76pub trait Sequencer : fmt:: Debug {
87 fn next_sequence_number ( & self ) -> u16 ;
@@ -20,10 +19,10 @@ impl Clone for Box<dyn Sequencer + Send + Sync> {
2019/// number
2120pub fn new_random_sequencer ( ) -> impl Sequencer {
2221 let c = Counters {
23- sequence_number : rand:: random :: < u16 > ( ) ,
24- roll_over_count : 0 ,
22+ sequence_number : Arc :: new ( AtomicU16 :: new ( rand:: random :: < u16 > ( ) ) ) ,
23+ roll_over_count : Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
2524 } ;
26- SequencerImpl ( Arc :: new ( Mutex :: new ( c ) ) )
25+ SequencerImpl ( c )
2726}
2827
2928/// NewFixedSequencer returns a new sequencer starting from a specific
@@ -32,42 +31,39 @@ pub fn new_fixed_sequencer(s: u16) -> impl Sequencer {
3231 let sequence_number = if s == 0 { u16:: MAX } else { s - 1 } ;
3332
3433 let c = Counters {
35- sequence_number,
36- roll_over_count : 0 ,
34+ sequence_number : Arc :: new ( AtomicU16 :: new ( sequence_number ) ) ,
35+ roll_over_count : Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
3736 } ;
3837
39- SequencerImpl ( Arc :: new ( Mutex :: new ( c ) ) )
38+ SequencerImpl ( c )
4039}
4140
4241#[ derive( Debug , Clone ) ]
43- struct SequencerImpl ( Arc < Mutex < Counters > > ) ;
42+ struct SequencerImpl ( Counters ) ;
4443
45- #[ derive( Debug ) ]
44+ #[ derive( Debug , Clone ) ]
4645struct Counters {
47- sequence_number : u16 ,
48- roll_over_count : u64 ,
46+ sequence_number : Arc < AtomicU16 > ,
47+ roll_over_count : Arc < AtomicU64 > ,
4948}
5049
5150impl Sequencer for SequencerImpl {
5251 /// NextSequenceNumber increment and returns a new sequence number for
5352 /// building RTP packets
5453 fn next_sequence_number ( & self ) -> u16 {
55- let mut lock = self . 0 . lock ( ) ;
56-
57- if lock. sequence_number == u16:: MAX {
58- lock. roll_over_count += 1 ;
59- lock. sequence_number = 0 ;
54+ if self . 0 . sequence_number . load ( Ordering :: SeqCst ) == u16:: MAX {
55+ self . 0 . roll_over_count . fetch_add ( 1 , Ordering :: SeqCst ) ;
56+ self . 0 . sequence_number . store ( 0 , Ordering :: SeqCst ) ;
57+ 0
6058 } else {
61- lock . sequence_number += 1 ;
59+ self . 0 . sequence_number . fetch_add ( 1 , Ordering :: SeqCst ) + 1
6260 }
63-
64- lock. sequence_number
6561 }
6662
6763 /// RollOverCount returns the amount of times the 16bit sequence number
6864 /// has wrapped
6965 fn roll_over_count ( & self ) -> u64 {
70- self . 0 . lock ( ) . roll_over_count
66+ self . 0 . roll_over_count . load ( Ordering :: SeqCst )
7167 }
7268
7369 fn clone_to ( & self ) -> Box < dyn Sequencer + Send + Sync > {
0 commit comments