Project Structure and Dependencies
Relevant source files
This document describes the organizational structure of the kspin crate, including its file layout, external dependencies, and build configuration. It covers the project's dependency management, feature flag system, and how the crate is organized to support different compilation targets.
For detailed information about the specific spinlock types and their usage, see Spinlock Types and Public API. For implementation details of the core architecture, see Core Implementation Architecture.
File Structure Overview
The kspin crate follows a minimal but well-organized structure typical of focused Rust libraries. The project consists of core source files, build configuration, and development tooling.
Project File Organization
flowchart TD subgraph subGraph2["Development Tools"] VSCodeDir[".vscode/IDE configuration"] TargetDir["target/Build artifacts (ignored)"] end subgraph subGraph1["Source Code (src/)"] LibRs["lib.rsPublic API & type aliases"] BaseRs["base.rsCore BaseSpinLock implementation"] end subgraph subGraph0["Root Directory"] CargoToml["Cargo.tomlProject metadata & dependencies"] CargoLock["Cargo.lockDependency lock file"] GitIgnore[".gitignoreVersion control exclusions"] end subgraph CI/CD["CI/CD"] GithubActions[".github/workflows/Automated testing & docs"] end CargoLock --> CargoToml CargoToml --> BaseRs CargoToml --> LibRs GitIgnore --> TargetDir GitIgnore --> VSCodeDir LibRs --> BaseRs
Sources: Cargo.toml(L1 - L22) .gitignore(L1 - L4) Cargo.lock(L1 - L74)
Source File Responsibilities
File | Purpose | Key Components |
---|---|---|
src/lib.rs | Public API surface | SpinRaw,SpinNoPreempt,SpinNoIrqtype aliases |
src/base.rs | Core implementation | BaseSpinLock,BaseSpinLockGuard,BaseGuardtrait |
The crate deliberately maintains a minimal file structure with only two source files, emphasizing simplicity and focused functionality.
Sources: Cargo.toml(L1 - L22)
External Dependencies
The kspin crate has a carefully curated set of external dependencies that provide essential functionality for kernel-space synchronization and conditional compilation.
Direct Dependencies
flowchart TD subgraph subGraph2["Transitive Dependencies"] CrateInterface["crate_interfacev0.1.4Interface definitions"] ProcMacro2["proc-macro2v1.0.93Procedural macros"] Quote["quotev1.0.38Code generation"] Syn["synv2.0.96Syntax parsing"] UnicodeIdent["unicode-identv1.0.14Unicode support"] end subgraph subGraph1["Direct Dependencies"] CfgIf["cfg-ifv1.0.0Conditional compilation"] KernelGuard["kernel_guardv0.1.2Protection mechanisms"] end subgraph subGraph0["kspin Crate"] KSpin["kspinv0.1.0"] end CrateInterface --> ProcMacro2 CrateInterface --> Quote CrateInterface --> Syn KSpin --> CfgIf KSpin --> KernelGuard KernelGuard --> CfgIf KernelGuard --> CrateInterface ProcMacro2 --> UnicodeIdent Quote --> ProcMacro2 Syn --> ProcMacro2 Syn --> Quote Syn --> UnicodeIdent
Sources: Cargo.toml(L19 - L21) Cargo.lock(L5 - L74)
Dependency Roles
Crate | Version | Purpose | Usage in kspin |
---|---|---|---|
cfg-if | 1.0.0 | Conditional compilation utilities | Enables SMP vs single-core optimizations |
kernel_guard | 0.1.2 | Kernel protection mechanisms | ProvidesNoOp,NoPreempt,NoPreemptIrqSaveguards |
The kernel_guard
crate is the primary external dependency, providing the guard types that implement different protection levels. The cfg-if
crate enables clean conditional compilation based on feature flags.
Sources: Cargo.toml(L20 - L21) Cargo.lock(L23 - L30)
Feature Configuration
The kspin crate uses Cargo feature flags to enable compile-time optimization for different target environments, particularly distinguishing between single-core and multi-core systems.
Feature Flag System
flowchart TD subgraph subGraph2["Generated Code Characteristics"] SMPCode["SMP Implementation• AtomicBool for lock state• compare_exchange operations• Actual spinning behavior"] SingleCoreCode["Single-core Implementation• No lock state field• Lock always succeeds• No atomic operations"] end subgraph subGraph1["Compilation Modes"] SMPMode["SMP ModeMulti-core systems"] SingleCoreMode["Single-core ModeEmbedded/simple systems"] end subgraph subGraph0["Feature Flags"] SMPFeature["smpMulti-core support"] DefaultFeature["defaultEmpty set"] end DefaultFeature --> SingleCoreMode SMPFeature --> SMPMode SMPMode --> SMPCode SingleCoreMode --> SingleCoreCode
Sources: Cargo.toml(L14 - L17)
Feature Flag Details
Feature | Default | Description | Impact |
---|---|---|---|
smp | No | Enable multi-core support | Adds atomic operations and actual lock state |
default | Yes | Default feature set (empty) | Optimized for single-core environments |
The feature system allows the same codebase to generate dramatically different implementations:
- Without
smp
: Lock operations are compile-time no-ops, eliminating all atomic overhead - With
smp
: Full atomic spinlock implementation with proper memory ordering
Sources: Cargo.toml(L14 - L17)
Build System Organization
The project follows standard Rust crate conventions with specific configurations for kernel-space development and multi-platform support.
Package Metadata Configuration
flowchart TD subgraph Licensing["Licensing"] License["licenseGPL-3.0-or-later OR Apache-2.0 OR MulanPSL-2.0"] end subgraph subGraph2["Repository Links"] Homepage["homepageArceOS GitHub"] Repository["repositorykspin GitHub"] Documentation["documentationdocs.rs"] end subgraph subGraph1["Package Classification"] Keywords["keywords['arceos', 'synchronization', 'spinlock', 'no-irq']"] Categories["categories['os', 'no-std']"] Description["description'Spinlocks for kernel space...'"] end subgraph subGraph0["Package Identity"] Name["name = 'kspin'"] Version["version = '0.1.0'"] Edition["edition = '2021'"] Authors["authors = ['Yuekai Jia']"] end Description --> Repository Homepage --> License Name --> Keywords Repository --> Documentation Version --> Categories
Sources: Cargo.toml(L1 - L12)
Development Environment Setup
The project includes configuration for common development tools:
Tool | Configuration | Purpose |
---|---|---|
Git | .gitignoreexcludes/target,/.vscode,.DS_Store | Clean repository state |
VS Code | .vscode/directory (ignored) | IDE-specific settings |
Cargo | Cargo.lockcommitted | Reproducible builds |
The .gitignore
configuration ensures that build artifacts and IDE-specific files don't pollute the repository, while the committed Cargo.lock
file ensures reproducible builds across different environments.
Sources: .gitignore(L1 - L4) Cargo.lock(L1 - L4)