Size: a a a

2020 May 24

AV

Alexander Vershilov in Haskell
Вообще unsafe FFI на указателях безопасен только если ты используешь #
источник

IR

IC Rainbow in Haskell
Alexander Vershilov
Вообще unsafe FFI на указателях безопасен только если ты используешь #
м?
источник

AV

Alexander Vershilov in Haskell
Т.е. если передаёшь в unsafe функцию Ptr# и у тебя между вызовами нет никаких boxed объектов
источник

AV

Alexander Vershilov in Haskell
Иначе есть шанс, что указатель уедет
источник

IR

IC Rainbow in Haskell
Передаю несколько Addr#, да.
источник

AV

Alexander Vershilov in Haskell
т.е.
let addr = byteArrayContents# x
ffi 1 addr
источник

AV

Alexander Vershilov in Haskell
Между вызовом в си и получением адреса он может уехать, т.к. там забокшенная однёрка
источник

IR

IC Rainbow in Haskell
Alexander Vershilov
т.е.
let addr = byteArrayContents# x
ffi 1 addr
в смысле, что все аргументы должны быть анбокснуты?
источник

AV

Alexander Vershilov in Haskell
Ага
источник

IR

IC Rainbow in Haskell
иначе оно полезет их доставать и адрес уедет
источник

AV

Alexander Vershilov in Haskell
ну и не let addr а case ... of addr ->
источник

AV

Alexander Vershilov in Haskell
Иначе создание забокшенного объекта может вызвать GC
источник

AV

Alexander Vershilov in Haskell
Причем например из-за другого треда
источник

AV

Alexander Vershilov in Haskell
В общем safe-points между вызовом byteArrayContents и ffi быть не должно
источник

AV

Alexander Vershilov in Haskell
Я бы не делал такого до тех пор, пока не доказана необходимость, баги если что-то сделать не так вообще будет не отловить, даже с memgrind-ом каким
источник

IR

IC Rainbow in Haskell
и тогда можно даже не пинить? (кроме как для выравнивания)
источник

AV

Alexander Vershilov in Haskell
Формально - можно
источник

AV

Alexander Vershilov in Haskell
Так запилил ретраи и tcp timeout про который вчера писал
источник

MK

Maxim Koltsov in Haskell
в опенсорс выложишь?
источник

AV

Alexander Vershilov in Haskell
acquire' = loop (fromMaybe 1 configConnectRetries) where
 loop n = HC.acquire cfg >>= \case
   Left e ->
     if n <= 0
     then error (show e)
     else loop (n-1)
   Right x -> pure x
источник