5353#include " vphysics_interface.h"
5454#include " datacache/imdlcache.h"
5555#include " ivoiceserver.h"
56+ #include " tier0/threadtools.h"
5657
5758#include " manager.h"
5859
@@ -190,20 +191,24 @@ bool GetInterfaces( InterfaceHelper_t* pInterfaceList, CreateInterfaceFn factory
190191#if defined(ENGINE_ORANGEBOX) || defined(ENGINE_BMS) || defined(ENGINE_GMOD)
191192SpewRetval_t SP_SpewOutput ( SpewType_t spewType, const tchar *pMsg )
192193{
193- extern CListenerManager* GetOnServerOutputListenerManager ();
194194 bool block = false ;
195195
196- for (int i = 0 ; i < GetOnServerOutputListenerManager ()->m_vecCallables .Count (); i++)
197- {
198- BEGIN_BOOST_PY ()
199- object return_value = GetOnServerOutputListenerManager ()->m_vecCallables [i](
200- (MessageSeverity) spewType,
201- pMsg);
196+ // Only filter outputs from the main thread. See issues #400 and #404.
197+ if (ThreadInMainThread ()) {
198+ extern CListenerManager* GetOnServerOutputListenerManager ();
202199
203- if (!return_value.is_none () && extract<OutputReturn>(return_value) == OUTPUT_BLOCK)
204- block = true ;
200+ for (int i = 0 ; i < GetOnServerOutputListenerManager ()->m_vecCallables .Count (); i++)
201+ {
202+ BEGIN_BOOST_PY ()
203+ object return_value = GetOnServerOutputListenerManager ()->m_vecCallables [i](
204+ (MessageSeverity) spewType,
205+ pMsg);
205206
206- END_BOOST_PY_NORET ()
207+ if (!return_value.is_none () && extract<OutputReturn>(return_value) == OUTPUT_BLOCK)
208+ block = true ;
209+
210+ END_BOOST_PY_NORET ()
211+ }
207212 }
208213
209214 if (!block && g_SourcePythonPlugin.m_pOldSpewOutputFunc )
@@ -217,20 +222,24 @@ class SPLoggingListener: public ILoggingListener
217222public:
218223 virtual void Log ( const LoggingContext_t *pContext, const tchar *pMessage )
219224 {
220- extern CListenerManager* GetOnServerOutputListenerManager ();
221225 bool block = false ;
222226
223- for (int i = 0 ; i < GetOnServerOutputListenerManager ()->m_vecCallables .Count (); i++)
224- {
225- BEGIN_BOOST_PY ()
226- object return_value = GetOnServerOutputListenerManager ()->m_vecCallables [i](
227- (MessageSeverity) pContext->m_Severity ,
228- pMessage);
227+ // Only filter outputs from the main thread. See issues #400 and #404.
228+ if (ThreadInMainThread ()) {
229+ extern CListenerManager* GetOnServerOutputListenerManager ();
229230
230- if (!return_value.is_none () && extract<OutputReturn>(return_value) == OUTPUT_BLOCK)
231- block = true ;
231+ for (int i = 0 ; i < GetOnServerOutputListenerManager ()->m_vecCallables .Count (); i++)
232+ {
233+ BEGIN_BOOST_PY ()
234+ object return_value = GetOnServerOutputListenerManager ()->m_vecCallables [i](
235+ (MessageSeverity) pContext->m_Severity ,
236+ pMessage);
232237
233- END_BOOST_PY_NORET ()
238+ if (!return_value.is_none () && extract<OutputReturn>(return_value) == OUTPUT_BLOCK)
239+ block = true ;
240+
241+ END_BOOST_PY_NORET ()
242+ }
234243 }
235244
236245 if (!block)
0 commit comments