делать readData/readMetadata - мне кажется слегка странным, тогда получается, что уносить в скоуп будет вообще нельзя, так?
Можно уносить копию
Ну нет, что буффер, что ByteArray можно таскать куда угодно. Проблема в том, что ByteReadPacket пулится и при попытке прочитать его за скоупом он может содержать любой мусор
а можно пример проблемы, а то не совсем понимаю, что там может быть за мусор? что пулиться я знаю, но он не переиспользует память, что используется в данном BRP только если из него уже что-то вычитано, то тот ChunkBuffer релизиться и отдаётся в пул
Как только закрывается скоуп, где используется ByteReadPacket, он отдается обратно в пул. После этого его может кто-то оттуда взять и записать что-то новое, не зная о том, что кто-то держит ссылку на него. В результате в том месте, где вы его читаете вы можете вычитать совсем не то, что положили. Ошибку очень сложно отловить, практически невозможно. Я с этим несколько недель бился. Именно по этой причине kotlinx-io вообще не экспозит то, что пулится в наружу
Кстати, copy там по-моему ни разу не zero
там ref-count просто
а Вы дальше лезли?)
duplicate - это ref-count logic
максимум, что там создаётся, это пару классов ChunkBuffer но память шариться
и я до сих пор не убеждён в этом в пул оно отдаётся, только после release/вычитывания а следовательно, такого не может быть, что в него запишут что-то ещё
Хорошо. Там переиспользуется блок памяти. Но тогда тем хуже. Она не спасает от пулинга
Так релиз происходит в момент, когда завершается метод, в котором вы его получаете
откуда Вы знаете?)
Я этот кусок в io несколько раз переписывал, чтобы спастись от этой проблемы. Дело в том, что вы внутри программы никак не можете знать, владеет ли кто-то в данный момент ссылкой на буффер. Поэтому буфер возвращается в пул как только закрывается скоуп, который его использует. Может быть конечно, в кторе что-то фундаментально поменяли, но вряд ли.
Обсуждают сегодня