From a7377c585557f05e82d1d090ccbc3b874476e084 Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Tue, 26 Dec 2023 15:52:13 -0600 Subject: [PATCH] Combine held types --- server/src/depot.rs | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/server/src/depot.rs b/server/src/depot.rs index d45b81f..59d1508 100644 --- a/server/src/depot.rs +++ b/server/src/depot.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use tracing::{warn, info, trace}; -use tokio::sync::{Mutex, OwnedMutexGuard, Semaphore}; +use tokio::sync::{Mutex, OwnedMutexGuard, Semaphore, OwnedSemaphorePermit}; use crate::{blocks::Position, turtle::TurtleCommander}; use crate::turtle::{TurtleCommand::*, TurtleCommandResponse}; @@ -17,21 +17,39 @@ pub struct Depots { depot_semaphore: Arc, } +pub struct DepotGuard { + mutex: OwnedMutexGuard, + #[allow(unused)] + semaphore: OwnedSemaphorePermit, // "dropped in declaration order" + // - reference chapter 10.8 +} + +impl DepotGuard { + pub fn new(mutex: OwnedMutexGuard, semaphore: OwnedSemaphorePermit) -> Self { Self { mutex, semaphore } } + + fn position(&self) -> &Position { + &self.mutex + } + +} + impl Depots { /// Nearest depot to the given position - pub async fn nearest(&self, pos: Position) -> Option> { - self.depots.lock().await + pub async fn nearest(&self, pos: Position) -> DepotGuard { + let permit = self.depot_semaphore.clone().acquire_owned().await.unwrap(); + let mutex = self.depots.lock().await .iter().map(|i| i.clone()) .filter_map(|i| i.try_lock_owned().ok()) .min_by_key(|d| d.manhattan(pos)) - .map(|d| d) + .map(|d| d); + + DepotGuard::new(mutex.unwrap(), permit) } pub async fn dock(&self, turtle: TurtleCommander) -> Option { - let permit = self.depot_semaphore.clone().acquire_owned().await.unwrap(); - let depot = self.clone().nearest(turtle.pos().await).await?; - trace!("depot at {depot:?}"); - turtle.goto(*depot).await?; + let depot = self.clone().nearest(turtle.pos().await).await; + trace!("depot at {:?}", depot.position()); + turtle.goto(*depot.position()).await?; // dump inventory for i in 1..=16 { @@ -61,7 +79,6 @@ impl Depots { turtle.execute(Backward(4)).await; drop(depot); - drop(permit); // lava bucket fix for i in 1..=16 {