|  | @@ -221,6 +221,12 @@ typedef int SOCKET;
 | 
	
		
			
				|  |  |  #define MAX_CGI_ENVIR_VARS 64
 | 
	
		
			
				|  |  |  #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#ifdef _WIN32
 | 
	
		
			
				|  |  | +static pthread_t pthread_self(void) {
 | 
	
		
			
				|  |  | +  return GetCurrentThreadId();
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +#endif // _WIN32
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #if defined(DEBUG)
 | 
	
		
			
				|  |  |  #define DEBUG_TRACE(x) do { \
 | 
	
		
			
				|  |  |    flockfile(stdout); \
 | 
	
	
		
			
				|  | @@ -863,10 +869,6 @@ static int pthread_cond_destroy(pthread_cond_t *cv) {
 | 
	
		
			
				|  |  |    return CloseHandle(cv->signal) && CloseHandle(cv->broadcast) ? 0 : -1;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static pthread_t pthread_self(void) {
 | 
	
		
			
				|  |  | -  return GetCurrentThreadId();
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  // For Windows, change all slashes to backslashes in path names.
 | 
	
		
			
				|  |  |  static void change_slashes_to_backslashes(char *path) {
 | 
	
		
			
				|  |  |    int i;
 | 
	
	
		
			
				|  | @@ -1104,18 +1106,8 @@ struct dirent * readdir(DIR *dir) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define set_close_on_exec(fd) // No FD_CLOEXEC on Windows
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static int start_thread(struct mg_context *ctx, mg_thread_func_t func,
 | 
	
		
			
				|  |  | -                        void *param) {
 | 
	
		
			
				|  |  | -  HANDLE hThread;
 | 
	
		
			
				|  |  | -  ctx = NULL; // Unused
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, param, 0,
 | 
	
		
			
				|  |  | -                         NULL);
 | 
	
		
			
				|  |  | -  if (hThread != NULL) {
 | 
	
		
			
				|  |  | -    (void) CloseHandle(hThread);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  return hThread == NULL ? -1 : 0;
 | 
	
		
			
				|  |  | +static int start_thread(struct mg_context *ctx, mg_thread_func_t f, void *p) {
 | 
	
		
			
				|  |  | +  return _beginthread((void (__cdecl *)(void *)) f, 0, p) == -1L ? -1 : 0;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static HANDLE dlopen(const char *dll_name, int flags) {
 | 
	
	
		
			
				|  | @@ -3454,7 +3446,7 @@ static int set_ports_option(struct mg_context *ctx) {
 | 
	
		
			
				|  |  |                 // handshake will figure out that the client is down and
 | 
	
		
			
				|  |  |                 // will close the server end.
 | 
	
		
			
				|  |  |                 // Thanks to Igor Klopov who suggested the patch.
 | 
	
		
			
				|  |  | -               setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &on,
 | 
	
		
			
				|  |  | +               setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *) &on,
 | 
	
		
			
				|  |  |                            sizeof(on)) != 0 ||
 | 
	
		
			
				|  |  |                 bind(sock, &so.lsa.u.sa, so.lsa.len) != 0 ||
 | 
	
		
			
				|  |  |                 listen(sock, 100) != 0) {
 | 
	
	
		
			
				|  | @@ -3783,7 +3775,7 @@ static void close_socket_gracefully(SOCKET sock) {
 | 
	
		
			
				|  |  |    // ephemeral port exhaust problem under high QPS.
 | 
	
		
			
				|  |  |    linger.l_onoff = 1;
 | 
	
		
			
				|  |  |    linger.l_linger = 1;
 | 
	
		
			
				|  |  | -  setsockopt(sock, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger));
 | 
	
		
			
				|  |  | +  setsockopt(sock, SOL_SOCKET, SO_LINGER, (void *) &linger, sizeof(linger));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Send FIN to the client
 | 
	
		
			
				|  |  |    (void) shutdown(sock, SHUT_WR);
 |