mirror of
https://github.com/open-policy-agent/opa.git
synced 2026-08-12 19:32:48 -06:00
4ab2ac0c61
* server: port compile API Also adds e2e tests: These include coverage for ucast in the prisma setting, and thus require some JS runtime. * e2e: selectively skip e2e Compile API tests ...for macos runs, and for the go-compat suites. * server: accept timer_rego_external_resolve_ns metrics with value 0 When running the tests in a loop for a while, I would see values of 0ns for this metric. However, comparing with its non-zero values, which are often 41 or 42ns, it seems like this is just not happening in this code path. So if "almost nothing" actually goes below 1ns, it's OK. * e2e: split dep-heavy e2e tests into their own go module * Makefile: export DOCKER_RUNNING (make e2e read it) --------- Co-authored-by: Philip Conrad <philip@chariot-chaser.net> Signed-off-by: Stephan Renatus <stephan.renatus@gmail.com>
39 lines
712 B
Go
39 lines
712 B
Go
//go:build race
|
|
// +build race
|
|
|
|
package decoder
|
|
|
|
import (
|
|
"sync"
|
|
"unsafe"
|
|
|
|
"github.com/goccy/go-json/internal/runtime"
|
|
)
|
|
|
|
var decMu sync.RWMutex
|
|
|
|
func CompileToGetDecoder(typ *runtime.Type) (Decoder, error) {
|
|
initDecoder()
|
|
typeptr := uintptr(unsafe.Pointer(typ))
|
|
if typeptr > typeAddr.MaxTypeAddr {
|
|
return compileToGetDecoderSlowPath(typeptr, typ)
|
|
}
|
|
|
|
index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift
|
|
decMu.RLock()
|
|
if dec := cachedDecoder[index]; dec != nil {
|
|
decMu.RUnlock()
|
|
return dec, nil
|
|
}
|
|
decMu.RUnlock()
|
|
|
|
dec, err := compileHead(typ, map[uintptr]Decoder{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
decMu.Lock()
|
|
cachedDecoder[index] = dec
|
|
decMu.Unlock()
|
|
return dec, nil
|
|
}
|