Skip to content

Instantly share code, notes, and snippets.

@cyrillos
Last active November 17, 2020 11:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cyrillos/a0eaa178bfc0d22c1810c59a951421c8 to your computer and use it in GitHub Desktop.
Save cyrillos/a0eaa178bfc0d22c1810c59a951421c8 to your computer and use it in GitHub Desktop.
cbox -- создание С функций, аналог box.schema.func(), содержится только в памяти,
и можно использовать на нодах в RO режиме. Не сохраняются при остановке инстанса.
Интерфейс модулей
=================
cbox.module.load(path)
- загружает новый модуль в кэш тарантула
cbox.module.unload(path)
- выгружает модуль из кэша. если модуль используется функциями,
то у него просто уменьшается referece counter, пока все функции
не будут удалены его нельзя выгружить, он -EBUSY
cbox.module.reload(path)
- перегрузка моуля
Интерфейс функций
=================
f = cbox.func.create(path.name)
- создает новую функцию для модуля path. если модуль еще не загружен, то ошибка
- увеличивает каунтер модуля
- возвращает callable объект
- удаление функции происходит через __gc
- метод __gc декрементит каунтер модуля
f:destroy()
- явное удаление функции
f(...)
- вызов функции с аргументами
@Mons
Copy link

Mons commented Nov 17, 2020

TODO:

  • Choose name

Draft:

  • module.load(path)
    • respects dev/ino, ctime, mtime, size + follow symlink
      1. loads module, cache it by path + dev/ino, ctime, mtime, size
    • 2..n load: check cache key and load again if changed. on unchange increase ref.
    • loads .so with dlopen (using /tmp technique)
    • returns module handle
  • module:unload()
    • decrease ref
    • on zero ref do dlclose()
  • func = module:load('function_name') -- dlsym()
  • func:unload()
  • func = nil -- __gc -> func:unload()

Common case:

  • local mod = module.load('path.so')
  • local func = mod:load('func')
  • collect by __gc

Explicit case:

  • local mod = module.load('path.so')
  • local func = mod:load('func')
  • func:unload()
  • mod:unload()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment