У меня есть объект типа
Arc<RwLock<SessionData>>
И у меня есть метод, который должен принимать какую-то ссылку на SessionData
fn some_method(session: ...)
Я использую Rocket(веб-фреймворк для Rust), и я не могу напрямую вызвать метод, потому что он вызывается Rocket.Тем не менее, я могу предоставить ему реализацию, которая создает объект, который будет передан обработчику.Это выглядит примерно так:
impl<'a, 'r> request::FromRequest<'a, 'r> for SomeType {
type Error = ();
fn from_request(request: &'a request::Request<'r>) -> request::Outcome<Self, Self::Error> {
// return object here
}
}
Я хочу не возвращать RwLock
напрямую, потому что я хочу, чтобы обработчик передавал ему уже заблокированный объект.Однако я не могу вернуть ссылку или RwLockReadGuard
, потому что они оба зависят от RwLock
, который выходит за рамки.
Вместо этого я пытаюсь создать какое-то сам-подходящий тип, который будет содержать Arc<RwLock<SessionData>>
, содержать защитную блокировку для этой блокировки и разыменовать объект SessionData
.
До сих пор я пробовал некоторые комбинации из следующих:
- A
Session
объект, который содержит Arc<RwLock<SessionData>>
и RwLockReadGuard<SessionData>
- Объект, который содержит
Arc<RwLock<SessionData>>
и RwLockReadGuardRef<SessionData>
из owning ref library. - Объект, который будет использовать тип
OwnedHandle
из библиотеки owning-ref .
Однако я не смогделать то, что я хочу делать, сталкиваясь с различными проблемами заимствования и тому подобное.
Возможно ли вообще создать что-то вроде автономного «дескрипторного» объекта, который будет содержать какблокировка и блокировка защиты объекта, на который он указывает?
Это похоже, но немного отличаетсяДругая ситуация, чем описано в Как вернуть ссылку на подзначение значения, находящегося в мьютексе? .Там MutexGuardRef
внутренне зависит от Mutex
и не может существовать, если Mutex
(или MyStruct
) выходит из области видимости.Чтобы добиться подобного поведения, я должен передать структуру, содержащую мой RwLock
, а затем выполнить блокировку внутри метода.Это нормально, но мне интересно, могу ли я пойти еще дальше и передать структуру, которая является независимой и служит RwLockGuard
, избегая необходимости блокироватьвручную.
По сути, я хочу перенести блокировку RwLock
с клиента на поставщика значения.