diff options
author | Gluzskiy Alexandr <sss123next@list.ru> | 2010-10-08 07:01:44 +0300 |
---|---|---|
committer | Gluzskiy Alexandr <sss123next@list.ru> | 2010-10-08 07:01:44 +0300 |
commit | d5721b974a58ed5a26f33346dae728d93a7c1803 (patch) | |
tree | 2679ec39d8a44b5c3bdaf947d21881135460e7b7 | |
parent | 7df7cc0f3a8435c18e4491b04827deb47078b6d5 (diff) |
boost threads and mutexes, better error handling (thread's timeouts)
-rw-r--r-- | commonheaders.h | 22 | ||||
-rw-r--r-- | globals.h | 1 | ||||
-rw-r--r-- | gpg_wrapper.cpp | 9 | ||||
-rw-r--r-- | log.cpp | 8 | ||||
-rw-r--r-- | log.h | 1 | ||||
-rw-r--r-- | main.cpp | 133 | ||||
-rw-r--r-- | messages.cpp | 45 | ||||
-rw-r--r-- | new_gpg.vcproj | 8 | ||||
-rw-r--r-- | options.cpp | 33 | ||||
-rw-r--r-- | utilities.cpp | 21 |
10 files changed, 154 insertions, 127 deletions
diff --git a/commonheaders.h b/commonheaders.h index d76cc58..49a1b4d 100644 --- a/commonheaders.h +++ b/commonheaders.h @@ -16,15 +16,17 @@ #ifndef COMMONHEADERS_H #define COMMONHEADERS_H #define MIRANDA_VER 0x0901 +//windows #include <windows.h> -#include <locale.h> #include <shlobj.h> #include <io.h> -#include <errno.h> -#include <time.h> #include <uxtheme.h> #include <shlwapi.h> - +//c +#include <locale.h> +#include <errno.h> +#include <time.h> +//c++ #include <iostream> #include <map> using std::map; @@ -39,6 +41,11 @@ using std::wstring; using std::wfstream; using std::fstream; +//boost +#include <boost/thread/thread.hpp> +#include <boost/thread/mutex.hpp> + +//miranda #include <newpluginapi.h> #include <m_database.h> #include <m_options.h> @@ -58,13 +65,14 @@ using std::fstream; #include "m_metacontacts.h" #include "resource.h" + +//internal #include "constants.h" -#include "utilities.h" +#include "log.h" #include "globals.h" +#include "utilities.h" #include "main.h" #include "gpg_wrapper.h" #include "jabber_account.h" #include "metacontacts.h" -#include "log.h" -extern logtofile debuglog; #endif @@ -18,4 +18,5 @@ #define GLOBALS_H extern bool bAppendTags; extern TCHAR *inopentag, *inclosetag, *outopentag, *outclosetag; +extern logtofile debuglog; #endif diff --git a/gpg_wrapper.cpp b/gpg_wrapper.cpp index 226fd5e..a6c2723 100644 --- a/gpg_wrapper.cpp +++ b/gpg_wrapper.cpp @@ -18,12 +18,12 @@ //thx gpg module from Harald Treder, Zakhar V. Bardymov -HANDLE gpg_mutex = NULL; +boost::mutex gpg_mutex; pxResult pxExecute(wstring *acommandline, char *ainput, string *aoutput, LPDWORD aexitcode, pxResult *result) { - WaitForSingleObject(gpg_mutex, INFINITE); + gpg_mutex.lock(); extern logtofile debuglog; BOOL success; STARTUPINFO sinfo = {0}; @@ -99,7 +99,6 @@ pxResult pxExecute(wstring *acommandline, char *ainput, string *aoutput, LPDWORD debuglog<<"gpg in: "<<commandline<<"\n"; - gpg_mutex = CreateMutex(NULL, FALSE, NULL); success = CreateProcess(NULL, (TCHAR*)commandline.c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT, _T("LANGUAGE=en@quot\0"), NULL, &sinfo, &pri); if (!success) @@ -108,7 +107,7 @@ pxResult pxExecute(wstring *acommandline, char *ainput, string *aoutput, LPDWORD CloseHandle(writestdin); CloseHandle(newstdout); CloseHandle(readstdout); - ReleaseMutex(gpg_mutex); + gpg_mutex.unlock(); *result = pxCreateProcessFailed; return pxCreateProcessFailed; } @@ -130,7 +129,7 @@ pxResult pxExecute(wstring *acommandline, char *ainput, string *aoutput, LPDWORD inputpos+=transfered; Sleep(200); } - ReleaseMutex(gpg_mutex); + gpg_mutex.unlock(); storeOutput(readstdout,aoutput); @@ -21,10 +21,12 @@ logtofile& logtofile::operator<<(TCHAR *buf) extern bool bDebugLog; if(bDebugLog) { + log_mutex.lock(); char *tmp = mir_utf8encodeW(buf); log.open(path, std::ios::app |std::ios::ate); log<<tmp; log.close(); + log_mutex.unlock(); mir_free(tmp); } return *this; @@ -34,10 +36,12 @@ logtofile& logtofile::operator<<(char *buf) extern bool bDebugLog; if(bDebugLog) { + log_mutex.lock(); char *tmp = mir_utf8encode(buf); log.open(path, std::ios::app |std::ios::ate); log<<tmp; log.close(); + log_mutex.unlock(); mir_free(tmp); } return *this; @@ -47,10 +51,12 @@ logtofile& logtofile::operator<<(string buf) extern bool bDebugLog; if(bDebugLog) { + log_mutex.lock(); char *tmp = mir_utf8encode(buf.c_str()); log.open(path, std::ios::app |std::ios::ate); log<<tmp; log.close(); + log_mutex.unlock(); mir_free(tmp); } return *this; @@ -60,10 +66,12 @@ logtofile& logtofile::operator<<(wstring buf) extern bool bDebugLog; if(bDebugLog) { + log_mutex.lock(); char *tmp = mir_utf8encodeW(buf.c_str()); log.open(path, std::ios::app |std::ios::ate); log<<tmp; log.close(); + log_mutex.unlock(); mir_free(tmp); } return *this; @@ -29,6 +29,7 @@ public: private: fstream log; TCHAR *path; + boost::mutex log_mutex; }; #endif
\ No newline at end of file @@ -88,11 +88,12 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + break; } if(result == pxNotFound) { @@ -183,11 +184,12 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + break; } if(result == pxNotFound) { @@ -247,11 +249,12 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + break; } if(result == pxNotFound) { @@ -319,12 +322,13 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM params.useless = ""; params.out = &out; params.code = &code; - params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + params.result = &result; + boost::thread *gpg_thread = new boost::thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread->timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + delete gpg_thread; MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + break; } if(result == pxNotFound) { @@ -349,11 +353,12 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM cmd += _T("--batch --delete-secret-and-public-key --fingerprint "); cmd += fp; mir_free(fp); - gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + gpg_thread = new boost::thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread->timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + delete gpg_thread; MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + break; } if(result == pxNotFound) { @@ -445,6 +450,10 @@ static BOOL CALLBACK DlgProcGpgBinOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LP tmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szGpgBinPath", (SHGetValue(HKEY_CURRENT_USER, _T("Software\\GNU\\GnuPG"), _T("gpgProgram"), 0, path, &len) == ERROR_SUCCESS)?path:_T("")); if(tmp[0]) { + char *mir_path = new char [MAX_PATH]; + CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)"\\", (LPARAM)mir_path); + SetCurrentDirectoryA(mir_path); + delete [] mir_path; if(_waccess(tmp, 0) == -1) { if(errno == ENOENT) @@ -472,16 +481,9 @@ static BOOL CALLBACK DlgProcGpgBinOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LP params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) - { - TerminateThread(gpg_thread, 0); - MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); - } - if(result == pxNotFound) - { - MessageBox(0, _T("Set path to gpg.exe first!"), _T("Warning"), MB_OK); - } + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) + gpg_thread.~thread(); DBDeleteContactSetting(NULL, szGPGModuleName, "szGpgBinPath"); string::size_type p1 = out.find("(GnuPG) "); if(p1 != string::npos) @@ -556,6 +558,10 @@ static BOOL CALLBACK DlgProcGpgBinOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LP GetDlgItemText(hwndDlg, IDC_BIN_PATH, tmp, 512); if(tmp[0]) { + char *mir_path = new char [MAX_PATH]; + CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)"\\", (LPARAM)mir_path); + SetCurrentDirectoryA(mir_path); + delete [] mir_path; if(_waccess(tmp, 0) == -1) { if(errno == ENOENT) @@ -583,16 +589,9 @@ static BOOL CALLBACK DlgProcGpgBinOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LP params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) - { - TerminateThread(gpg_thread, 0); - MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); - } - if(result == pxNotFound) - { - MessageBox(0, _T("Set path to gpg.exe first!"), _T("Warning"), MB_OK); - } + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) + gpg_thread.~thread(); DBDeleteContactSetting(NULL, szGPGModuleName, "szGpgBinPath"); string::size_type p1 = out.find("(GnuPG) "); if(p1 != string::npos) @@ -651,9 +650,9 @@ static BOOL CALLBACK DlgProcGpgBinOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LP static BOOL CALLBACK DlgProcNewKeyDialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { extern HANDLE new_key_hcnt; - extern HANDLE new_key_hcnt_mutex; + extern boost::mutex new_key_hcnt_mutex; HANDLE hContact = new_key_hcnt; - ReleaseMutex(new_key_hcnt_mutex); + new_key_hcnt_mutex.unlock(); void ImportKey(); TCHAR *tmp = NULL; switch (msg) @@ -817,12 +816,12 @@ static BOOL CALLBACK DlgProcKeyGenDialog(HWND hwndDlg, UINT msg, WPARAM wParam, tmp = new TCHAR [5]; GetDlgItemText(hwndDlg, IDC_KEY_TYPE, tmp, 5); tmp2 = mir_t2a(tmp); + delete [] tmp; char *subkeytype = new char [6]; if(strstr(tmp2, "RSA")) strcpy(subkeytype, "RSA"); else if(strstr(tmp2, "DSA")) //this is useless check for now, but it will be required if someone add another key types support strcpy(subkeytype, "ELG-E"); - delete [] tmp; f<<tmp2; mir_free(tmp2); f<<"\n"; @@ -899,11 +898,12 @@ static BOOL CALLBACK DlgProcKeyGenDialog(HWND hwndDlg, UINT msg, WPARAM wParam, params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 300000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::minutes(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + break; } if(result == pxNotFound) { @@ -932,11 +932,12 @@ static BOOL CALLBACK DlgProcKeyGenDialog(HWND hwndDlg, UINT msg, WPARAM wParam, params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + break; } if(result == pxNotFound) { @@ -1082,11 +1083,12 @@ static BOOL CALLBACK DlgProcLoadExistingKey(HWND hwndDlg,UINT msg,WPARAM wParam, params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + break; } if(result == pxNotFound) { @@ -1160,11 +1162,12 @@ static BOOL CALLBACK DlgProcLoadExistingKey(HWND hwndDlg,UINT msg,WPARAM wParam, params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + break; } if(result == pxNotFound) { @@ -1225,9 +1228,9 @@ static BOOL CALLBACK DlgProcLoadExistingKey(HWND hwndDlg,UINT msg,WPARAM wParam, static BOOL CALLBACK DlgProcImportKeyDialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { extern HANDLE new_key_hcnt; - extern HANDLE new_key_hcnt_mutex; + extern boost::mutex new_key_hcnt_mutex; HANDLE hContact = new_key_hcnt; - ReleaseMutex(new_key_hcnt_mutex); + new_key_hcnt_mutex.unlock(); switch (msg) { case WM_INITDIALOG: @@ -1265,10 +1268,10 @@ static BOOL CALLBACK DlgProcImportKeyDialog(HWND hwndDlg, UINT msg, WPARAM wPara params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); } if(result == pxNotFound) @@ -1387,11 +1390,12 @@ void InitCheck() params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + return; } if(result == pxNotFound) { @@ -1414,9 +1418,9 @@ void ImportKey() { extern wstring new_key; extern HANDLE new_key_hcnt; - extern HANDLE new_key_hcnt_mutex; + extern boost::mutex new_key_hcnt_mutex; HANDLE hContact = new_key_hcnt; - ReleaseMutex(new_key_hcnt_mutex); + new_key_hcnt_mutex.unlock(); DBWriteContactSettingTString(hContact, szGPGModuleName, "GPGPubKey", new_key.c_str()); new_key.clear(); { //gpg execute block @@ -1450,11 +1454,12 @@ void ImportKey() params.out = &output; params.code = &exitcode; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + return; } if(result == pxNotFound) { diff --git a/messages.cpp b/messages.cpp index 99b1687..b18a93e 100644 --- a/messages.cpp +++ b/messages.cpp @@ -19,7 +19,7 @@ wstring new_key; HANDLE new_key_hcnt = NULL; -HANDLE new_key_hcnt_mutex = NULL; +boost::mutex new_key_hcnt_mutex; bool _terminate = false; BOOL isProtoMetaContacts(HANDLE hContact); @@ -80,8 +80,7 @@ int RecvMsgSvc(WPARAM w, LPARAM l) s2 += _tcslen(_T("-----END PGP PRIVATE KEY BLOCK-----")); } new_key.append(str.substr(s1,s2-s1)); - WaitForSingleObject(new_key_hcnt_mutex, INFINITE); - new_key_hcnt_mutex = CreateMutex(NULL, FALSE, NULL); + new_key_hcnt_mutex.lock(); new_key_hcnt = hContact; ShowNewKeyDialog(); return CallService(MS_PROTO_CHAINRECV, w, l); @@ -198,11 +197,12 @@ int RecvMsgSvc(WPARAM w, LPARAM l) params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread *gpg_thread = new boost::thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread->timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + delete gpg_thread; MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + return CallService(MS_PROTO_CHAINRECV, w, l); } if(result == pxNotFound) { @@ -224,8 +224,7 @@ int RecvMsgSvc(WPARAM w, LPARAM l) DBWriteContactSettingString(hContact, szGPGModuleName, "InKeyID", out.substr(s, s2-s).c_str()); } void ShowLoadKeyPasswordWindow(); - WaitForSingleObject(new_key_hcnt_mutex, INFINITE); - new_key_hcnt_mutex = CreateMutex(NULL, FALSE, NULL); + new_key_hcnt_mutex.lock(); new_key_hcnt = hContact; ShowLoadKeyPasswordWindow(); wstring cmd2 = cmd; @@ -245,11 +244,12 @@ int RecvMsgSvc(WPARAM w, LPARAM l) params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + gpg_thread = gpg_thread = new boost::thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread->timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + delete gpg_thread; MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + return CallService(MS_PROTO_CHAINRECV, w, l); } if(result == pxNotFound) { @@ -259,11 +259,12 @@ int RecvMsgSvc(WPARAM w, LPARAM l) } } out.clear(); - gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + gpg_thread = new boost::thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread->timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + delete gpg_thread; MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + return CallService(MS_PROTO_CHAINRECV, w, l); } if(result == pxNotFound) { @@ -423,11 +424,12 @@ int SendMsgSvc(WPARAM w, LPARAM l) params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + return CallService(MS_PROTO_CHAINSEND, w, l); } if(result == pxNotFound) { @@ -448,11 +450,12 @@ int SendMsgSvc(WPARAM w, LPARAM l) params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + return CallService(MS_PROTO_CHAINSEND, w, l); } if(result == pxNotFound) { @@ -536,7 +539,7 @@ int TestHook(WPARAM w, LPARAM l) static BOOL CALLBACK DlgProcKeyPassword(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { char *inkeyid = UniGetContactSettingUtf(new_key_hcnt, szGPGModuleName, "InKeyID", ""); - ReleaseMutex(new_key_hcnt_mutex); + new_key_hcnt_mutex.unlock(); TCHAR *tmp = NULL; switch (msg) diff --git a/new_gpg.vcproj b/new_gpg.vcproj index 35370df..b6731ba 100644 --- a/new_gpg.vcproj +++ b/new_gpg.vcproj @@ -151,7 +151,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories=""X:\install\git\miranda\miranda-im\miranda\include";X:\install\git\miranda\mim_plugs;../../include"
+ AdditionalIncludeDirectories="D:\work\libs\boost_1_44_0;"X:\install\git\miranda\miranda-im\miranda\include";X:\install\git\miranda\mim_plugs;../../include"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;TESTPLUG_EXPORTS;_CRT_SECURE_NO_WARNINGS;_UNICODE;UNICODE;_CRT_SECURE_NO_DEPRECATE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -183,7 +183,7 @@ AdditionalDependencies="shlwapi.lib"
LinkIncremental="2"
SuppressStartupBanner="true"
- AdditionalLibraryDirectories=""
+ AdditionalLibraryDirectories="D:\work\libs\boost_1_44_0\stage\lib"
GenerateDebugInformation="true"
AssemblyDebug="1"
ProgramDatabaseFile="./$(TargetName).pdb"
@@ -254,7 +254,7 @@ FavorSizeOrSpeed="2"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""X:\install\git\miranda\miranda-im\miranda\include";X:\install\git\miranda\mim_plugs;../../include"
+ AdditionalIncludeDirectories="D:\work\libs\boost_1_44_0;"X:\install\git\miranda\miranda-im\miranda\include";X:\install\git\miranda\mim_plugs;../../include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;_UNICODE"
StringPooling="true"
RuntimeLibrary="0"
@@ -286,7 +286,7 @@ AdditionalDependencies="shlwapi.lib"
LinkIncremental="1"
SuppressStartupBanner="true"
- AdditionalLibraryDirectories=""
+ AdditionalLibraryDirectories="D:\work\libs\boost_1_44_0\stage\lib"
GenerateDebugInformation="false"
SubSystem="0"
OptimizeReferences="2"
diff --git a/options.cpp b/options.cpp index 4390e49..28eb55a 100644 --- a/options.cpp +++ b/options.cpp @@ -250,11 +250,13 @@ static BOOL CALLBACK DlgProcGpgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA params.out = &output; params.code = &exitcode; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + mir_free(tmp); + break; } if(result == pxNotFound) { @@ -649,10 +651,10 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); } if(result == pxNotFound) @@ -802,11 +804,12 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP params.out = &output; params.code = &exitcode; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + break; } if(result == pxNotFound) { @@ -1036,11 +1039,12 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + break; } if(result == pxNotFound) { @@ -1151,9 +1155,8 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP break; case IDC_IMPORT: extern HANDLE new_key_hcnt; - extern HANDLE new_key_hcnt_mutex; - WaitForSingleObject(new_key_hcnt_mutex, INFINITE); - new_key_hcnt_mutex = CreateMutex(NULL, FALSE, NULL); + extern boost::mutex new_key_hcnt_mutex; + new_key_hcnt_mutex.lock(); new_key_hcnt = hContact; void ShowImportKeyDialog(); ShowImportKeyDialog(); diff --git a/utilities.cpp b/utilities.cpp index 271afb2..2ad4cf2 100644 --- a/utilities.cpp +++ b/utilities.cpp @@ -517,10 +517,10 @@ static JABBER_HANDLER_FUNC SendHandler(IJabberInterface *ji, HXML node, void *pU params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); } if(result == pxNotFound) @@ -590,7 +590,7 @@ static JABBER_HANDLER_FUNC SendHandler(IJabberInterface *ji, HXML node, void *pU return FALSE; } -HANDLE sign_file_mutex = NULL; +boost::mutex sign_file_mutex; static JABBER_HANDLER_FUNC PrescenseHandler(IJabberInterface *ji, HXML node, void *pUserData) { @@ -617,8 +617,7 @@ static JABBER_HANDLER_FUNC PrescenseHandler(IJabberInterface *ji, HXML node, voi wstring path_out = path_c; mir_free(path_c); path_out += _T("\\sign.asc"); - WaitForSingleObject(sign_file_mutex, INFINITE); - sign_file_mutex = CreateMutex(NULL, FALSE, NULL); + sign_file_mutex.lock(); DeleteFile(path_out.c_str()); wfstream f(path_out.c_str(), std::ios::out); char *tmp = mir_utf8encodeW(sign.c_str()); @@ -629,7 +628,7 @@ static JABBER_HANDLER_FUNC PrescenseHandler(IJabberInterface *ji, HXML node, voi { if(errno == ENOENT) { - ReleaseMutex(sign_file_mutex); + sign_file_mutex.unlock(); debuglog<<"info: Failed to write sign in file\n"; return FALSE; } @@ -647,14 +646,14 @@ static JABBER_HANDLER_FUNC PrescenseHandler(IJabberInterface *ji, HXML node, voi params.out = &out; params.code = &code; params.result = &result; - HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)¶ms); - if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT) + boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) { - TerminateThread(gpg_thread, 0); + gpg_thread.~thread(); MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); } DeleteFile(path_out.c_str()); - ReleaseMutex(sign_file_mutex); + sign_file_mutex.unlock(); if(result == pxNotFound) { MessageBox(0, _T("Set path to gpg.exe first!"), _T("Warning"), MB_OK); |