diff options
author | Nils Durner <durner@gnunet.org> | 2009-11-09 22:49:03 +0000 |
---|---|---|
committer | Nils Durner <durner@gnunet.org> | 2009-11-09 22:49:03 +0000 |
commit | 006600ece7b3e528f4d78eb6d3ba83b8a6012031 (patch) | |
tree | 4eb6be107eb28e0812b6bf2c8b6f664874112c8f /src/util | |
parent | efa495524a5be052ee67793e4bcf600ba05e149c (diff) | |
download | gnunet-006600ece7b3e528f4d78eb6d3ba83b8a6012031.tar.gz gnunet-006600ece7b3e528f4d78eb6d3ba83b8a6012031.zip |
[W32] don't busy wait if there are no sockets to wait on, activate error check from other platforms
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/network.c | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/src/util/network.c b/src/util/network.c index 361012d77..2707e9432 100644 --- a/src/util/network.c +++ b/src/util/network.c | |||
@@ -802,21 +802,44 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, | |||
802 | const struct GNUNET_TIME_Relative timeout) | 802 | const struct GNUNET_TIME_Relative timeout) |
803 | { | 803 | { |
804 | int nfds; | 804 | int nfds; |
805 | #ifdef MINGW | ||
806 | int handles; | ||
807 | #endif | ||
805 | nfds = 0; | 808 | nfds = 0; |
809 | #ifdef MINGW | ||
810 | handles = 0; | ||
811 | #endif | ||
806 | if (NULL != rfds) | 812 | if (NULL != rfds) |
807 | nfds = rfds->nsds; | 813 | { |
814 | nfds = rfds->nsds; | ||
815 | #ifdef MINGW | ||
816 | handles = GNUNET_CONTAINER_slist_count (rfds->handles); | ||
817 | #endif | ||
818 | } | ||
808 | if (NULL != wfds) | 819 | if (NULL != wfds) |
809 | nfds = GNUNET_MAX (nfds, wfds->nsds); | 820 | { |
821 | nfds = GNUNET_MAX (nfds, wfds->nsds); | ||
822 | #ifdef MINGW | ||
823 | handles += GNUNET_CONTAINER_slist_count (wfds->handles); | ||
824 | #endif | ||
825 | } | ||
810 | if (NULL != efds) | 826 | if (NULL != efds) |
811 | nfds = GNUNET_MAX (nfds, efds->nsds); | 827 | { |
828 | nfds = GNUNET_MAX (nfds, efds->nsds); | ||
829 | #ifdef MINGW | ||
830 | handles += GNUNET_CONTAINER_slist_count (efds->handles); | ||
831 | #endif | ||
832 | } | ||
812 | 833 | ||
813 | #ifndef MINGW | ||
814 | struct timeval tv; | 834 | struct timeval tv; |
815 | tv.tv_sec = timeout.value / GNUNET_TIME_UNIT_SECONDS.value; | 835 | tv.tv_sec = timeout.value / GNUNET_TIME_UNIT_SECONDS.value; |
816 | tv.tv_usec = | 836 | tv.tv_usec = |
817 | 1000 * (timeout.value - (tv.tv_sec * GNUNET_TIME_UNIT_SECONDS.value)); | 837 | 1000 * (timeout.value - (tv.tv_sec * GNUNET_TIME_UNIT_SECONDS.value)); |
818 | if ((nfds == 0) && (timeout.value == GNUNET_TIME_UNIT_FOREVER_REL.value)) | 838 | if ((nfds == 0) && (timeout.value == GNUNET_TIME_UNIT_FOREVER_REL.value) |
819 | 839 | #ifdef MINGW | |
840 | && handles == 0 | ||
841 | #endif | ||
842 | ) | ||
820 | { | 843 | { |
821 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 844 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
822 | _ | 845 | _ |
@@ -824,6 +847,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, | |||
824 | "select"); | 847 | "select"); |
825 | GNUNET_break (0); | 848 | GNUNET_break (0); |
826 | } | 849 | } |
850 | #ifndef MINGW | ||
827 | return select (nfds + 1, | 851 | return select (nfds + 1, |
828 | (rfds != NULL) ? &rfds->sds : NULL, | 852 | (rfds != NULL) ? &rfds->sds : NULL, |
829 | (wfds != NULL) ? &wfds->sds : NULL, | 853 | (wfds != NULL) ? &wfds->sds : NULL, |
@@ -858,17 +882,14 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, | |||
858 | } | 882 | } |
859 | if (rfds) | 883 | if (rfds) |
860 | sock_read = rfds->sds; | 884 | sock_read = rfds->sds; |
861 | |||
862 | else | 885 | else |
863 | FD_ZERO (&sock_read); | 886 | FD_ZERO (&sock_read); |
864 | if (wfds) | 887 | if (wfds) |
865 | sock_write = wfds->sds; | 888 | sock_write = wfds->sds; |
866 | |||
867 | else | 889 | else |
868 | FD_ZERO (&sock_write); | 890 | FD_ZERO (&sock_write); |
869 | if (efds) | 891 | if (efds) |
870 | sock_except = efds->sds; | 892 | sock_except = efds->sds; |
871 | |||
872 | else | 893 | else |
873 | FD_ZERO (&sock_except); | 894 | FD_ZERO (&sock_except); |
874 | 895 | ||
@@ -1020,7 +1041,9 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, | |||
1020 | } | 1041 | } |
1021 | } | 1042 | } |
1022 | } | 1043 | } |
1023 | select_loop_end:; | 1044 | select_loop_end: |
1045 | if (retcode == 0 && nfds == 0) | ||
1046 | Sleep(GNUNET_MIN(100, limit - GetTickCount())); | ||
1024 | } | 1047 | } |
1025 | while (retcode == 0 && (ms_total == INFINITE || GetTickCount () < limit)); | 1048 | while (retcode == 0 && (ms_total == INFINITE || GetTickCount () < limit)); |
1026 | if (retcode != -1) | 1049 | if (retcode != -1) |