Предупреждение: 'matchIter' не является безопасным для GC, так как он обращается к 'x', который является глобальным с использованием памяти, собранной GC [GcUnsafe2]

При создании этого кода в NIM:

import jester, asyncdispatch    
let stuff = "thing"    
routes:
  get "/":
    resp stuff
runForever()

это приводит к:

mytest.nim (3, 1) отсюда шаблон / универсальный экземпляр lib/core/macros.nim(369, 70) отсюда шаблон / универсальный экземпляр lib/pure/asyncmacro.nim(355, 31) Предупреждение: "matchIter" - это не GC-безопасный, поскольку он обращается к "вещам", которые являются глобальными, используя память GC [GcUnsafe2]

Я полагаю, это относится к переменной stuff и я предполагаю, что это трудно диагностировать, потому что маршруты шута являются чем-то вроде DSL.

Если сообщение означает, что значит, то почему это только предупреждение? Или это ложный позитив? Или даже больше, эта концепция использования переменных в маршрутах просто невозможна?

1 ответ

Решение

Процедуры, которые генерирует Jester, были помечены {.gcsafe.}, это заставляет компилятор проверять, обращается ли процедура к каким-либо глобальным переменным.

Доступ к глобальным переменным не должен быть проблемой для вашего приложения, поскольку Jester (и ваше приложение) является однопоточным, но как только ваша программа использует несколько потоков (например, для параллельного обслуживания запросов), вам нужно будет решить эту проблему,

Один из способов исправить это использовать {.threadvar.}: https://nim-lang.org/docs/manual.html

Надеюсь это поможет!

Другие вопросы по тегам