1
- use std:: { collections:: HashMap , sync:: Arc } ;
1
+ use std:: {
2
+ collections:: HashMap ,
3
+ sync:: atomic:: { AtomicU16 , Ordering } ,
4
+ } ;
2
5
3
6
use chia_protocol:: Message ;
4
- use tokio:: sync:: { oneshot, Mutex , OwnedSemaphorePermit , Semaphore } ;
7
+ use tokio:: sync:: { oneshot, Mutex } ;
5
8
6
9
#[ derive( Debug ) ]
7
10
pub ( crate ) struct Request {
8
11
sender : oneshot:: Sender < Message > ,
9
- _permit : OwnedSemaphorePermit ,
10
12
}
11
13
12
14
impl Request {
@@ -17,41 +19,27 @@ impl Request {
17
19
18
20
#[ derive( Debug ) ]
19
21
pub ( crate ) struct RequestMap {
22
+ next_id : AtomicU16 ,
20
23
items : Mutex < HashMap < u16 , Request > > ,
21
- semaphore : Arc < Semaphore > ,
22
24
}
23
25
24
26
impl RequestMap {
25
27
pub ( crate ) fn new ( ) -> Self {
26
28
Self {
29
+ next_id : AtomicU16 :: new ( 0 ) ,
27
30
items : Mutex :: new ( HashMap :: new ( ) ) ,
28
- semaphore : Arc :: new ( Semaphore :: new ( u16:: MAX as usize ) ) ,
29
31
}
30
32
}
31
33
32
34
pub ( crate ) async fn insert ( & self , sender : oneshot:: Sender < Message > ) -> u16 {
33
- let permit = self
34
- . semaphore
35
- . clone ( )
36
- . acquire_owned ( )
37
- . await
38
- . expect ( "semaphore closed" ) ;
39
-
40
35
let mut items = self . items . lock ( ) . await ;
41
36
42
37
items. retain ( |_, v| !v. sender . is_closed ( ) ) ;
43
38
44
- let index = ( 0 ..=u16:: MAX )
45
- . find ( |i| !items. contains_key ( i) )
46
- . expect ( "exceeded expected number of requests" ) ;
47
-
48
- items. insert (
49
- index,
50
- Request {
51
- sender,
52
- _permit : permit,
53
- } ,
54
- ) ;
39
+ let index = self . next_id . fetch_add ( 0 , Ordering :: SeqCst ) ;
40
+
41
+ items. insert ( index, Request { sender } ) ;
42
+
55
43
index
56
44
}
57
45
0 commit comments