summaryrefslogtreecommitdiff
path: root/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2024-05-27 15:46:15 +0000
committerLibravatar GitHub <noreply@github.com>2024-05-27 17:46:15 +0200
commit1e7b32490dfdccddd04f46d4b0416b48d749d51b (patch)
tree62a11365933a5a11e0800af64cbdf9172e5e6e7a /vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go
parent[chore] Small styling + link issues (#2933) (diff)
downloadgotosocial-1e7b32490dfdccddd04f46d4b0416b48d749d51b.tar.xz
[experiment] add alternative wasm sqlite3 implementation available via build-tag (#2863)
This allows for building GoToSocial with [SQLite transpiled to WASM](https://github.com/ncruces/go-sqlite3) and accessed through [Wazero](https://wazero.io/).
Diffstat (limited to 'vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go')
-rw-r--r--vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go76
1 files changed, 76 insertions, 0 deletions
diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go
new file mode 100644
index 000000000..55906e827
--- /dev/null
+++ b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go
@@ -0,0 +1,76 @@
+package platform
+
+import (
+ "math/bits"
+ "os"
+ "sort"
+ "strconv"
+ "strings"
+ "syscall"
+)
+
+const (
+ // https://man7.org/linux/man-pages/man2/mmap.2.html
+ __MAP_HUGE_SHIFT = 26
+ __MAP_HUGETLB = 0x40000
+)
+
+var hugePagesConfigs []hugePagesConfig
+
+type hugePagesConfig struct {
+ size int
+ flag int
+}
+
+func (hpc *hugePagesConfig) match(size int) bool {
+ return (size & (hpc.size - 1)) == 0
+}
+
+func init() {
+ dirents, err := os.ReadDir("/sys/kernel/mm/hugepages/")
+ if err != nil {
+ return
+ }
+
+ for _, dirent := range dirents {
+ name := dirent.Name()
+ if !strings.HasPrefix(name, "hugepages-") {
+ continue
+ }
+ if !strings.HasSuffix(name, "kB") {
+ continue
+ }
+ n, err := strconv.ParseUint(name[10:len(name)-2], 10, 64)
+ if err != nil {
+ continue
+ }
+ if bits.OnesCount64(n) != 1 {
+ continue
+ }
+ n *= 1024
+ hugePagesConfigs = append(hugePagesConfigs, hugePagesConfig{
+ size: int(n),
+ flag: int(bits.TrailingZeros64(n)<<__MAP_HUGE_SHIFT) | __MAP_HUGETLB,
+ })
+ }
+
+ sort.Slice(hugePagesConfigs, func(i, j int) bool {
+ return hugePagesConfigs[i].size > hugePagesConfigs[j].size
+ })
+}
+
+func mmapCodeSegment(size, prot int) ([]byte, error) {
+ flags := syscall.MAP_ANON | syscall.MAP_PRIVATE
+
+ for _, hugePagesConfig := range hugePagesConfigs {
+ if hugePagesConfig.match(size) {
+ b, err := syscall.Mmap(-1, 0, size, prot, flags|hugePagesConfig.flag)
+ if err != nil {
+ continue
+ }
+ return b, nil
+ }
+ }
+
+ return syscall.Mmap(-1, 0, size, prot, flags)
+}