View Issue Details

IDProjectCategoryView StatusLast Update
0000736PluginsEMenupublic2009-10-26 00:57
ReporteralexeypaAssigned Toalexy 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version 
Target VersionFixed in Version2.0 
Summary0000736: Плагин EMenu некорректно завершает рабочий поток.
DescriptionCThreadTerminator::~CThreadTerminator, вызываемый из DllMainCRTStartup (DLL_PROCESS_DETACH, ...) пытается дождаться завершения потока, выполняя вот такой код:

    if (WaitForSingleObject(hThread, 100)==WAIT_TIMEOUT)
    {
      if (!TerminateThread(hThread, 0))
      {
        assert(0);
      }
    }

Проблема в том, что если поток hThread не завершился к моменту вызова ~CThreadTerminator, WaitForSingleObject всегда будет вываливаться по таймауту. Завершаясь, hThread вызовет ExitThread, который попытается захватить критическую секцию в недрах ntdll.dll. Эта же самая секция захватывается перед вызовом DllMainCRTStartup (DLL_PROCESS_DETACH, ...).
TagsNo tags attached.

Activities

alexeypa

2009-02-19 09:32

reporter   bugnote:0002493

Переместил баг в более подходящее место: http://bugs.farmanager.com/view.php?id=746

DrKnS

2009-02-19 11:18

administrator   bugnote:0002496

> Перенес баг в более подходящее место

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

alexy

2009-05-31 14:48

administrator   bugnote:0003380

Есть предложения?

dialex

2009-06-30 20:21

reporter   bugnote:0003653

предлагаю ждать в другом месте

2009-06-30 20:21

 

emenu.diff (742 bytes)
Index: OleThread.cpp
===================================================================
--- OleThread.cpp	(revision 3204)
+++ OleThread.cpp	(working copy)
@@ -134,17 +134,22 @@
     {
       assert(0);
     }
+    WaitForSingleObject(hThread, 100);
   }
 
   CThreadTerminator::~CThreadTerminator()
   {
     if (!hThread) return;
-    if (WaitForSingleObject(hThread, 100)==WAIT_TIMEOUT)
+    DWORD nStatus;
+    if (GetExitCodeThread(hThread, &nStatus))
     {
-      if (!TerminateThread(hThread, 0))
-      {
-        assert(0);
-      }
+      if (STILL_ACTIVE==nStatus)
+	  {
+	    if (!TerminateThread(hThread, 0))
+	    {
+	      assert(0);
+	    }
+	  }
     }
     if (!CloseHandle(hThread))
     {
emenu.diff (742 bytes)

alexy

2009-10-26 00:29

administrator   bugnote:0004339

Fixed. build 33.

alexy

2009-10-26 00:30

administrator   bugnote:0004340

Fixed. build 33.

alexy

2009-10-26 00:38

administrator   bugnote:0004341

fixed. build 33.

Issue History

Date Modified Username Field Change
2009-02-16 09:41 alexeypa New Issue
2009-02-19 09:32 alexeypa Note Added: 0002493
2009-02-19 09:32 alexeypa Duplicate ID 0 => 746
2009-02-19 09:32 alexeypa Status new => resolved
2009-02-19 09:32 alexeypa Resolution open => duplicate
2009-02-19 09:32 alexeypa Assigned To => alexeypa
2009-02-19 11:15 DrKnS Project Far Manager => Plugins
2009-02-19 11:18 DrKnS Assigned To alexeypa =>
2009-02-19 11:18 DrKnS Note Added: 0002496
2009-02-19 11:18 DrKnS Status resolved => new
2009-02-19 11:18 DrKnS Resolution duplicate => reopened
2009-02-19 11:18 DrKnS Category _Common => EMenu
2009-04-05 16:19 alexy Status new => assigned
2009-04-05 16:19 alexy Assigned To => alexy
2009-05-31 14:48 alexy Note Added: 0003380
2009-06-30 20:21 dialex Note Added: 0003653
2009-06-30 20:21 dialex File Added: emenu.diff
2009-10-26 00:29 alexy Note Added: 0004339
2009-10-26 00:30 alexy Note Added: 0004340
2009-10-26 00:38 alexy Note Added: 0004341
2009-10-26 00:52 alexy Status assigned => resolved
2009-10-26 00:57 DrKnS Status resolved => closed
2009-10-26 00:57 DrKnS Resolution reopened => fixed
2009-10-26 00:57 DrKnS Fixed in Version => 2.0