summaryrefslogtreecommitdiff
path: root/libs/asio/example/cpp03/timers
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2013-06-25 22:59:01 +0000
committer <>2013-09-27 11:49:28 +0000
commit8c4528713d907ee2cfd3bfcbbad272c749867f84 (patch)
treec09e2ce80f47b90c85cc720f5139089ad9c8cfff /libs/asio/example/cpp03/timers
downloadboost-tarball-baserock/morph.tar.gz
Imported from /home/lorry/working-area/delta_boost-tarball/boost_1_54_0.tar.bz2.boost_1_54_0baserock/morph
Diffstat (limited to 'libs/asio/example/cpp03/timers')
-rw-r--r--libs/asio/example/cpp03/timers/Jamfile38
-rw-r--r--libs/asio/example/cpp03/timers/Jamfile.v251
-rw-r--r--libs/asio/example/cpp03/timers/tick_count_timer.cpp123
-rw-r--r--libs/asio/example/cpp03/timers/time_t_timer.cpp93
4 files changed, 305 insertions, 0 deletions
diff --git a/libs/asio/example/cpp03/timers/Jamfile b/libs/asio/example/cpp03/timers/Jamfile
new file mode 100644
index 000000000..10a2f380e
--- /dev/null
+++ b/libs/asio/example/cpp03/timers/Jamfile
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+#
+# Distributed under the Boost Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#
+
+subproject libs/asio/example/timers ;
+
+project boost : $(BOOST_ROOT) ;
+
+if $(UNIX)
+{
+ switch $(JAMUNAME)
+ {
+ case SunOS* :
+ {
+ SOCKET_LIBS = <find-library>socket <find-library>nsl ;
+ }
+ }
+}
+
+template asio_timers_example
+ : <lib>@boost/libs/thread/build/boost_thread
+ <lib>@boost/libs/system/build/boost_system
+ : <include>$(BOOST_ROOT)
+ <include>../../../..
+ <define>BOOST_ALL_NO_LIB=1
+ <threading>multi
+ <mingw><*><find-library>ws2_32
+ <mingw><*><find-library>mswsock
+ $(SOCKET_LIBS)
+ ;
+
+exe time_t_timer
+ : <template>asio_timers_example
+ time_t_timer.cpp
+ ;
diff --git a/libs/asio/example/cpp03/timers/Jamfile.v2 b/libs/asio/example/cpp03/timers/Jamfile.v2
new file mode 100644
index 000000000..cd04d01ba
--- /dev/null
+++ b/libs/asio/example/cpp03/timers/Jamfile.v2
@@ -0,0 +1,51 @@
+#
+# Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+#
+# Distributed under the Boost Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#
+
+import os ;
+
+if [ os.name ] = SOLARIS
+{
+ lib socket ;
+ lib nsl ;
+}
+else if [ os.name ] = NT
+{
+ lib ws2_32 ;
+ lib mswsock ;
+}
+else if [ os.name ] = HPUX
+{
+ lib ipv6 ;
+}
+
+exe time_t_timer
+ : time_t_timer.cpp
+ /boost/system//boost_system
+ : <define>BOOST_ALL_NO_LIB=1
+ <threading>multi
+ <os>SOLARIS:<library>socket
+ <os>SOLARIS:<library>nsl
+ <os>NT:<define>_WIN32_WINNT=0x0501
+ <os>NT,<toolset>gcc:<library>ws2_32
+ <os>NT,<toolset>gcc:<library>mswsock
+ <os>NT,<toolset>gcc-cygwin:<define>__USE_W32_SOCKETS
+ <os>HPUX,<toolset>gcc:<define>_XOPEN_SOURCE_EXTENDED
+ <os>HPUX:<library>ipv6
+ ;
+
+if [ os.name ] = NT
+{
+ # The tick_count_timer is for Windows only.
+ exe tick_count_timer
+ : tick_count_timer.cpp
+ /boost/system//boost_system
+ : <define>BOOST_ALL_NO_LIB=1
+ <threading>multi
+ <os>NT,<toolset>gcc:<library>ws2_32
+ <os>NT,<toolset>gcc:<library>mswsock
+ ;
+}
diff --git a/libs/asio/example/cpp03/timers/tick_count_timer.cpp b/libs/asio/example/cpp03/timers/tick_count_timer.cpp
new file mode 100644
index 000000000..1cdde08cb
--- /dev/null
+++ b/libs/asio/example/cpp03/timers/tick_count_timer.cpp
@@ -0,0 +1,123 @@
+//
+// tick_count_timer.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#include <boost/asio.hpp>
+#include <ctime>
+#include <iostream>
+
+#if defined(WIN32)
+# include <windows.h>
+#else
+# error This example is for Windows only!
+#endif
+
+struct tick_count_traits
+{
+ // The time type. This type has no constructor that takes a DWORD to ensure
+ // that the timer can only be used with relative times.
+ class time_type
+ {
+ public:
+ time_type() : ticks_(0) {}
+ private:
+ friend struct tick_count_traits;
+ DWORD ticks_;
+ };
+
+ // The duration type. According to the TimeTraits requirements, the duration
+ // must be a signed type. This means we can't handle durations larger than
+ // 2^31.
+ class duration_type
+ {
+ public:
+ duration_type() : ticks_(0) {}
+ duration_type(LONG ticks) : ticks_(ticks) {}
+ private:
+ friend struct tick_count_traits;
+ LONG ticks_;
+ };
+
+ // Get the current time.
+ static time_type now()
+ {
+ time_type result;
+ result.ticks_ = ::GetTickCount();
+ return result;
+ }
+
+ // Add a duration to a time.
+ static time_type add(const time_type& t, const duration_type& d)
+ {
+ time_type result;
+ result.ticks_ = t.ticks_ + d.ticks_;
+ return result;
+ }
+
+ // Subtract one time from another.
+ static duration_type subtract(const time_type& t1, const time_type& t2)
+ {
+ // DWORD tick count values can wrap (see less_than() below). We'll convert
+ // to a duration by taking the absolute difference and adding the sign
+ // based on which is the "lesser" absolute time.
+ return duration_type(less_than(t1, t2)
+ ? -static_cast<LONG>(t2.ticks_ - t1.ticks_)
+ : static_cast<LONG>(t1.ticks_ - t2.ticks_));
+ }
+
+ // Test whether one time is less than another.
+ static bool less_than(const time_type& t1, const time_type& t2)
+ {
+ // DWORD tick count values wrap periodically, so we'll use a heuristic that
+ // says that if subtracting t1 from t2 yields a value smaller than 2^31,
+ // then t1 is probably less than t2. This means that we can't handle
+ // durations larger than 2^31, which shouldn't be a problem in practice.
+ return (t2.ticks_ - t1.ticks_) < static_cast<DWORD>(1 << 31);
+ }
+
+ // Convert to POSIX duration type.
+ static boost::posix_time::time_duration to_posix_duration(
+ const duration_type& d)
+ {
+ return boost::posix_time::milliseconds(d.ticks_);
+ }
+};
+
+typedef boost::asio::basic_deadline_timer<
+ DWORD, tick_count_traits> tick_count_timer;
+
+void handle_timeout(const boost::system::error_code&)
+{
+ std::cout << "handle_timeout\n";
+}
+
+int main()
+{
+ try
+ {
+ boost::asio::io_service io_service;
+
+ tick_count_timer timer(io_service, 5000);
+ std::cout << "Starting synchronous wait\n";
+ timer.wait();
+ std::cout << "Finished synchronous wait\n";
+
+ timer.expires_from_now(5000);
+ std::cout << "Starting asynchronous wait\n";
+ timer.async_wait(&handle_timeout);
+ io_service.run();
+ std::cout << "Finished asynchronous wait\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/libs/asio/example/cpp03/timers/time_t_timer.cpp b/libs/asio/example/cpp03/timers/time_t_timer.cpp
new file mode 100644
index 000000000..4e784ba11
--- /dev/null
+++ b/libs/asio/example/cpp03/timers/time_t_timer.cpp
@@ -0,0 +1,93 @@
+//
+// time_t_timer.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#include <boost/asio.hpp>
+#include <ctime>
+#include <iostream>
+
+struct time_t_traits
+{
+ // The time type.
+ typedef std::time_t time_type;
+
+ // The duration type.
+ struct duration_type
+ {
+ duration_type() : value(0) {}
+ duration_type(std::time_t v) : value(v) {}
+ std::time_t value;
+ };
+
+ // Get the current time.
+ static time_type now()
+ {
+ return std::time(0);
+ }
+
+ // Add a duration to a time.
+ static time_type add(const time_type& t, const duration_type& d)
+ {
+ return t + d.value;
+ }
+
+ // Subtract one time from another.
+ static duration_type subtract(const time_type& t1, const time_type& t2)
+ {
+ return duration_type(t1 - t2);
+ }
+
+ // Test whether one time is less than another.
+ static bool less_than(const time_type& t1, const time_type& t2)
+ {
+ return t1 < t2;
+ }
+
+ // Convert to POSIX duration type.
+ static boost::posix_time::time_duration to_posix_duration(
+ const duration_type& d)
+ {
+ return boost::posix_time::seconds(d.value);
+ }
+};
+
+typedef boost::asio::basic_deadline_timer<
+ std::time_t, time_t_traits> time_t_timer;
+
+void handle_timeout(const boost::system::error_code&)
+{
+ std::cout << "handle_timeout\n";
+}
+
+int main()
+{
+ try
+ {
+ boost::asio::io_service io_service;
+
+ time_t_timer timer(io_service);
+
+ timer.expires_from_now(5);
+ std::cout << "Starting synchronous wait\n";
+ timer.wait();
+ std::cout << "Finished synchronous wait\n";
+
+ timer.expires_from_now(5);
+ std::cout << "Starting asynchronous wait\n";
+ timer.async_wait(&handle_timeout);
+ io_service.run();
+ std::cout << "Finished asynchronous wait\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}