generate creates the actual cache. it can be called from multiple goroutines. the first call will generate the cache, subsequent calls wait until it is generated.
()
| 87 | // goroutines. the first call will generate the cache, subsequent |
| 88 | // calls wait until it is generated. |
| 89 | func (cache *cache) generate() { |
| 90 | cache.gen.Do(func() { |
| 91 | started := time.Now() |
| 92 | seedHash := makeSeedHash(cache.epoch) |
| 93 | log.Debug(fmt.Sprintf("Generating cache for epoch %d (%x)", cache.epoch, seedHash)) |
| 94 | size := C.ethash_get_cachesize(C.uint64_t(cache.epoch * epochLength)) |
| 95 | if cache.test { |
| 96 | size = cacheSizeForTesting |
| 97 | } |
| 98 | cache.ptr = C.ethash_light_new_internal(size, (*C.ethash_h256_t)(unsafe.Pointer(&seedHash[0]))) |
| 99 | runtime.SetFinalizer(cache, freeCache) |
| 100 | log.Debug(fmt.Sprintf("Done generating cache for epoch %d, it took %v", cache.epoch, time.Since(started))) |
| 101 | }) |
| 102 | } |
| 103 | |
| 104 | func freeCache(cache *cache) { |
| 105 | C.ethash_light_delete(cache.ptr) |
no test coverage detected