struct PeekMutGuard<'a, T: Ord> {
peek: Option<PeekMut<'a, T>>,
unused: &'a mut LinkedList<T>,
}
Expand description
This is a wrapper for the PeekMut
of heap.
Several panics due to future cancellation are caused by calling drop
on the PeekMut
when
futures holding the PeekMut
are cancelled and dropped. Dropping a PeekMut
will accidentally
cause a comparison between the top node and the node below, and may call key()
for top node
iterators that are in some intermediate inconsistent states.
When a PeekMut
is wrapped by this guard, when the guard is dropped, PeekMut::pop
will be
called on the PeekMut
, and the popped node will be added to the linked list that collects the
unused nodes. In this way, when the future holding the guard is dropped, the PeekMut
will not
be called drop
, and there will not be unexpected key()
called for heap comparison.
In normal usage, when we finished using the PeekMut
, we should explicitly call guard.used()
in every branch carefully. When we want to pop the PeekMut
, we can simply call guard.pop()
.
Fields§
§peek: Option<PeekMut<'a, T>>
§unused: &'a mut LinkedList<T>
Implementations§
source§impl<'a, T: Ord> PeekMutGuard<'a, T>
impl<'a, T: Ord> PeekMutGuard<'a, T>
sourcefn peek_mut(
heap: &'a mut BinaryHeap<T>,
unused: &'a mut LinkedList<T>,
) -> Option<Self>
fn peek_mut( heap: &'a mut BinaryHeap<T>, unused: &'a mut LinkedList<T>, ) -> Option<Self>
Call peek_mut
on the top of heap and return a guard over the PeekMut
if the heap is not
empty.
Trait Implementations§
source§impl<T: Ord> Deref for PeekMutGuard<'_, T>
impl<T: Ord> Deref for PeekMutGuard<'_, T>
source§impl<T: Ord> DerefMut for PeekMutGuard<'_, T>
impl<T: Ord> DerefMut for PeekMutGuard<'_, T>
Auto Trait Implementations§
impl<'a, T> Freeze for PeekMutGuard<'a, T>
impl<'a, T> RefUnwindSafe for PeekMutGuard<'a, T>where
T: RefUnwindSafe,
impl<'a, T> Send for PeekMutGuard<'a, T>where
T: Send,
impl<'a, T> Sync for PeekMutGuard<'a, T>where
T: Sync,
impl<'a, T> Unpin for PeekMutGuard<'a, T>
impl<'a, T> !UnwindSafe for PeekMutGuard<'a, T>
Blanket Implementations§
§impl<T, A, P> Access<T> for P
impl<T, A, P> Access<T> for P
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T, A> DynAccess<T> for Awhere
A: Access<T>,
<A as Access<T>>::Guard: 'static,
impl<T, A> DynAccess<T> for Awhere
A: Access<T>,
<A as Access<T>>::Guard: 'static,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
type Err = Infallible
fn into_result(self) -> Result<T, <T as IntoResult<T>>::Err>
source§impl<M> MetricVecRelabelExt for M
impl<M> MetricVecRelabelExt for M
source§fn relabel(
self,
metric_level: MetricLevel,
relabel_threshold: MetricLevel,
) -> RelabeledMetricVec<M>
fn relabel( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level
.source§fn relabel_n(
self,
metric_level: MetricLevel,
relabel_threshold: MetricLevel,
relabel_num: usize,
) -> RelabeledMetricVec<M>
fn relabel_n( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, relabel_num: usize, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level_relabel_n
.source§fn relabel_debug_1(
self,
relabel_threshold: MetricLevel,
) -> RelabeledMetricVec<M>
fn relabel_debug_1( self, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level_relabel_n
with metric_level
set to
MetricLevel::Debug
and relabel_num
set to 1.