Skip to content

Устранение утечек памяти при закрытии сокета#3

Open
simbaaz wants to merge 1 commit intobeken_sdk_linuxfrom
fix/socket_shutdown_leak
Open

Устранение утечек памяти при закрытии сокета#3
simbaaz wants to merge 1 commit intobeken_sdk_linuxfrom
fix/socket_shutdown_leak

Conversation

@simbaaz
Copy link

@simbaaz simbaaz commented Jan 12, 2022

Из функции lwip_shutdown() убран макрос SOCK_DEINIT_SYNC, наличие которого приводило к утечкам памяти в ситуации, когда для сокета последовательно вызываются функции shutdown() и close()

@simbaaz simbaaz requested review from Xeenych and dmpolukhin January 12, 2022 08:50
@Xeenych
Copy link
Contributor

Xeenych commented Jan 12, 2022

Что-то здесь не все так просто.
Макросы SOCK_DEINIT_SYNC и т.д. были добавлены бекеном. В оригинальном LwIP их нет.

Каков механизм утечки памяти, почему она происходила?

Насколько я понял, макрос SOCK_DEINIT_SYNC проверяет, есть ли прием или передача по сокету (она может идти в другом потоке) и десять раз пытается захватить мьютексы на прием и пеедачу, чтобы потом их освободить.

@simbaaz
Copy link
Author

simbaaz commented Jan 12, 2022

Причина в том, что если для сокета даже в одном потоке последовательно вызвать shutdown() и close(), то из-за того, что в обоих функциях размещен макрос SOCK_DEINIT_SYNC, вызов close() после shutdown() всегда будет завершаться с ошибкой, и не освобождать память, выделенную под socket.

В комментарии к "SOCK_DEINIT_SYNC" разработчики из Beken указали: /* place in lwip_close */

Если мы не хотим терять возможность вызова shutdown для одного и того же сокета из нескольких потоков, то надо исследовать проблему более глубоко. Пока что у меня понимание, что для shutdown нужен отдельный механизм блокировки.

@Xeenych
Copy link
Contributor

Xeenych commented Jan 12, 2022

LwIp сам разруливает многопоточный доступ. Один и тот же сокет можно использовать из разных потоков.
Я не понимаю для чего тут все эти макросы.
Поэтому, либо вызов SOCK_DEINIT_SYNC можно просто убрать из shutdown
либо заменить на свой аналог, который бы не устанавливал флаг closing

Либо вообще все эти макросы выкорчевать.
Можно еще попробовать разработчиков спросить зачем это все

@simbaaz
Copy link
Author

simbaaz commented Jan 12, 2022

Хорошо. Я сделаю техническое описание проблемы, которое перешлём письмом в Beken

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

Comments