encode_race.go raw

   1  //go:build race
   2  // +build race
   3  
   4  /*
   5   * Copyright 2021 ByteDance Inc.
   6   *
   7   * Licensed under the Apache License, Version 2.0 (the "License");
   8   * you may not use this file except in compliance with the License.
   9   * You may obtain a copy of the License at
  10   *
  11   *     http://www.apache.org/licenses/LICENSE-2.0
  12   *
  13   * Unless required by applicable law or agreed to in writing, software
  14   * distributed under the License is distributed on an "AS IS" BASIS,
  15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16   * See the License for the specific language governing permissions and
  17   * limitations under the License.
  18   */
  19  
  20  package encoder
  21  
  22  import (
  23      `encoding/json`
  24  
  25      `github.com/bytedance/sonic/internal/rt`
  26  )
  27  
  28  
  29  func helpDetectDataRace(val interface{}) {
  30      var out []byte
  31      defer func() {
  32          if v := recover(); v != nil {
  33              // NOTICE: help user to locate where panic occurs
  34              println("panic when encoding on: ", truncate(out))
  35              panic(v)
  36          }
  37      }()
  38      out, _ = json.Marshal(val)
  39  }
  40  
  41  func encodeIntoCheckRace(buf *[]byte, val interface{}, opts Options) error {
  42  	err := encodeInto(buf, val, opts)
  43      /* put last to make the panic from sonic will always be caught at first */
  44      helpDetectDataRace(val)
  45      return err
  46  }
  47  
  48  func truncate(json []byte) string {
  49      if len(json) <= 256 {
  50          return rt.Mem2Str(json)
  51      } else {
  52          return rt.Mem2Str(json[len(json)-256:])
  53      }
  54  }
  55