m12-lifecycle

Use when designing resource lifecycles. Keywords: RAII, Drop, resource lifecycle, connection pool, lazy initialization, connection pool design, resource cleanup patterns, cleanup, scope, OnceCell, Lazy, once_cell, OnceLock, transaction, session management, when is Drop called, cleanup on error, guar

By actionbook · 2,766 installs

npx skills add actionbook/rust-skills --skill m12-lifecycle

Source repository · Upstream listing

Resource Lifecycle Layer 2: Design Choices Core Question When should this resource be created, used, and cleaned up? Before implementing lifecycle: What's the resource's scope? Who owns the cleanup responsibility? What happens on error? Lifecycle Pattern → Implementation Pattern When Implementation RAII Auto cleanup Drop trait Lazy init Deferred creation OnceLock , LazyLock Pool Reuse expensive resources r2d2 , deadpool Guard Scoped access MutexGuard pattern Scope Transaction boundary Custom struct + Drop Thinking Prompt Before designing lifecycle: 1. What's the resource cost? Cheap → create per use Expensive → pool or cache Global → lazy singleton 2. What's the scope? Function local → stack allocation Request scoped → passed or extracted Application wide → static or Arc 3. What about errors? Cleanup must happen → Drop Cleanup is optional → explicit close Cleanup can fail → Result from close Trace Up ↑ To domain constraints (Layer 3): Question Trace To Ask Connection pooling domain What's acceptable latency? Resource limits domain What are infra constraints? Transaction scope domain What must be atomic? Trace Down ↓ To implementation (Layer 1): Quick Reference Pattern Type Use Case RAII Drop trait Auto cleanup on scope exit Lazy Init OnceLock , LazyLock Deferred initialization Pool r2d2 , deadpool Connection reuse Guard MutexGuard Scoped lock release Scope Custom struct Transaction boundaries Lifecycle Events Event Rust Mechanism Creation new() , Default Lazy Init OnceLock::get or init Usage &self , &mut self Cleanup Drop::drop() Pattern Templates RAII Guard Lazy Singleton Common Errors Error Cause Fix Resource leak Forgot Drop Implement Drop or RAII wrapper Double free Manual memory Let Rust handle Use after drop Dangling reference Check lifetimes E0509 move out of Drop Moving owned field Option::take() Pool exhaustion Not returned Ensure Drop returns Anti Patterns Anti Pattern Why Bad Better Manual cleanup Easy to forget RAII/Drop lazy static! External dep std::sync::OnceLock Global mutable state Thread unsafety OnceLock or proper sync Forget to close Resource leak Drop impl Related Skills When See Smart pointers m02 resource Thread safe init m07 concurrency Domain scopes m09 domain Error in cleanup m06 error handling