Source File
cache.go
Belonging Package
github.com/tetratelabs/wazero
package wazeroimport (goruntime)// CompilationCache reduces time spent compiling (Runtime.CompileModule) the same wasm module.//// # Notes//// - This is an interface for decoupling, not third-party implementations.// All implementations are in wazero.// - Instances of this can be reused across multiple runtimes, if configured// via RuntimeConfig.// - The cache check happens before the compilation, so if multiple Goroutines are// trying to compile the same module simultaneously, it is possible that they// all compile the module. The design here is that the lock isn't held for the action "Compile"// but only for checking and saving the compiled result. Therefore, we strongly recommend that the embedder// does the centralized compilation in a single Goroutines (or multiple Goroutines per Wasm binary) to generate cache rather than// trying to Compile in parallel for a single module. In other words, we always recommend to produce CompiledModule// share it across multiple Goroutines to avoid trying to compile the same module simultaneously.type CompilationCache interface{ api.Closer }// NewCompilationCache returns a new CompilationCache to be passed to RuntimeConfig.// This configures only in-memory cache, and doesn't persist to the file system. See wazero.NewCompilationCacheWithDir for detail.//// The returned CompilationCache can be used to share the in-memory compilation results across multiple instances of wazero.Runtime.func () CompilationCache {return &cache{}}// NewCompilationCacheWithDir is like wazero.NewCompilationCache except the result also writes// state into the directory specified by `dirname` parameter.//// If the dirname doesn't exist, this creates it or returns an error.//// Those running wazero as a CLI or frequently restarting a process using the same wasm should// use this feature to reduce time waiting to compile the same module a second time.//// The contents written into dirname are wazero-version specific, meaning different versions of// wazero will duplicate entries for the same input wasm.//// Note: The embedder must safeguard this directory from external changes.func ( string) (CompilationCache, error) {:= &cache{}:= .ensuresFileCache(, version.GetWazeroVersion())return ,}// cache implements Cache interface.type cache struct {// eng is the engine for this cache. If the cache is configured, the engine is shared across multiple instances of// Runtime, and its lifetime is not bound to them. Instead, the engine is alive until Cache.Close is called.engs [engineKindCount]wasm.EnginefileCache filecache.CacheinitOnces [engineKindCount]sync.Once}func ( *cache) ( engineKind, newEngine, context.Context, api.CoreFeatures) wasm.Engine {.initOnces[].Do(func() { .engs[] = (, , .fileCache) })return .engs[]}// Close implements the same method on the Cache interface.func ( *cache) ( context.Context) ( error) {for , := range .engs {if != nil {if = .Close(); != nil {return}}}return}func ( *cache) ( string, string) error {// Resolve a potentially relative directory into an absolute one.var error, = filepath.Abs()if != nil {return}// Ensure the user-supplied directory.if = mkdir(); != nil {return}// Create a version-specific directory to avoid conflicts.:= path.Join(, "wazero-"++"-"+goruntime.GOARCH+"-"+goruntime.GOOS)if = mkdir(); != nil {return}.fileCache = filecache.New()return nil}func mkdir( string) error {if , := os.Stat(); errors.Is(, os.ErrNotExist) {// If the directory not found, create the cache dir.if = os.MkdirAll(, 0o700); != nil {return fmt.Errorf("create directory %s: %v", , )}} else if != nil {return} else if !.IsDir() {return fmt.Errorf("%s is not dir", )}return nil}
![]() |
The pages are generated with Golds v0.8.2. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds. |