Add option for spinning or blocking.
diff --git a/asio/src/tests/latency/tcp_client.cpp b/asio/src/tests/latency/tcp_client.cpp
index 03fabac..f18c768 100644
--- a/asio/src/tests/latency/tcp_client.cpp
+++ b/asio/src/tests/latency/tcp_client.cpp
@@ -14,6 +14,8 @@
 #include <boost/date_time/posix_time/posix_time_types.hpp>
 #include <boost/shared_ptr.hpp>
 #include <cstdio>
+#include <cstdlib>
+#include <cstring>
 #include <vector>
 #include "high_res_clock.hpp"
 
@@ -34,32 +36,43 @@
 
 int main(int argc, char* argv[])
 {
-  if (argc != 5)
+  if (argc != 6)
   {
-    std::fprintf(stderr, "Usage: tcp_client <ip> <port> <nconns> <bufsize>\n");
+    std::fprintf(stderr,
+        "Usage: tcp_client <ip> <port> "
+        "<nconns> <bufsize> {spin|block}\n");
     return 1;
   }
 
+  const char* ip = argv[1];
+  unsigned short port = static_cast<unsigned short>(std::atoi(argv[2]));
+  int num_connections = std::atoi(argv[3]);
+  std::size_t buf_size = static_cast<std::size_t>(std::atoi(argv[4]));
+  bool spin = (std::strcmp(argv[5], "spin") == 0);
+
   asio::io_service io_service;
   std::vector<boost::shared_ptr<tcp::socket> > sockets;
 
-  const char* ip = argv[1];
-  unsigned short port = static_cast<unsigned short>(std::atoi(argv[2]));
-  tcp::endpoint target(asio::ip::address::from_string(ip), port);
-
-  int num_connections = std::atoi(argv[3]);
   for (int i = 0; i < num_connections; ++i)
   {
     boost::shared_ptr<tcp::socket> s(new tcp::socket(io_service));
+
+    tcp::endpoint target(asio::ip::address::from_string(ip), port);
     s->connect(target);
+
     s->set_option(tcp::no_delay(true));
-    tcp::socket::non_blocking_io nbio(true);
-    s->io_control(nbio);
+
+    if (spin)
+    {
+      tcp::socket::non_blocking_io nbio(true);
+      s->io_control(nbio);
+    }
+
     sockets.push_back(s);
   }
 
-  std::vector<unsigned char> write_buf(std::atoi(argv[4]));
-  std::vector<unsigned char> read_buf(std::atoi(argv[4]));
+  std::vector<unsigned char> write_buf(buf_size);
+  std::vector<unsigned char> read_buf(buf_size);
 
   ptime start = microsec_clock::universal_time();
   boost::uint64_t start_hr = high_res_clock();
diff --git a/asio/src/tests/latency/tcp_server.cpp b/asio/src/tests/latency/tcp_server.cpp
index c97a2f3..18c6e9c 100644
--- a/asio/src/tests/latency/tcp_server.cpp
+++ b/asio/src/tests/latency/tcp_server.cpp
@@ -15,6 +15,7 @@
 #include <boost/shared_ptr.hpp>
 #include <cstdio>
 #include <cstdlib>
+#include <cstring>
 #include <vector>
 
 using asio::ip::tcp;
@@ -24,10 +25,10 @@
 class tcp_server : coroutine
 {
 public:
-  tcp_server(tcp::acceptor& acceptor, std::size_t bufsize) :
+  tcp_server(tcp::acceptor& acceptor, std::size_t buf_size) :
     acceptor_(acceptor),
     socket_(acceptor_.get_io_service()),
-    buffer_(bufsize)
+    buffer_(buf_size)
   {
   }
 
@@ -73,25 +74,32 @@
 
 int main(int argc, char* argv[])
 {
-  if (argc != 4)
+  if (argc != 5)
   {
-    std::fprintf(stderr, "Usage: tcp_server <port> <nconns> <bufsize>\n");
+    std::fprintf(stderr,
+        "Usage: tcp_server <port> <nconns> "
+        "<bufsize> {spin|block}\n");
     return 1;
   }
 
-  asio::io_service io_service;
   unsigned short port = static_cast<unsigned short>(std::atoi(argv[1]));
+  int max_connections = std::atoi(argv[2]);
+  std::size_t buf_size = std::atoi(argv[3]);
+  bool spin = (std::strcmp(argv[4], "spin") == 0);
+
+  asio::io_service io_service;
   tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port));
   std::vector<boost::shared_ptr<tcp_server> > servers;
 
-  int max_connections = std::atoi(argv[2]);
-  std::size_t bufsize = std::atoi(argv[3]);
   for (int i = 0; i < max_connections; ++i)
   {
-    boost::shared_ptr<tcp_server> s(new tcp_server(acceptor, bufsize));
+    boost::shared_ptr<tcp_server> s(new tcp_server(acceptor, buf_size));
     servers.push_back(s);
     (*s)(asio::error_code());
   }
 
-  for (;;) io_service.poll();
+  if (spin)
+    for (;;) io_service.poll();
+  else
+    io_service.run();
 }
diff --git a/asio/src/tests/latency/udp_client.cpp b/asio/src/tests/latency/udp_client.cpp
index 6526b12..b5ce8c9 100644
--- a/asio/src/tests/latency/udp_client.cpp
+++ b/asio/src/tests/latency/udp_client.cpp
@@ -12,6 +12,8 @@
 #include <boost/date_time/posix_time/posix_time_types.hpp>
 #include <algorithm>
 #include <cstdio>
+#include <cstdlib>
+#include <cstring>
 #include <vector>
 #include "high_res_clock.hpp"
 
@@ -23,25 +25,34 @@
 
 int main(int argc, char* argv[])
 {
-  if (argc != 5)
+  if (argc != 6)
   {
-    std::fprintf(stderr, "Usage: udp_client <ip> <port1> <nports> <bufsize>\n");
+    std::fprintf(stderr,
+        "Usage: udp_client <ip> <port1> "
+        "<nports> <bufsize> {spin|block}\n");
     return 1;
   }
 
+  const char* ip = argv[1];
+  unsigned short first_port = static_cast<unsigned short>(std::atoi(argv[2]));
+  unsigned short num_ports = static_cast<unsigned short>(std::atoi(argv[3]));
+  std::size_t buf_size = static_cast<std::size_t>(std::atoi(argv[4]));
+  bool spin = (std::strcmp(argv[5], "spin") == 0);
+
   asio::io_service io_service;
 
   udp::socket socket(io_service, udp::endpoint(udp::v4(), 0));
-  udp::socket::non_blocking_io nbio(true);
-  socket.io_control(nbio);
 
-  unsigned short first_port = static_cast<unsigned short>(std::atoi(argv[2]));
-  unsigned short num_ports = static_cast<unsigned short>(std::atoi(argv[3]));
+  if (spin)
+  {
+    udp::socket::non_blocking_io nbio(true);
+    socket.io_control(nbio);
+  }
+
+  udp::endpoint target(asio::ip::address::from_string(ip), first_port);
   unsigned short last_port = first_port + num_ports - 1;
-  udp::endpoint target(asio::ip::address::from_string(argv[1]), first_port);
-
-  std::vector<unsigned char> write_buf(std::atoi(argv[4]));
-  std::vector<unsigned char> read_buf(std::atoi(argv[4]));
+  std::vector<unsigned char> write_buf(buf_size);
+  std::vector<unsigned char> read_buf(buf_size);
 
   ptime start = microsec_clock::universal_time();
   boost::uint64_t start_hr = high_res_clock();
diff --git a/asio/src/tests/latency/udp_server.cpp b/asio/src/tests/latency/udp_server.cpp
index 8d234c0..2a4dc18 100644
--- a/asio/src/tests/latency/udp_server.cpp
+++ b/asio/src/tests/latency/udp_server.cpp
@@ -13,6 +13,7 @@
 #include <boost/shared_ptr.hpp>
 #include <cstdio>
 #include <cstdlib>
+#include <cstring>
 #include <vector>
 
 using asio::ip::udp;
@@ -23,9 +24,9 @@
 {
 public:
   udp_server(asio::io_service& io_service,
-      unsigned short port, std::size_t bufsize) :
+      unsigned short port, std::size_t buf_size) :
     socket_(io_service, udp::endpoint(udp::v4(), port)),
-    buffer_(bufsize)
+    buffer_(buf_size)
   {
   }
 
@@ -62,25 +63,32 @@
 
 int main(int argc, char* argv[])
 {
-  if (argc != 4)
+  if (argc != 5)
   {
-    std::fprintf(stderr, "Usage: udp_server <port1> <nports> <bufsize>\n");
+    std::fprintf(stderr,
+        "Usage: udp_server <port1> <nports> "
+        "<bufsize> {spin|block}\n");
     return 1;
   }
 
+  unsigned short first_port = static_cast<unsigned short>(std::atoi(argv[1]));
+  unsigned short num_ports = static_cast<unsigned short>(std::atoi(argv[2]));
+  std::size_t buf_size = std::atoi(argv[3]);
+  bool spin = (std::strcmp(argv[4], "spin") == 0);
+
   asio::io_service io_service;
   std::vector<boost::shared_ptr<udp_server> > servers;
 
-  unsigned short first_port = static_cast<unsigned short>(std::atoi(argv[1]));
-  unsigned short num_ports = static_cast<unsigned short>(std::atoi(argv[3]));
-  std::size_t bufsize = std::atoi(argv[3]);
   for (unsigned short i = 0; i < num_ports; ++i)
   {
     unsigned short port = first_port + i;
-    boost::shared_ptr<udp_server> s(new udp_server(io_service, port, bufsize));
+    boost::shared_ptr<udp_server> s(new udp_server(io_service, port, buf_size));
     servers.push_back(s);
     (*s)(asio::error_code());
   }
 
-  for (;;) io_service.poll();
+  if (spin)
+    for (;;) io_service.poll();
+  else
+    io_service.run();
 }