* Fix #323: Missing SelectInterrupt implementation for Windows Using WSAEventSelect, WSAWaitForMultipleEvents and WSAEnumNetworkEvents to emulate poll() with an interrupt-event. * Cleanup * Fixed incomplete comment. * Switched ifdefs to support other Unixes with pipe file descriptors * Fixed: SelectInterrupt fallback code for getFd()==-1 && getEvent()==nullptr converted a PollResultType::Timeout into a ReadyForRead causing the HttpClient to fail because it uses a hard-coded "SelectInterrupt" instance that doesn't implement getFd() and getEvent(). * Fixed gcc compile errors * - HttpClient now uses the SelectInterruptFactory - Fixed wrong ix::poll result when using Windows WSA functions * We must deselect the networkevents from the socket event. Otherwise the socket will report states that aren't there.
		
			
				
	
	
		
			40 lines
		
	
	
		
			848 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			848 B
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  *  IXSelectInterruptEvent.h
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include "IXSelectInterrupt.h"
 | |
| #include <mutex>
 | |
| #include <stdint.h>
 | |
| #include <string>
 | |
| #include <deque>
 | |
| #ifdef _WIN32
 | |
| #include <windows.h>
 | |
| #endif
 | |
| 
 | |
| namespace ix
 | |
| {
 | |
|     class SelectInterruptEvent final : public SelectInterrupt
 | |
|     {
 | |
|     public:
 | |
|         SelectInterruptEvent();
 | |
|         virtual ~SelectInterruptEvent();
 | |
| 
 | |
|         bool init(std::string& /*errorMsg*/) final;
 | |
| 
 | |
|         bool notify(uint64_t value) final;
 | |
|         bool clear() final;
 | |
|         uint64_t read() final;
 | |
|         void* getEvent() const final;
 | |
|     private:
 | |
|         // contains every value only once, new values are inserted at the begin, nu
 | |
|         std::deque<uint64_t> _values;
 | |
|         std::mutex _valuesMutex;
 | |
| #ifdef _WIN32
 | |
|         // Windows Event to wake up the socket poll
 | |
|         HANDLE _event;
 | |
| #endif
 | |
|     };
 | |
| } // namespace ix
 |