Size: a a a

Kotlin Community

2020 November 02

OY

Oleg Yukhnevich in Kotlin Community
Alexander Nozik
Что-то в этом роде. Смысл в том, что ваш Payload категорически нельзя выносить за знак большой печати скоуп. Иначе будет беда.
и скоуп это в Вашем понимании что?
laynch {} какой или просто другая ф-ия?
источник

AN

Alexander Nozik in Kotlin Community
Oleg Yukhnevich
как и любой буфер везде :)
даже тогда и ByteArray нельзя
но делать readData/readMetadata - мне кажется слегка странным, тогда получается, что уносить в скоуп будет вообще нельзя, так?
Можно уносить копию
источник

AN

Alexander Nozik in Kotlin Community
Oleg Yukhnevich
и скоуп это в Вашем понимании что?
laynch {} какой или просто другая ф-ия?
то место, где аргумент Payload
источник

AN

Alexander Nozik in Kotlin Community
Oleg Yukhnevich
как и любой буфер везде :)
даже тогда и ByteArray нельзя
но делать readData/readMetadata - мне кажется слегка странным, тогда получается, что уносить в скоуп будет вообще нельзя, так?
Ну нет, что буффер, что ByteArray можно таскать куда угодно. Проблема в том, что ByteReadPacket пулится и при попытке прочитать его за скоупом он может содержать любой мусор
источник

OY

Oleg Yukhnevich in Kotlin Community
Alexander Nozik
Ну нет, что буффер, что ByteArray можно таскать куда угодно. Проблема в том, что ByteReadPacket пулится и при попытке прочитать его за скоупом он может содержать любой мусор
а можно пример проблемы, а то не совсем понимаю, что там может быть за мусор?
что пулиться я знаю, но он не переиспользует память, что используется в данном BRP
только если из него уже что-то вычитано, то тот ChunkBuffer релизиться и отдаётся в пул
источник

AN

Alexander Nozik in Kotlin Community
Oleg Yukhnevich
а можно пример проблемы, а то не совсем понимаю, что там может быть за мусор?
что пулиться я знаю, но он не переиспользует память, что используется в данном BRP
только если из него уже что-то вычитано, то тот ChunkBuffer релизиться и отдаётся в пул
Как только закрывается скоуп, где используется ByteReadPacket, он отдается обратно в пул. После этого его может кто-то оттуда взять и записать что-то новое, не зная о том, что кто-то держит ссылку на него. В результате в том месте, где вы его читаете вы можете вычитать совсем не то, что положили. Ошибку очень сложно отловить, практически невозможно. Я с этим несколько недель бился. Именно по этой причине kotlinx-io вообще не экспозит то, что пулится в наружу
источник

AN

Alexander Nozik in Kotlin Community
Oleg Yukhnevich
а можно пример проблемы, а то не совсем понимаю, что там может быть за мусор?
что пулиться я знаю, но он не переиспользует память, что используется в данном BRP
только если из него уже что-то вычитано, то тот ChunkBuffer релизиться и отдаётся в пул
Кстати, copy там по-моему ни разу не zero
источник

OY

Oleg Yukhnevich in Kotlin Community
Alexander Nozik
Кстати, copy там по-моему ни разу не zero
там ref-count просто
источник

AN

Alexander Nozik in Kotlin Community
Oleg Yukhnevich
там ref-count просто
источник

AN

Alexander Nozik in Kotlin Community
Там полное копирование
источник

OY

Oleg Yukhnevich in Kotlin Community
а Вы дальше лезли?)
источник

OY

Oleg Yukhnevich in Kotlin Community
Oleg Yukhnevich
а Вы дальше лезли?)
duplicate - это ref-count logic
источник

OY

Oleg Yukhnevich in Kotlin Community
Oleg Yukhnevich
duplicate - это ref-count logic
максимум, что там создаётся, это пару классов ChunkBuffer
но память шариться
источник

OY

Oleg Yukhnevich in Kotlin Community
Alexander Nozik
Как только закрывается скоуп, где используется ByteReadPacket, он отдается обратно в пул. После этого его может кто-то оттуда взять и записать что-то новое, не зная о том, что кто-то держит ссылку на него. В результате в том месте, где вы его читаете вы можете вычитать совсем не то, что положили. Ошибку очень сложно отловить, практически невозможно. Я с этим несколько недель бился. Именно по этой причине kotlinx-io вообще не экспозит то, что пулится в наружу
и я до сих пор не убеждён в этом
в пул оно отдаётся, только после release/вычитывания
а следовательно, такого не может быть, что в него запишут что-то ещё
источник

AN

Alexander Nozik in Kotlin Community
Oleg Yukhnevich
duplicate - это ref-count logic
Хорошо. Там переиспользуется блок памяти. Но тогда тем хуже. Она не спасает от пулинга
источник

AN

Alexander Nozik in Kotlin Community
Oleg Yukhnevich
и я до сих пор не убеждён в этом
в пул оно отдаётся, только после release/вычитывания
а следовательно, такого не может быть, что в него запишут что-то ещё
Так релиз происходит в момент, когда завершается метод, в котором вы его получаете
источник

OY

Oleg Yukhnevich in Kotlin Community
Alexander Nozik
Так релиз происходит в момент, когда завершается метод, в котором вы его получаете
откуда Вы знаете?)
источник

OY

Oleg Yukhnevich in Kotlin Community
Вы кстати какую сторону смотрите - клиент или сервер?
источник

AN

Alexander Nozik in Kotlin Community
Oleg Yukhnevich
откуда Вы знаете?)
Я этот кусок в io несколько раз переписывал, чтобы спастись от этой проблемы. Дело в том, что вы внутри программы никак не можете знать, владеет ли кто-то в данный момент ссылкой на буффер. Поэтому  буфер возвращается в пул как только закрывается скоуп, который его использует. Может быть конечно, в кторе что-то фундаментально поменяли, но вряд ли.
источник

AN

Alexander Nozik in Kotlin Community
Oleg Yukhnevich
Вы кстати какую сторону смотрите - клиент или сервер?
сервер
источник