Changeset 16449 in vbox for trunk/src/VBox
- Timestamp:
- Feb 2, 2009 6:03:10 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 42317
- Location:
- trunk/src/VBox/Devices/Network/slirp
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/slirp/slirp.c
r16448 r16449 800 800 /* { */ 801 801 802 #ifdef VBOX_WITH_SLIRP_MT 803 if ( so->so_state & SS_NOFDREF 804 && so->so_deleted == 1) 805 { 806 struct socket *son, *sop = NULL; 807 QSOCKET_LOCK(tcb); 808 if (so->so_next != NULL) 809 { 810 if (so->so_next != &tcb) 811 SOCKET_LOCK(so->so_next); 812 son = so->so_next; 813 } 814 if ( so->so_prev != &tcb 815 && so->so_prev != NULL) 816 { 817 SOCKET_LOCK(so->so_prev); 818 sop = so->so_prev; 819 } 820 QSOCKET_UNLOCK(tcb); 821 remque(pData, so); 822 SOCKET_UNLOCK(so); 823 SOCKET_LOCK_DESTROY(so); 824 RTMemFree(so); 825 so_next = son; 826 if (sop != NULL) 827 SOCKET_UNLOCK(sop); 828 CONTINUE_NO_UNLOCK(tcp); 829 } 830 #endif 802 831 /* 803 832 * FD_ISSET is meaningless on these sockets … … 977 1006 QSOCKET_FOREACH(so, so_next, udp) 978 1007 /* { */ 1008 #ifdef VBOX_WITH_SLIRP_MT 1009 if ( so->so_state & SS_NOFDREF 1010 && so->so_deleted == 1) 1011 { 1012 struct socket *son, *sop = NULL; 1013 QSOCKET_LOCK(udb); 1014 if (so->so_next != NULL) 1015 { 1016 if (so->so_next != &udb) 1017 SOCKET_LOCK(so->so_next); 1018 son = so->so_next; 1019 } 1020 if ( so->so_prev != &udb 1021 && so->so_prev != NULL) 1022 { 1023 SOCKET_LOCK(so->so_prev); 1024 sop = so->so_prev; 1025 } 1026 QSOCKET_UNLOCK(udb); 1027 remque(pData, so); 1028 SOCKET_UNLOCK(so); 1029 SOCKET_LOCK_DESTROY(so); 1030 RTMemFree(so); 1031 so_next = son; 1032 if (sop != NULL) 1033 SOCKET_UNLOCK(sop); 1034 CONTINUE_NO_UNLOCK(udp); 1035 } 1036 #endif 979 1037 POLL_UDP_EVENTS(rc, error, so, &NetworkEvents); 980 1038 -
trunk/src/VBox/Devices/Network/slirp/socket.c
r16448 r16449 87 87 if (so->so_m != NULL) 88 88 m_free(pData, so->so_m); 89 #ifndef VBOX_WITH_SLIRP_MT 89 90 if(so->so_next && so->so_prev) 90 91 remque(pData, so); /* crashes if so is not in a queue */ 91 92 so->so_state = SS_NOFDREF; /* for debugging purposes */ 92 SOCKET_UNLOCK(so);93 SOCKET_LOCK_DESTROY(so);94 93 95 94 RTMemFree(so); 95 #else 96 so->so_deleted = 1; 97 #endif 96 98 } 97 99 -
trunk/src/VBox/Devices/Network/slirp/socket.h
r16445 r16449 69 69 #ifdef VBOX_WITH_SLIRP_MT 70 70 RTCRITSECT so_mutex; 71 int so_deleted; 71 72 #endif 72 73 }; -
trunk/src/VBox/Devices/Network/slirp/tcp_input.c
r16448 r16449 423 423 && so->so_laddr.s_addr == ti->ti_src.s_addr 424 424 && so->so_faddr.s_addr == ti->ti_dst.s_addr 425 && so->so_fport == ti->ti_dport) 425 && so->so_fport == ti->ti_dport 426 && so->so_deleted != 1) 426 427 { 427 428 Log2(("lock: %s:%d We found socket %R[natsock]\n", __FUNCTION__, __LINE__, so)); … … 1654 1655 m_free(pData, m); 1655 1656 1656 #ifdef VBOX_WITH_SLIRP_MT1657 /*socket should be killed atm*/1658 AssertRelease(!RTCritSectIsInitialized(&so->so_mutex));1659 #endif1660 1657 return; 1661 1658 } -
trunk/src/VBox/Devices/Network/slirp/tcp_subr.c
r16448 r16449 287 287 sbfree(&so->so_rcv); 288 288 sbfree(&so->so_snd); 289 QSOCKET_LOCK(tcb);290 if ( so->so_next != &tcb291 && so->so_next != NULL)292 {293 SOCKET_LOCK(so->so_next);294 so_next = so->so_next;295 }296 if ( so->so_prev != &tcb297 && so->so_prev != NULL)298 {299 SOCKET_LOCK(so->so_prev);300 so_prev = so->so_prev;301 }302 QSOCKET_UNLOCK(tcb);303 289 sofree(pData, so); 304 if (so_next != NULL) SOCKET_UNLOCK(so_next); 305 if (so_prev != NULL) SOCKET_UNLOCK(so_prev); 290 SOCKET_UNLOCK(so); 306 291 tcpstat.tcps_closed++; 307 292 return ((struct tcpcb *)0); -
trunk/src/VBox/Devices/Network/slirp/udp.c
r16448 r16449 400 400 udp_detach(PNATState pData, struct socket *so) 401 401 { 402 struct socket *so_next, *so_prev;403 so_next = so_prev = NULL;404 402 if (so != &pData->icmp_socket) 405 403 { 406 404 QSOCKET_LOCK(udb); 407 405 SOCKET_LOCK(so); 408 if ( so->so_next != &udb409 && so->so_next != NULL)410 {411 SOCKET_LOCK(so->so_next);412 so_next = so->so_next;413 }414 if ( so->so_prev != &udb415 && so->so_prev != NULL)416 {417 SOCKET_LOCK(so->so_prev);418 so_prev = so->so_prev;419 }420 406 QSOCKET_UNLOCK(udb); 421 407 closesocket(so->s); 422 408 sofree(pData, so); 423 if(so_prev != NULL) 424 SOCKET_UNLOCK(so_prev); 425 if(so_next != NULL) 426 SOCKET_UNLOCK(so_next); 409 SOCKET_UNLOCK(so); 427 410 } 428 411 }
Note:
See TracChangeset
for help on using the changeset viewer.