mirror of
				https://projects.vdr-developer.org/git/vdr-plugin-streamdev.git
				synced 2023-10-10 17:16:51 +00:00 
			
		
		
		
	deadlock in IGMP streaming server when switching live TV. Previously cComponentIGMP::Accept did all the work including the channel switch with the new cConnectionIGMP waiting for MainThreadHook. But as the new connection is stored *after* Accept, MainThreadHook didn't see it and so wasn't able to switch. The streamdev main thread waited forever. Moved the main work into cComponentIGMP::Welcome.
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  *  $Id: connectionIGMP.h,v 1.1 2009/02/13 10:39:22 schmirl Exp $
 | |
|  */
 | |
|  
 | |
| #ifndef VDR_STREAMDEV_SERVERS_CONNECTIONIGMP_H
 | |
| #define VDR_STREAMDEV_SERVERS_CONNECTIONIGMP_H
 | |
| 
 | |
| #include "connection.h"
 | |
| #include "server/livestreamer.h"
 | |
| 
 | |
| #include <tools/select.h>
 | |
| 
 | |
| #define MULTICAST_PRIV_MIN ((uint32_t) 0xefff0000)
 | |
| #define MULTICAST_PRIV_MAX ((uint32_t) 0xeffffeff)
 | |
| 
 | |
| class cStreamdevLiveStreamer;
 | |
| 
 | |
| class cConnectionIGMP: public cServerConnection {
 | |
| private:
 | |
| 	cStreamdevLiveStreamer           *m_LiveStreamer;
 | |
| 	int                               m_ClientPort;
 | |
| 	eStreamType                       m_StreamType;
 | |
| 	cChannel                         *m_Channel;
 | |
| 
 | |
| public:
 | |
| 	cConnectionIGMP(const char* Name, int ClientPort, eStreamType StreamType);
 | |
| 	virtual ~cConnectionIGMP();
 | |
| 
 | |
| 	bool SetChannel(cChannel *Channel, in_addr_t Dst);
 | |
| 	virtual void Welcome(void);
 | |
| 	void Stop();
 | |
| 
 | |
| 	/* Not used here */
 | |
| 	virtual bool Command(char *Cmd) { return false; }
 | |
| 
 | |
| 	virtual void Attach(void) { if (m_LiveStreamer != NULL) m_LiveStreamer->Attach(); }
 | |
| 	virtual void Detach(void) { if (m_LiveStreamer != NULL) m_LiveStreamer->Detach(); }
 | |
| 
 | |
| 	virtual bool Abort(void) const;
 | |
| };
 | |
| 
 | |
| inline bool cConnectionIGMP::Abort(void) const
 | |
| {
 | |
| 	return !m_LiveStreamer || m_LiveStreamer->Abort();
 | |
| }
 | |
| 
 | |
| #endif // VDR_STREAMDEV_SERVERS_CONNECTIONIGMP_H
 |