Browse Source

fix internal task race

Use true local static instead of global one
alexey 3 years ago
parent
commit
ede650ea31
4 changed files with 15 additions and 15 deletions
  1. 2 2
      src/client_task_info.cpp
  2. 1 1
      src/client_task_info.h
  3. 1 1
      src/searchd.cpp
  4. 11 11
      src/task_info.h

+ 2 - 2
src/client_task_info.cpp

@@ -37,14 +37,14 @@ DEFINE_RENDER ( ClientTaskInfo_t )
 MiniTaskInfo_t* myinfo::HazardGetMini()
 {
 	return (MiniTaskInfo_t*)myinfo::HazardGetNode ( [] ( TaskInfo_t* pNode ) {
-		return pNode->m_eType == MiniTaskInfo_t::m_eTask || pNode->m_eType == ClientTaskInfo_t::m_eTask;
+		return pNode->m_eType == MiniTaskInfo_t::Task() || pNode->m_eType == ClientTaskInfo_t::Task();
 	} );
 }
 
 
 ClientTaskInfo_t * HazardGetClient ()
 {
-	return (ClientTaskInfo_t *) myinfo::GetHazardTypedNode ( ClientTaskInfo_t::m_eTask );
+	return (ClientTaskInfo_t *) myinfo::GetHazardTypedNode ( ClientTaskInfo_t::Task() );
 }
 
 ClientTaskInfo_t & ClientTaskInfo_t::Info ( bool bStrict )

+ 1 - 1
src/client_task_info.h

@@ -200,7 +200,7 @@ namespace myinfo {
 	// num of real tasks (that is mini-info + client-info)
 	inline int CountTasks()
 	{
-		return Count ( MiniTaskInfo_t::m_eTask ) + Count ( ClientTaskInfo_t::m_eTask );
+		return Count ( MiniTaskInfo_t::Task() ) + Count ( ClientTaskInfo_t::Task() );
 	}
 
 } // namespace myinfo

+ 1 - 1
src/searchd.cpp

@@ -1128,7 +1128,7 @@ LONG WINAPI CrashLogger::HandleCrash ( EXCEPTION_POINTERS * pExc )
 			auto pSrc = (ClientTaskInfo_t *) pThread->m_pTaskInfo.load ( std::memory_order_relaxed );
 			if ( pSrc ) ++iAllThd;
 			for ( ; pSrc; pSrc = (ClientTaskInfo_t *) pSrc->m_pPrev.load ( std::memory_order_relaxed ) )
-				if ( pSrc->m_eType==ClientTaskInfo_t::m_eTask )
+				if ( pSrc->m_eType==ClientTaskInfo_t::Task() )
 				{
 					sphSafeInfo ( g_iLogFile, "thd %d (%s), proto %s, state %s, command %s", iThd,
 							pThread->m_sThreadName.cstr(),

+ 11 - 11
src/task_info.h

@@ -84,20 +84,20 @@ using RenderFnPtr = void ( * ) ( const void * pSrc, PublicThreadDesc_t & dDst );
 BYTE RegisterRenderer ( RenderFnPtr pFunc ) noexcept;
 
 // Declare static member func 'Render', and provide initial registration and storing type ID
-#define DECLARE_RENDER( TASKINFO )    \
-    static BYTE m_eTask;    \
-    TASKINFO () noexcept {  \
-        if (!m_eTask) m_eTask = RegisterRenderer ( TASKINFO::Render ); \
-        m_eType = m_eTask; \
-    }                                  \
+#define DECLARE_RENDER( TASKINFO )									\
+    static BYTE Task() {											\
+    	static BYTE eTask = RegisterRenderer ( TASKINFO::Render );	\
+    	return eTask;												\
+	}																\
+    TASKINFO () noexcept {											\
+        m_eType = Task();											\
+    }																\
     static void Render ( const void * pSrc, PublicThreadDesc_t & dDst )
 
 // Define declared stuff (has to be written in .cpp to avoid multiple definitions)
 #define DEFINE_RENDER( TASKINFO ) \
-	BYTE TASKINFO::m_eTask=0;        \
 	void TASKINFO::Render ( const void * pSrc, PublicThreadDesc_t & dDst )
 
-
 // generic task info
 struct TaskInfo_t
 {
@@ -135,7 +135,7 @@ public:
 		: m_pInfo ( pInfo )
 	{
 		pInfo->m_pPrev = Threads::MyThd().m_pTaskInfo.exchange ( pInfo, std::memory_order_acq_rel );
-		REFCOUNT::Inc ( TASKINFO::m_eTask );
+		REFCOUNT::Inc ( TASKINFO::Task() );
 	}
 
 	operator TASKINFO*() const { return m_pInfo.operator TASKINFO*(); };
@@ -149,7 +149,7 @@ public:
 	~ScopedInfo_T ()
 	{
 		Threads::MyThd ().m_pTaskInfo.store ( m_pInfo->m_pPrev, std::memory_order_release );
-		REFCOUNT::Dec ( TASKINFO::m_eTask );
+		REFCOUNT::Dec ( TASKINFO::Task() );
 	}
 };
 
@@ -215,7 +215,7 @@ namespace myinfo {
 	template <typename TASKINFO>
 	TASKINFO* ref()
 	{
-		return (TASKINFO *) GetHazardTypedNode ( TASKINFO::m_eTask );
+		return (TASKINFO *) GetHazardTypedNode ( TASKINFO::Task() );
 	}
 
 	// set MiniTaskInfo_t::m_sCommand