@@ -34,9 +34,14 @@ use crate::{
34
34
#[ allow( clippy:: type_complexity) ]
35
35
#[ derive( Debug ) ]
36
36
pub struct MemoryStore {
37
- media : StdRwLock < RingBuffer < ( OwnedMxcUri , String /* unique key */ , Vec < u8 > ) > > ,
38
- leases : StdRwLock < HashMap < String , ( String , Instant ) > > ,
39
- events : StdRwLock < RelationalLinkedChunk < Event , Gap > > ,
37
+ inner : StdRwLock < MemoryStoreInner > ,
38
+ }
39
+
40
+ #[ derive( Debug ) ]
41
+ struct MemoryStoreInner {
42
+ media : RingBuffer < ( OwnedMxcUri , String /* unique key */ , Vec < u8 > ) > ,
43
+ leases : HashMap < String , ( String , Instant ) > ,
44
+ events : RelationalLinkedChunk < Event , Gap > ,
40
45
}
41
46
42
47
// SAFETY: `new_unchecked` is safe because 20 is not zero.
@@ -45,9 +50,11 @@ const NUMBER_OF_MEDIAS: NonZeroUsize = unsafe { NonZeroUsize::new_unchecked(20)
45
50
impl Default for MemoryStore {
46
51
fn default ( ) -> Self {
47
52
Self {
48
- media : StdRwLock :: new ( RingBuffer :: new ( NUMBER_OF_MEDIAS ) ) ,
49
- leases : Default :: default ( ) ,
50
- events : StdRwLock :: new ( RelationalLinkedChunk :: new ( ) ) ,
53
+ inner : StdRwLock :: new ( MemoryStoreInner {
54
+ media : RingBuffer :: new ( NUMBER_OF_MEDIAS ) ,
55
+ leases : Default :: default ( ) ,
56
+ events : RelationalLinkedChunk :: new ( ) ,
57
+ } ) ,
51
58
}
52
59
}
53
60
}
@@ -70,17 +77,19 @@ impl EventCacheStore for MemoryStore {
70
77
key : & str ,
71
78
holder : & str ,
72
79
) -> Result < bool , Self :: Error > {
73
- Ok ( try_take_leased_lock ( & self . leases , lease_duration_ms, key, holder) )
80
+ let mut inner = self . inner . write ( ) . unwrap ( ) ;
81
+
82
+ Ok ( try_take_leased_lock ( & mut inner. leases , lease_duration_ms, key, holder) )
74
83
}
75
84
76
85
async fn handle_linked_chunk_updates (
77
86
& self ,
78
87
room_id : & RoomId ,
79
88
updates : & [ Update < Event , Gap > ] ,
80
89
) -> Result < ( ) , Self :: Error > {
81
- self . events . write ( ) . unwrap ( ) . apply_updates ( room_id , updates ) ;
90
+ let mut inner = self . inner . write ( ) . unwrap ( ) ;
82
91
83
- Ok ( ( ) )
92
+ Ok ( inner . events . apply_updates ( updates ) )
84
93
}
85
94
86
95
async fn add_media_content (
@@ -90,8 +99,10 @@ impl EventCacheStore for MemoryStore {
90
99
) -> Result < ( ) > {
91
100
// Avoid duplication. Let's try to remove it first.
92
101
self . remove_media_content ( request) . await ?;
102
+
93
103
// Now, let's add it.
94
- self . media . write ( ) . unwrap ( ) . push ( ( request. uri ( ) . to_owned ( ) , request. unique_key ( ) , data) ) ;
104
+ let mut inner = self . inner . write ( ) . unwrap ( ) ;
105
+ inner. media . push ( ( request. uri ( ) . to_owned ( ) , request. unique_key ( ) , data) ) ;
95
106
96
107
Ok ( ( ) )
97
108
}
@@ -103,8 +114,10 @@ impl EventCacheStore for MemoryStore {
103
114
) -> Result < ( ) , Self :: Error > {
104
115
let expected_key = from. unique_key ( ) ;
105
116
106
- let mut medias = self . media . write ( ) . unwrap ( ) ;
107
- if let Some ( ( mxc, key, _) ) = medias. iter_mut ( ) . find ( |( _, key, _) | * key == expected_key) {
117
+ let mut inner = self . inner . write ( ) . unwrap ( ) ;
118
+
119
+ if let Some ( ( mxc, key, _) ) = inner. media . iter_mut ( ) . find ( |( _, key, _) | * key == expected_key)
120
+ {
108
121
* mxc = to. uri ( ) . to_owned ( ) ;
109
122
* key = to. unique_key ( ) ;
110
123
}
@@ -115,32 +128,37 @@ impl EventCacheStore for MemoryStore {
115
128
async fn get_media_content ( & self , request : & MediaRequestParameters ) -> Result < Option < Vec < u8 > > > {
116
129
let expected_key = request. unique_key ( ) ;
117
130
118
- let media = self . media . read ( ) . unwrap ( ) ;
119
- Ok ( media. iter ( ) . find_map ( |( _media_uri, media_key, media_content) | {
131
+ let inner = self . inner . write ( ) . unwrap ( ) ;
132
+
133
+ Ok ( inner. media . iter ( ) . find_map ( |( _media_uri, media_key, media_content) | {
120
134
( media_key == & expected_key) . then ( || media_content. to_owned ( ) )
121
135
} ) )
122
136
}
123
137
124
138
async fn remove_media_content ( & self , request : & MediaRequestParameters ) -> Result < ( ) > {
125
139
let expected_key = request. unique_key ( ) ;
126
140
127
- let mut media = self . media . write ( ) . unwrap ( ) ;
128
- let Some ( index) = media
141
+ let mut inner = self . inner . write ( ) . unwrap ( ) ;
142
+
143
+ let Some ( index) = inner
144
+ . media
129
145
. iter ( )
130
146
. position ( |( _media_uri, media_key, _media_content) | media_key == & expected_key)
131
147
else {
132
148
return Ok ( ( ) ) ;
133
149
} ;
134
150
135
- media. remove ( index) ;
151
+ inner . media . remove ( index) ;
136
152
137
153
Ok ( ( ) )
138
154
}
139
155
140
156
async fn remove_media_content_for_uri ( & self , uri : & MxcUri ) -> Result < ( ) > {
141
- let mut media = self . media . write ( ) . unwrap ( ) ;
157
+ let mut inner = self . inner . write ( ) . unwrap ( ) ;
158
+
142
159
let expected_key = uri. to_owned ( ) ;
143
- let positions = media
160
+ let positions = inner
161
+ . media
144
162
. iter ( )
145
163
. enumerate ( )
146
164
. filter_map ( |( position, ( media_uri, _media_key, _media_content) ) | {
@@ -150,7 +168,7 @@ impl EventCacheStore for MemoryStore {
150
168
151
169
// Iterate in reverse-order so that positions stay valid after first removals.
152
170
for position in positions. into_iter ( ) . rev ( ) {
153
- media. remove ( position) ;
171
+ inner . media . remove ( position) ;
154
172
}
155
173
156
174
Ok ( ( ) )
0 commit comments