Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DIExtension (arguments) unsupoort multithread #159

Closed
ivlevAstef opened this issue Mar 29, 2021 · 6 comments
Closed

DIExtension (arguments) unsupoort multithread #159

ivlevAstef opened this issue Mar 29, 2021 · 6 comments
Labels

Comments

@ivlevAstef
Copy link
Owner

Now if I resolve one object with arguments from more threads app can crash - because set arguments and resolve not atomic operation:

container.extensions(for: YourType.self)?.setArgs(arg1)
container.resolve() as YourType

This problems actual for Provide1, Provide2... and Lazy1, Lazy2 because he using argument.

setArgs - устанавливает аргументы к указанному типу, но если это сделать из многих потоков, то аргументы будут в итоге от последнего.

первый resolve() же получит объект с аргументами от последнего, а последующие упадут.

Как решать - видимо надо сделать resolve который принимает argument-ы всеже. Да аргументы по типу, но это не отдельным расширением. В общем DIExtension походу надо удалять.

@ivlevAstef ivlevAstef added the bug label Mar 29, 2021
@SergioPerm
Copy link

Привет @ivlevAstef ! Очень круто что постоянно поддерживаешь библиотеку! DITranquillity первый DI контейнтер который я попробовал, функционал очень удобный и простой) не стал создавать новый вопрос, опишу свою проблему тут, в общем при стандартном сценарии регистрации и получения сущностей в memory graph кажет утечки памяти на объектах типа ParsedType, я еще не настолько заимпрувил скилы по тому как устроена память, поэтому не понимаю, это плохо и я что то может быть не так делаю? или на такие вещи можно забить?

@ivlevAstef
Copy link
Owner Author

Привет @ivlevAstef ! Очень круто что постоянно поддерживаешь библиотеку! DITranquillity первый DI контейнтер который я попробовал, функционал очень удобный и простой) не стал создавать новый вопрос, опишу свою проблему тут, в общем при стандартном сценарии регистрации и получения сущностей в memory graph кажет утечки памяти на объектах типа ParsedType, я еще не настолько заимпрувил скилы по тому как устроена память, поэтому не понимаю, это плохо и я что то может быть не так делаю? или на такие вещи можно забить?

Надо проверить. Но вообще формально скорей всего он просто видит, что объект никогда не удалиться и так пишет. Эти типы создаются в момент регистрации, и пока существует контейнер, никуда не денутся. А контейнер обычно существует всё время исполнения программы.

Конечно это не исключает ситуации, что там может быть реальный retain цикл, но я у себя не замечал (может просто не обращал внимание).
или возможно, что сама регистрация делается не по рекомендациям и в closure есть например ссылка на container.

@SergioPerm
Copy link

Привет @ivlevAstef ! Очень круто что постоянно поддерживаешь библиотеку! DITranquillity первый DI контейнтер который я попробовал, функционал очень удобный и простой) не стал создавать новый вопрос, опишу свою проблему тут, в общем при стандартном сценарии регистрации и получения сущностей в memory graph кажет утечки памяти на объектах типа ParsedType, я еще не настолько заимпрувил скилы по тому как устроена память, поэтому не понимаю, это плохо и я что то может быть не так делаю? или на такие вещи можно забить?

Надо проверить. Но вообще формально скорей всего он просто видит, что объект никогда не удалиться и так пишет. Эти типы создаются в момент регистрации, и пока существует контейнер, никуда не денутся. А контейнер обычно существует всё время исполнения программы.

Конечно это не исключает ситуации, что там может быть реальный retain цикл, но я у себя не замечал (может просто не обращал внимание).
или возможно, что сама регистрация делается не по рекомендациям и в closure есть например ссылка на container.

я запустил твой проект для steam, там наблюдается такая же картина

@alobanov11
Copy link

alobanov11 commented Apr 5, 2021

Привет @ivlevAstef, @SergioPerm, похожая проблема с утечкой ParsedType. Инициализируется base и firstNotSwiftType, выставляется self и он не может зарелизится.

Как вариант, проблему решает - просто возвращать другой объект:

private(set) lazy var base: ParsedType = {
    ...
    return iter === self ? ParsedType(type: type) : iter
}

private(set) lazy var firstNotSwiftType: ParsedType = {
    ...
    return iter === self ? ParsedType(type: type) : iter
}

@ivlevAstef
Copy link
Owner Author

@alobanov11 @SergioPerm
Посмотрел. Да на самом деле была ссылка на самого себя. Поправил в 4.2.1 версии.

@ivlevAstef
Copy link
Owner Author

update arguments API into 4.3.0 version

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants