mirror of
				https://github.com/zeromq/libzmq.git
				synced 2025-11-04 12:17:39 +01:00 
			
		
		
		
	fix computation of winsock fd_set size (#3151)
* fix computation of winsock fd_set size
This commit is contained in:
		@@ -128,30 +128,32 @@ inline size_t valid_pollset_bytes (const fd_set &pollset_)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined ZMQ_HAVE_WINDOWS
 | 
					#if defined ZMQ_HAVE_WINDOWS
 | 
				
			||||||
 | 
					// struct fd_set {
 | 
				
			||||||
 | 
					//  u_int   fd_count;
 | 
				
			||||||
 | 
					//  SOCKET  fd_array[1];
 | 
				
			||||||
 | 
					// };
 | 
				
			||||||
 | 
					// NOTE: offsetof(fd_set, fd_array)==sizeof(SOCKET) on both x86 and x64
 | 
				
			||||||
 | 
					//       due to alignment bytes for the latter.
 | 
				
			||||||
class optimized_fd_set_t
 | 
					class optimized_fd_set_t
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    explicit optimized_fd_set_t (size_t nevents_) : _fd_set (nevents_) {}
 | 
					    explicit optimized_fd_set_t (size_t nevents_) : _fd_set (1 + nevents_) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fd_set *get () { return reinterpret_cast<fd_set *> (&_fd_set[0]); }
 | 
					    fd_set *get () { return reinterpret_cast<fd_set *> (&_fd_set[0]); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    fast_vector_t<char, sizeof (u_int) + ZMQ_POLLITEMS_DFLT * sizeof (SOCKET)>
 | 
					    fast_vector_t<SOCKET, 1 + ZMQ_POLLITEMS_DFLT> _fd_set;
 | 
				
			||||||
      _fd_set;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class resizable_optimized_fd_set_t
 | 
					class resizable_optimized_fd_set_t
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    void resize (size_t nevents_) { _fd_set.resize (nevents_); }
 | 
					    void resize (size_t nevents_) { _fd_set.resize (1 + nevents_); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fd_set *get () { return reinterpret_cast<fd_set *> (&_fd_set[0]); }
 | 
					    fd_set *get () { return reinterpret_cast<fd_set *> (&_fd_set[0]); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    resizable_fast_vector_t<char,
 | 
					    resizable_fast_vector_t<SOCKET, 1 + ZMQ_POLLITEMS_DFLT> _fd_set;
 | 
				
			||||||
                            sizeof (u_int)
 | 
					 | 
				
			||||||
                              + ZMQ_POLLITEMS_DFLT * sizeof (SOCKET)>
 | 
					 | 
				
			||||||
      _fd_set;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
class optimized_fd_set_t
 | 
					class optimized_fd_set_t
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user