cubefs
41 строка · 885.0 Байт
1//go:build !noasm && !nounsafe && !gccgo && !appengine
2
3/**
4* Reed-Solomon Coding over 8-bit values.
5*
6* Copyright 2023, Klaus Post
7*/
8
9package reedsolomon
10
11import (
12"unsafe"
13)
14
15// AllocAligned allocates 'shards' slices, with 'each' bytes.
16// Each slice will start on a 64 byte aligned boundary.
17func AllocAligned(shards, each int) [][]byte {
18if false {
19res := make([][]byte, shards)
20for i := range res {
21res[i] = make([]byte, each)
22}
23return res
24}
25const (
26alignEach = 64
27alignStart = 64
28)
29eachAligned := ((each + alignEach - 1) / alignEach) * alignEach
30total := make([]byte, eachAligned*shards+63)
31align := uint(uintptr(unsafe.Pointer(&total[0]))) & (alignStart - 1)
32if align > 0 {
33total = total[alignStart-align:]
34}
35res := make([][]byte, shards)
36for i := range res {
37res[i] = total[:each:eachAligned]
38total = total[eachAligned:]
39}
40return res
41}
42