aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorNils Durner <durner@gnunet.org>2009-11-09 22:49:03 +0000
committerNils Durner <durner@gnunet.org>2009-11-09 22:49:03 +0000
commit006600ece7b3e528f4d78eb6d3ba83b8a6012031 (patch)
tree4eb6be107eb28e0812b6bf2c8b6f664874112c8f /src/util
parentefa495524a5be052ee67793e4bcf600ba05e149c (diff)
downloadgnunet-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.c43
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)