Overview
Comment: | Check whether getaddrinfo is thread-safe and use locks if not. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
c8398d985d3f9788161425a6ecca1f79 |
User & Date: | js on 2009-12-09 19:09:41 |
Other Links: | manifest | tags |
Context
2009-12-11
| ||
12:52 | Make it possible to build ObjFW without support for threads. check-in: 6caac0826e user: js tags: trunk | |
2009-12-09
| ||
19:09 | Check whether getaddrinfo is thread-safe and use locks if not. check-in: c8398d985d user: js tags: trunk | |
18:43 | Indent defines and imports where it is useful. check-in: 66f6ca045c user: js tags: trunk | |
Changes
Modified configure.ac from [05facc1731] to [e854e5bdb3].
︙ | ︙ | |||
103 104 105 106 107 108 109 | { return (snprintf(NULL, 0, "asd") == 3 ? 0 : 1); }], ac_cv_snprintf_useful_ret="yes", ac_cv_snprintf_useful_ret="no", ac_cv_snprintf_useful_ret="no")]) AC_MSG_RESULT($ac_cv_snprintf_useful_ret)]) | < | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | { return (snprintf(NULL, 0, "asd") == 3 ? 0 : 1); }], ac_cv_snprintf_useful_ret="yes", ac_cv_snprintf_useful_ret="no", ac_cv_snprintf_useful_ret="no")]) AC_MSG_RESULT($ac_cv_snprintf_useful_ret)]) test x"$have_asprintf" != x"yes" -a x"$ac_cv_snprintf_useful_ret" != x"yes" && \ AC_MSG_ERROR(No asprintf and no snprintf returning required space!) AC_CHECK_LIB(dl, dlopen, LIBS="$LIBS -ldl") case "$host" in *-*-mingw*) |
︙ | ︙ | |||
139 140 141 142 143 144 145 | #include <netdb.h> #else #define _WIN32_WINNT 0x0501 #include <ws2tcpip.h> #endif], [ struct addrinfo ai; getaddrinfo(NULL, NULL, NULL, NULL); | | | < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | #include <netdb.h> #else #define _WIN32_WINNT 0x0501 #include <ws2tcpip.h> #endif], [ struct addrinfo ai; getaddrinfo(NULL, NULL, NULL, NULL); ], [ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_GETADDRINFO, 1, [Whether we have getaddrinfo]) AC_MSG_CHECKING(whether getaddrinfo is thread-safe) case "$host_os" in darwin[[12345]].*) have_threadsafe_getaddrinfo="no" ;; darwin*) have_threadsafe_getaddrinfo="yes" ;; freebsd[[1234]].* | freebsd5.[[1234]]*) have_threadsafe_getaddrinfo="no" ;; freebsd*) have_threadsafe_getaddrinfo="yes" ;; netbsd[[123]].*) have_threadsafe_getaddrinfo="no" ;; netbsd*) have_threadsafe_getaddrinfo="yes" ;; solaris*) have_threadsafe_getaddrinfo="yes" ;; *) have_threadsafe_getaddrinfo="unknown" ;; esac if test x"$have_threadsafe_getaddrinfo" = x"unknown"; then AC_EGREP_CPP(yes, [ #include <netdb.h> #ifdef h_errno yes #end ], [have_threadsafe_getaddrinfo="yes"], [have_threadsafe_getaddrinfo="no"]) fi test x"$have_threadsafe_getaddrinfo" = x"yes" && \ AC_DEFINE(HAVE_THREADSAFE_GETADDRINFO, 1, [Whether getaddrinfo is thread-safe]) AC_MSG_RESULT($have_threadsafe_getaddrinfo) ], [ AC_MSG_RESULT(no)]) AC_CHECK_FUNC(madvise, [AC_DEFINE(HAVE_MADVISE, 1, [Whether we have madvise])]) if test x"$GOBJC" = x"yes"; then OBJCFLAGS="$OBJCFLAGS -Werror" AC_MSG_CHECKING(whether gcc has bug objc/27438) |
︙ | ︙ |
Modified m4/buildsys.m4 from [0c1eb88949] to [8507639fdf].
︙ | ︙ | |||
28 29 30 31 32 33 34 | [BUILDSYS_STATIC_LIB_ONLY], [BUILDSYS_SHARED_LIB]) ]) AC_DEFUN([BUILDSYS_PROG_IMPLIB], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_MSG_CHECKING(whether we need an implib) | | | | | | | | | | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | [BUILDSYS_STATIC_LIB_ONLY], [BUILDSYS_SHARED_LIB]) ]) AC_DEFUN([BUILDSYS_PROG_IMPLIB], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_MSG_CHECKING(whether we need an implib) case "$host_os" in cygwin* | mingw*) AC_MSG_RESULT(yes) PROG_IMPLIB_NEEDED='yes' PROG_IMPLIB_LDFLAGS='-Wl,-export-all-symbols,--out-implib,lib${PROG}.a' ;; *) AC_MSG_RESULT(no) PROG_IMPLIB_NEEDED='no' PROG_IMPLIB_LDFLAGS='' ;; esac AC_SUBST(PROG_IMPLIB_NEEDED) AC_SUBST(PROG_IMPLIB_LDFLAGS) ]) AC_DEFUN([BUILDSYS_SHARED_LIB], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_MSG_CHECKING(for shared library system) case "$host_os" in darwin*) AC_MSG_RESULT(Darwin) LIB_CPPFLAGS='-DPIC' LIB_CFLAGS='-fPIC' LIB_LDFLAGS='-dynamiclib -flat_namespace' LIB_PREFIX='lib' LIB_SUFFIX='.dylib' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' PLUGIN_CPPFLAGS='-DPIC' PLUGIN_CFLAGS='-fPIC' PLUGIN_LDFLAGS='-bundle -flat_namespace -undefined suppress' PLUGIN_SUFFIX='.impl' INSTALL_LIB='${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i' UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib' CLEAN_LIB='' ;; solaris*) AC_MSG_RESULT(Solaris) LIB_CPPFLAGS='-DPIC' LIB_CFLAGS='-fPIC' LIB_LDFLAGS='-shared -fPIC -Wl,-soname=${LIB}.${LIB_MAJOR}.${LIB_MINOR}' LIB_PREFIX='lib' LIB_SUFFIX='.so' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' PLUGIN_CPPFLAGS='-DPIC' PLUGIN_CFLAGS='-fPIC' PLUGIN_LDFLAGS='-shared -fPIC' PLUGIN_SUFFIX='.so' INSTALL_LIB='${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR} && rm -f ${DESTDIR}${libdir}/$$i && ${LN_S} $$i.${LIB_MAJOR}.${LIB_MINOR} ${DESTDIR}${libdir}/$$i' UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}' CLEAN_LIB='' ;; openbsd* | mirbsd*) AC_MSG_RESULT(OpenBSD) LIB_CPPFLAGS='-DPIC' LIB_CFLAGS='-fPIC' LIB_LDFLAGS='-shared -fPIC' LIB_PREFIX='lib' LIB_SUFFIX='.so.${LIB_MAJOR}.${LIB_MINOR}' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' PLUGIN_CPPFLAGS='-DPIC' PLUGIN_CFLAGS='-fPIC' PLUGIN_LDFLAGS='-shared -fPIC' PLUGIN_SUFFIX='.so' INSTALL_LIB='${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i' UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i' CLEAN_LIB='' ;; cygwin* | mingw*) AC_MSG_RESULT(Win32) LIB_CPPFLAGS='-DPIC' LIB_CFLAGS='' LIB_LDFLAGS='-shared -Wl,--out-implib,${LIB}.a' LIB_PREFIX='lib' LIB_SUFFIX='.dll' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' |
︙ | ︙ |
Modified src/OFTCPSocket.m from [4bb7848f0c] to [f13b976cd7].
︙ | ︙ | |||
25 26 27 28 29 30 31 | #import "OFTCPSocket.h" #import "OFExceptions.h" #ifndef INVALID_SOCKET #define INVALID_SOCKET -1 #endif | | | > > > > > > > > | > > > > > > > > | 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #import "OFTCPSocket.h" #import "OFExceptions.h" #ifndef INVALID_SOCKET #define INVALID_SOCKET -1 #endif #if !defined(HAVE_GETADDRINFO) || !defined(HAVE_THREADSAFE_GETADDRINFO) #import "OFThread.h" static OFMutex *mutex = nil; #endif @implementation OFTCPSocket #if !defined(HAVE_GETADDRINFO) || !defined(HAVE_THREADSAFE_GETADDRINFO) + (void)initialize { if (self == [OFTCPSocket class]) mutex = [[OFMutex alloc] init]; } #endif - (void)dealloc { if (sock != INVALID_SOCKET) close(sock); [super dealloc]; } /* * FIXME: Maybe we could copy the result of the name lookup and release the * lock so that we don't keep the lock during connection attemps. */ - connectToService: (OFString*)service onNode: (OFString*)node { if (sock != INVALID_SOCKET) @throw [OFAlreadyConnectedException newWithClass: isa]; #ifdef HAVE_GETADDRINFO struct addrinfo hints, *res, *res0; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; #ifndef HAVE_THREADSAFE_GETADDRINFO [mutex lock]; #endif if (getaddrinfo([node cString], [service cString], &hints, &res0)) { #ifndef HAVE_THREADSAFE_GETADDRINFO [mutex unlock]; #endif @throw [OFAddressTranslationFailedException newWithClass: isa node: node service: service]; } for (res = res0; res != NULL; res = res->ai_next) { if ((sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == INVALID_SOCKET) continue; if (connect(sock, res->ai_addr, res->ai_addrlen) == -1) { close(sock); sock = INVALID_SOCKET; continue; } break; } freeaddrinfo(res0); #ifndef HAVE_THREADSAFE_GETADDRINFO [mutex unlock]; #endif #else BOOL connected = NO; struct hostent *he; struct servent *se; struct sockaddr_in addr; uint16_t port; char **ip; |
︙ | ︙ |