From 78b996033a4b7cf62b41250b6a402c1b15668a3f Mon Sep 17 00:00:00 2001 From: kichik Date: Sun, 30 Jul 2006 14:26:47 +0000 Subject: [PATCH] fixed random dns errors caused by synchronization issues with m_thread_kill for more details: http://forums.winamp.com/showthread.php?s=&threadid=247723 git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4716 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/NSISdl/asyncdns.cpp | 32 +++++++++++++++++++------------- Contrib/NSISdl/asyncdns.h | 3 ++- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Contrib/NSISdl/asyncdns.cpp b/Contrib/NSISdl/asyncdns.cpp index d7516f22..dd4c2373 100644 --- a/Contrib/NSISdl/asyncdns.cpp +++ b/Contrib/NSISdl/asyncdns.cpp @@ -13,7 +13,6 @@ JNL_AsyncDNS::JNL_AsyncDNS(int max_cache_entries) { - m_thread_kill=1; m_thread=0; m_addr=0; m_hostname[0]=0; @@ -21,13 +20,7 @@ JNL_AsyncDNS::JNL_AsyncDNS(int max_cache_entries) JNL_AsyncDNS::~JNL_AsyncDNS() { - m_thread_kill=1; - - if (m_thread) - { - WaitForSingleObject(m_thread,INFINITE); - CloseHandle(m_thread); - } + wait_for_thread_death(); } unsigned long WINAPI JNL_AsyncDNS::_threadfunc(LPVOID _d) @@ -41,7 +34,6 @@ unsigned long WINAPI JNL_AsyncDNS::_threadfunc(LPVOID _d) } else _this->m_addr=INADDR_NONE; - _this->m_thread_kill=1; return 0; } @@ -56,21 +48,35 @@ int JNL_AsyncDNS::resolve(char *hostname, unsigned long *addr) } if (lstrcmpi(m_hostname,hostname)) m_addr=0; - else if (m_addr == INADDR_NONE) return -1; + else if (m_addr == INADDR_NONE) + { + wait_for_thread_death(); + return -1; + } else if (m_addr) { *addr=m_addr; + wait_for_thread_death(); return 0; } lstrcpy(m_hostname,hostname); - if (m_thread_kill) + if (!m_thread) { DWORD id; - if (m_thread) return -1; - m_thread_kill=0; m_thread=CreateThread(NULL,0,_threadfunc,(LPVOID)this,0,&id); if (!m_thread) return -1; } return 1; } + +void JNL_AsyncDNS::wait_for_thread_death() +{ + if (m_thread) + { + WaitForSingleObject(m_thread,INFINITE); + CloseHandle(m_thread); + } + + m_thread=0; +} diff --git a/Contrib/NSISdl/asyncdns.h b/Contrib/NSISdl/asyncdns.h index 5aa16271..9ce4f862 100644 --- a/Contrib/NSISdl/asyncdns.h +++ b/Contrib/NSISdl/asyncdns.h @@ -26,10 +26,11 @@ public: int resolve(char *hostname, unsigned long *addr); // return 0 on success, 1 on wait, -1 on unresolvable private: + void wait_for_thread_death(); + char m_hostname[256]; unsigned long m_addr; - volatile int m_thread_kill; HANDLE m_thread; static unsigned long WINAPI _threadfunc(LPVOID _d);