Устранение утечек памяти при закрытии сокета#3
Устранение утечек памяти при закрытии сокета#3simbaaz wants to merge 1 commit intobeken_sdk_linuxfrom
Conversation
|
Что-то здесь не все так просто. Каков механизм утечки памяти, почему она происходила? Насколько я понял, макрос SOCK_DEINIT_SYNC проверяет, есть ли прием или передача по сокету (она может идти в другом потоке) и десять раз пытается захватить мьютексы на прием и пеедачу, чтобы потом их освободить. |
|
Причина в том, что если для сокета даже в одном потоке последовательно вызвать shutdown() и close(), то из-за того, что в обоих функциях размещен макрос SOCK_DEINIT_SYNC, вызов close() после shutdown() всегда будет завершаться с ошибкой, и не освобождать память, выделенную под socket. В комментарии к "SOCK_DEINIT_SYNC" разработчики из Beken указали: /* place in lwip_close */ Если мы не хотим терять возможность вызова shutdown для одного и того же сокета из нескольких потоков, то надо исследовать проблему более глубоко. Пока что у меня понимание, что для shutdown нужен отдельный механизм блокировки. |
|
LwIp сам разруливает многопоточный доступ. Один и тот же сокет можно использовать из разных потоков. Либо вообще все эти макросы выкорчевать. |
|
Хорошо. Я сделаю техническое описание проблемы, которое перешлём письмом в Beken |
Из функции lwip_shutdown() убран макрос SOCK_DEINIT_SYNC, наличие которого приводило к утечкам памяти в ситуации, когда для сокета последовательно вызываются функции shutdown() и close()