Changeset 8560
- Timestamp:
- 10/12/10 17:28:24 (3 years ago)
- Location:
- branches/windows-client/src
- Files:
-
- 4 modified
-
common/misc/pint-mem.c (modified) (1 diff)
-
io/bmi/bmi_wintcp/bmi-wintcp.c (modified) (6 diffs)
-
io/bmi/bmi_wintcp/socket-collection.c (modified) (10 diffs)
-
io/bmi/bmi_wintcp/socket-collection.h (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/windows-client/src/common/misc/pint-mem.c
r8550 r8560 15 15 #ifdef WIN32 16 16 #include "wincommon.h" 17 18 /* do not declare inline on Windows (can't be exported)*/ 19 #undef inline 20 #define inline 17 21 #endif 18 22 -
branches/windows-client/src/io/bmi/bmi_wintcp/bmi-wintcp.c
r8556 r8560 1989 1989 if (tcp_addr_data->socket > -1) 1990 1990 { 1991 close (tcp_addr_data->socket);1991 closesocket(tcp_addr_data->socket); 1992 1992 } 1993 1993 } … … 2265 2265 tmp_errno = WSAGetLastError(); 2266 2266 gossip_lerr("Error: failed to set TCP_NODELAY option.\n"); 2267 close (tcp_addr_data->socket);2267 closesocket(tcp_addr_data->socket); 2268 2268 return (bmi_tcp_errno_to_pvfs(-tmp_errno)); 2269 2269 } … … 2793 2793 if (tcp_addr_data->socket > -1) 2794 2794 { 2795 close (tcp_addr_data->socket);2795 closesocket(tcp_addr_data->socket); 2796 2796 } 2797 2797 tcp_addr_data->socket = -1; … … 3533 3533 3534 3534 /* perform a read on the socket so that we can get a real errno */ 3535 ret = re ad(tcp_addr_data->socket, &buf, sizeof(int));3535 ret = recv(tcp_addr_data->socket, &buf, sizeof(int), 0); 3536 3536 if (ret == 0) 3537 3537 tmp_errno = EPIPE; /* report other side closed socket with this */ … … 3767 3767 tmp_errno = WSAGetLastError(); 3768 3768 gossip_lerr("Error: failed to set TCP_NODELAY option.\n"); 3769 close (*socket);3769 closesocket(*socket); 3770 3770 return (bmi_tcp_errno_to_pvfs(-tmp_errno)); 3771 3771 } … … 3784 3784 if(!(*peer)) 3785 3785 { 3786 close (*socket);3786 closesocket(*socket); 3787 3787 return(bmi_tcp_errno_to_pvfs(-BMI_ENOMEM)); 3788 3788 } -
branches/windows-client/src/io/bmi/bmi_wintcp/socket-collection.c
r8556 r8560 15 15 * will always check to see if there is data to be read on a socket. 16 16 */ 17 18 #include <WinSock2.h> 19 17 20 #include <stdio.h> 18 21 #include <string.h> 19 22 #include <errno.h> 23 #include <io.h> 20 24 21 25 #include "gossip.h" … … 57 61 58 62 tmp_scp->pollfd_array = (struct 59 pollfd*)malloc(POLLFD_ARRAY_START*sizeof(struct pollfd)); 60 if(!tmp_scp->pollfd_array) 61 { 62 free(tmp_scp); 63 return(NULL); 64 } 63 pollfd*)malloc(POLLFD_ARRAY_START*sizeof(WSAPOLLFD)); 64 65 65 tmp_scp->addr_array = 66 66 (bmi_method_addr_p*)malloc(POLLFD_ARRAY_START*sizeof(bmi_method_addr_p)); 67 67 if(!tmp_scp->addr_array) 68 68 { 69 free(tmp_scp->pollfd_array);70 free(tmp_scp);69 free(tmp_scp->pollfd_array); 70 free(tmp_scp); 71 71 return NULL; 72 72 } 73 if (pipe(tmp_scp->pipe_fd) < 0) 73 /*if (pipe(tmp_scp->pipe_fd) < 0)*/ 74 if (!CreatePipe(&(tmp_scp->pipe_fd[0]), 75 &(tmp_scp->pipe_fd[1]), 76 NULL, 0)) 74 77 { 75 78 perror("pipe failed:"); 76 free(tmp_scp->addr_array); 77 free(tmp_scp->pollfd_array); 78 free(tmp_scp); 79 BMI_socket_collection_finalize(tmp_scp); 79 80 return NULL; 80 81 } 81 82 82 tmp_scp->array_max = POLLFD_ARRAY_START; 83 tmp_scp->array_max = POLLFD_ARRAY_START; 83 84 tmp_scp->array_count = 0; 84 85 INIT_QLIST_HEAD(&tmp_scp->remove_queue); … … 95 96 96 97 /* Add the pipe_fd[0] fd to the poll in set always */ 98 /* -- must be handled separately on Windows 97 99 tmp_scp->pollfd_array[tmp_scp->array_count].fd = tmp_scp->pipe_fd[0]; 98 100 tmp_scp->pollfd_array[tmp_scp->array_count].events = POLLIN; 99 101 tmp_scp->addr_array[tmp_scp->array_count] = NULL; 100 tmp_scp->array_count++; 102 tmp_scp->array_count++; 103 */ 101 104 102 105 return (tmp_scp); … … 155 158 void BMI_socket_collection_finalize(socket_collection_p scp) 156 159 { 160 free(scp->addr_array); 157 161 free(scp->pollfd_array); 158 free(scp->addr_array);159 162 free(scp); 160 163 return; … … 182 185 struct tcp_addr* tcp_addr_data = NULL; 183 186 struct tcp_addr* shifted_tcp_addr_data = NULL; 184 struct pollfd* tmp_pollfd_array = NULL;187 WSAPOLLFD* tmp_pollfd_array = NULL; 185 188 bmi_method_addr_p* tmp_addr_array = NULL; 186 189 int ret = -1; … … 247 250 { 248 251 /* we must enlarge the poll arrays */ 249 tmp_pollfd_array = ( struct pollfd*)malloc(250 (scp->array_max+POLLFD_ARRAY_INC)*sizeof( struct pollfd));252 tmp_pollfd_array = (WSAPOLLFD*)malloc( 253 (scp->array_max+POLLFD_ARRAY_INC)*sizeof(WSAPOLLFD)); 251 254 /* TODO: handle this */ 252 255 assert(tmp_pollfd_array); … … 256 259 assert(tmp_addr_array); 257 260 memcpy(tmp_pollfd_array, scp->pollfd_array, 258 scp->array_max*sizeof( struct pollfd));261 scp->array_max*sizeof(WSAPOLLFD)); 259 262 free(scp->pollfd_array); 260 263 scp->pollfd_array = tmp_pollfd_array; … … 281 284 do 282 285 { 283 ret = poll(scp->pollfd_array, scp->array_count, allowed_poll_time); 284 } while(ret < 0 && errno == EINTR); 285 old_errno = errno; 286 DWORD bytes; 287 288 /* poll for 1ms */ 289 ret = WSAPoll(scp->pollfd_array, scp->array_count, 1); 290 old_errno = WSAGetLastError(); 291 allowed_poll_time--; 292 293 if (ret == 0) 294 { 295 /* check our pipe */ 296 if (PeekNamedPipe(scp->pipe_fd[0], NULL, 0, NULL, &bytes, NULL)) 297 { 298 if (bytes) 299 { 300 pipe_notify = 1; 301 } 302 } 303 else 304 { 305 ret = -1; 306 } 307 } 308 } while(ret == 0 && !pipe_notify && allowed_poll_time > 0); 286 309 287 310 if(ret < 0) … … 296 319 } 297 320 321 if (pipe_notify) 322 { 323 char c; 324 DWORD count; 325 /* drain the pipe */ 326 ReadFile(scp->pipe_fd[0], &c, 1, &count, NULL); 327 } 328 298 329 tmp_count = ret; 299 330 … … 306 337 } 307 338 /* make sure we dont return the pipe fd as being ready */ 308 if (scp->pollfd_array[i].fd == scp->pipe_fd[0])339 /* if (scp->pollfd_array[i].fd == scp->pipe_fd[0]) 309 340 { 310 341 if (scp->pollfd_array[i].revents) { 311 342 char c; 312 343 /* drain the pipe */ 313 read(scp->pipe_fd[0], &c, 1);344 /* _read(scp->pipe_fd[0], &c, 1); 314 345 pipe_notify = 1; 315 346 } 316 347 continue; 317 } 348 } */ 318 349 /* anything ready on this socket? */ 319 350 if (scp->pollfd_array[i].revents) -
branches/windows-client/src/io/bmi/bmi_wintcp/socket-collection.h
r8550 r8560 27 27 struct socket_collection 28 28 { 29 struct pollfd* pollfd_array; 29 /*struct pollfd* pollfd_array;*/ 30 WSAPOLLFD *pollfd_array; 30 31 bmi_method_addr_p* addr_array; 31 32 int array_max; … … 37 38 38 39 int server_socket; 39 intpipe_fd[2];40 HANDLE pipe_fd[2]; 40 41 }; 41 42 typedef struct socket_collection* socket_collection_p; … … 61 62 if(tcp_data->socket > -1){ \ 62 63 char c; \ 64 DWORD count; \ 63 65 gen_mutex_lock(&((s)->queue_mutex)); \ 64 66 BMI_socket_collection_queue(s, m, &((s)->add_queue)); \ 65 67 gen_mutex_unlock(&((s)->queue_mutex)); \ 66 write(s->pipe_fd[1], &c, 1);\68 WriteFile(s->pipe_fd[1], &c, 1, &count, NULL);\ 67 69 } \ 68 70 } while(0) … … 70 72 #define BMI_socket_collection_remove(s, m) \ 71 73 do { \ 72 char c;\ 74 char c; \ 75 DWORD count; \ 73 76 gen_mutex_lock(&((s)->queue_mutex)); \ 74 77 BMI_socket_collection_queue(s, m, &((s)->remove_queue)); \ 75 78 gen_mutex_unlock(&((s)->queue_mutex)); \ 76 write(s->pipe_fd[1], &c, 1);\79 WriteFile(s->pipe_fd[1], &c, 1, &count, NULL);\ 77 80 } while(0) 78 81 … … 81 84 do { \ 82 85 char c;\ 86 DWORD count; \ 83 87 struct tcp_addr* tcp_data = (struct tcp_addr *) (m)->method_data; \ 84 88 assert(tcp_data->socket > -1); \ … … 87 91 BMI_socket_collection_queue((s),(m), &((s)->add_queue)); \ 88 92 gen_mutex_unlock(&((s)->queue_mutex)); \ 89 _write(s->pipe_fd[1], &c, 1);\93 WriteFile(s->pipe_fd[1], &c, 1, &count, NULL);\ 90 94 } while(0) 91 95 … … 93 97 do { \ 94 98 char c;\ 99 DWORD count; \ 95 100 struct tcp_addr* tcp_data = (struct tcp_addr *) (m)->method_data; \ 96 101 gen_mutex_lock(&((s)->queue_mutex)); \ … … 99 104 BMI_socket_collection_queue((s),(m), &((s)->add_queue)); \ 100 105 gen_mutex_unlock(&((s)->queue_mutex)); \ 101 _write(s->pipe_fd[1], &c, 1);\106 WriteFile(s->pipe_fd[1], &c, 1, &count, NULL);\ 102 107 } while(0) 103 108
