diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # CHANGELOG for network
 
+## Version 3.2.11.0
+
+* Add unsafeClose
+  [#629](https://github.com/haskell/network/pull/629)
+
 ## Version 3.2.10.0
 
 * Multicast support
diff --git a/Network/Socket.hs b/Network/Socket.hs
--- a/Network/Socket.hs
+++ b/Network/Socket.hs
@@ -129,6 +129,7 @@
     -- ** Closing
     close,
     close',
+    unsafeClose,
     gracefulClose,
     shutdown,
     ShutdownCmd (..),
diff --git a/Network/Socket/ByteString/IO.hsc b/Network/Socket/ByteString/IO.hsc
--- a/Network/Socket/ByteString/IO.hsc
+++ b/Network/Socket/ByteString/IO.hsc
@@ -47,7 +47,7 @@
 import Data.ByteString.Unsafe (unsafeUseAsCStringLen)
 import Foreign.Marshal.Alloc (allocaBytes)
 
-import Control.Concurrent.STM (STM, atomically, orElse)
+import Control.Concurrent.STM (STM)
 
 import Network.Socket.Buffer
 import Network.Socket.ByteString.Internal
diff --git a/Network/Socket/Types.hsc b/Network/Socket/Types.hsc
--- a/Network/Socket/Types.hsc
+++ b/Network/Socket/Types.hsc
@@ -23,6 +23,7 @@
     , invalidateSocket
     , close
     , close'
+    , unsafeClose
     , c_close
     -- * Types of socket
     , SocketType(GeneralSocketType, UnsupportedSocketType, NoSocketType
@@ -273,6 +274,23 @@
     closeFd fd = do
         ret <- c_close $ fromIntegral fd
         when (ret == -1) $ throwErrno "Network.Socket.close'"
+
+-- | Closing a socket which no thread is waiting on, with @close(2)@
+--   itself.  Exceptions are not thrown, as in 'close'.
+--
+--   'close' goes through the IO manager so that a thread waiting on the
+--   socket is told.  On a threaded POSIX RTS that takes a lock on every
+--   capability, and does nothing at all when there is no such thread.
+--   This skips it, and is for a caller which knows there is none.  Where
+--   one might be, the warning on 'unsafeFdSocket' applies in full.
+--
+--   There is nothing to skip on Windows, where the IO manager is not in
+--   the way of a close, and this is 'close'.
+--
+--   @since 3.2.11.0
+unsafeClose :: Socket -> IO ()
+unsafeClose s = invalidateSocket s (\_ -> return ()) $ \oldfd ->
+    void $ c_close oldfd
 
 #if defined(mingw32_HOST_OS)
 foreign import CALLCONV unsafe "closesocket"
diff --git a/configure b/configure
--- a/configure
+++ b/configure
@@ -685,8 +685,6 @@
 ac_user_opts='
 enable_option_checking
 with_cc
-with_compiler
-with_hc
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1318,7 +1316,6 @@
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
 C compiler
-Haskell compiler
 
 Some influential environment variables:
   CC          C compiler command
@@ -3928,25 +3925,6 @@
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-
-
-# Check whether --with-compiler was given.
-if test ${with_compiler+y}
-then :
-  withval=$with_compiler; HC=$withval
-fi
-
-
-# Check whether --with-hc was given.
-if test ${with_hc+y}
-then :
-  withval=$with_hc; HC=$withval
-fi
-
-if test -z "$HC"
-then :
-  HC=ghc
-fi
 
 
 { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
diff --git a/network.cabal b/network.cabal
--- a/network.cabal
+++ b/network.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.18
 name:               network
-version:            3.2.10.0
+version:            3.2.11.0
 license:            BSD3
 license-file:       LICENSE
 maintainer:         Kazu Yamamoto, Tamar Christina
