Get or create an in-process lock for a proxy fingerprint.
(&self, fingerprint: &str)
| 78 | |
| 79 | /// Get or create an in-process lock for a proxy fingerprint. |
| 80 | async fn get_or_create_lock(&self, fingerprint: &str) -> Arc<Mutex<()>> { |
| 81 | { |
| 82 | let locks = self.fingerprint_locks.read().await; |
| 83 | if let Some(lock) = locks.get(fingerprint) { |
| 84 | return Arc::clone(lock); |
| 85 | } |
| 86 | } |
| 87 | |
| 88 | let mut locks = self.fingerprint_locks.write().await; |
| 89 | |
| 90 | // Double-check: another task may have inserted while we waited for the write lock |
| 91 | if let Some(lock) = locks.get(fingerprint) { |
| 92 | return Arc::clone(lock); |
| 93 | } |
| 94 | |
| 95 | let new_lock = Arc::new(Mutex::new(())); |
| 96 | locks.insert(fingerprint.to_string(), Arc::clone(&new_lock)); |
| 97 | new_lock |
| 98 | } |
| 99 | |
| 100 | fn lock_path(&self, fingerprint: &str) -> PathBuf { |
| 101 | self.runtime_dir.join(format!("proxy-{fingerprint}.lock")) |