diff --git a/Examples/RateStuffer/SConscript b/Examples/RateStuffer/SConscript index dec0b304df688468278fc9a2309740572952e941..8c36a25cc7aa4aa53a47d8a770727bb6277c56eb 100644 --- a/Examples/RateStuffer/SConscript +++ b/Examples/RateStuffer/SConscript @@ -4,7 +4,7 @@ import SENFSCons ########################################################################### SENFSCons.Binary( env, 'ratestuffer', SENFSCons.GlobSources(), - LIBS = [ 'PPI', 'Scheduler', 'Packets', 'Socket', 'Utils' ] ); + LIBS = [ 'PPI', 'Scheduler', 'Packets', 'Socket', 'Scheduler', 'Utils' ] ); SENFSCons.Doxygen(env, extra_sources=[ env.Dia2Png('ratestuffer.dia') diff --git a/Examples/TCPClientServer/SConscript b/Examples/TCPClientServer/SConscript index 5cb8fd5526405cd25cc79e2235629095ce10ba24..aed8d30141738339106d9374533eafd7f607a4b2 100644 --- a/Examples/TCPClientServer/SConscript +++ b/Examples/TCPClientServer/SConscript @@ -4,7 +4,7 @@ import SENFSCons ########################################################################### SENFSCons.Binary(env, 'client', 'client.cc', - LIBS = [ 'Packets', 'Socket', 'Utils' ]); + LIBS = [ 'Packets', 'Socket', 'Scheduler', 'Utils' ]); SENFSCons.Binary(env, 'server', 'server.cc', - LIBS = [ 'Scheduler', 'Packets', 'Socket', 'Utils' ]); + LIBS = [ 'Scheduler', 'Packets', 'Socket', 'Scheduler', 'Utils' ]); diff --git a/Examples/UDPClientServer/SConscript b/Examples/UDPClientServer/SConscript index 5c362d2af142bf4e9258fc0314042b8769522310..8fffdaa70fcd942b4d07cdf088422da50b941be3 100644 --- a/Examples/UDPClientServer/SConscript +++ b/Examples/UDPClientServer/SConscript @@ -4,9 +4,9 @@ import SENFSCons ########################################################################### SENFSCons.Binary(env, 'udpClient', 'udpClient.cc', - LIBS = [ 'Packets', 'Socket', 'Utils' ]); + LIBS = [ 'Packets', 'Socket', 'Scheduler', 'Utils' ]); SENFSCons.Binary(env, 'udpServer', 'udpServer.cc', - LIBS = [ 'Scheduler', 'Packets', 'Socket', 'Utils' ]); + LIBS = [ 'Scheduler', 'Packets', 'Socket', 'Scheduler', 'Utils' ]); SENFSCons.Doxygen(env) diff --git a/Scheduler/Mainpage.dox b/Scheduler/Mainpage.dox index 210335b0a3ed574d4c0fe6401cea6ee65de53fdf..e2d5f5423ef29c0ff489d2a5dcaaec45465ae1d6 100644 --- a/Scheduler/Mainpage.dox +++ b/Scheduler/Mainpage.dox @@ -24,24 +24,20 @@ namespace senf { /** \mainpage The SENF Scheduler Library - The Scheduler library provides a simple yet flexible abstraction - of the standard asynchronous UNIX mainloop utilizing \c select or - \c poll. The Scheduler library is based on the highly efficient - (but linux specific) \c epoll() system call. + The Scheduler library provides a simple yet flexible abstraction of the standard asynchronous + UNIX mainloop utilizing \c select or \c poll. The Scheduler library is based on the highly + efficient (but linux specific) \c epoll() system call. The library provides - \li a central \ref Scheduler singleton and - \li \ref ReadHelper and \ref WriteHelper templates to simplify - common tasks. + \li the ClockService as a reliable high-resolution highly accurate monotonous time source + \li a central \ref Scheduler %singleton and + \li \ref ReadHelper and \ref WriteHelper templates to simplify common tasks. - In it's current incarnation, the library only supports network - file handles (including pipes etc) and simple timers (especially - it does not support asynchronous notification for on-disc file - transfers etc). Additional features will be added: - \li UNIX signal support - \li async IO support for local (disc) file handles - \li multi threading support - \li IPC support for multithreaded applications + The Scheduler supports several types of scheduling activites: + \li Arbitrary file descriptors (however, local disk file-handles are not guaranteed + non-blocking) + \li Timers + \li UNIX Signals */ } diff --git a/Scheduler/SConscript b/Scheduler/SConscript index ef26f802626a0d9f88a4f66615b6295b4e76131b..3b58ec6b74ade0f71564feb6204cad712a81cf85 100644 --- a/Scheduler/SConscript +++ b/Scheduler/SConscript @@ -10,5 +10,5 @@ SENFSCons.StandardTargets(env) SENFSCons.Lib(env, library = 'Scheduler', sources = sources, - LIBS = [ 'Socket', 'Utils' ]) + LIBS = [ 'Utils' ]) SENFSCons.Doxygen(env) diff --git a/Socket/Protocols/DVB/SConscript b/Socket/Protocols/DVB/SConscript index ffad3452fa8b216452dcf62894d82c2365be9872..7bbb5aef86eddaa122764cb5b9226fdf535a6e68 100644 --- a/Socket/Protocols/DVB/SConscript +++ b/Socket/Protocols/DVB/SConscript @@ -13,7 +13,7 @@ sources = SENFSCons.GlobSources() allob = [] allob.extend( - SENFSCons.Objects( env, sources = sources, LIBS = [ 'Socket', 'Utils' ] ) ) + SENFSCons.Objects( env, sources = sources, LIBS = [ 'Socket', 'Scheduler', 'Utils' ] ) ) for sc in glob.glob("*/SConscript"): ob = SConscript(sc) diff --git a/Socket/Protocols/DatagramSocketProtocol.cc b/Socket/Protocols/DatagramSocketProtocol.cc index a0ac8770fd9e1274b58e7dcca07fb9ba15610382..d9ec0b4686245a08ab3d48350d211237308d2db4 100644 --- a/Socket/Protocols/DatagramSocketProtocol.cc +++ b/Socket/Protocols/DatagramSocketProtocol.cc @@ -35,13 +35,13 @@ #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// -prefix_ struct timeval senf::DatagramSocketProtocol::timestamp() +prefix_ senf::ClockService::clock_type senf::DatagramSocketProtocol::timestamp() const { struct timeval tv; if (::ioctl(fd(), SIOCGSTAMP, &tv) < 0) SENF_THROW_SYSTEM_EXCEPTION(""); - return tv; + return ClockService::from_timeval(tv); } ///////////////////////////////cc.e//////////////////////////////////////// diff --git a/Socket/Protocols/DatagramSocketProtocol.hh b/Socket/Protocols/DatagramSocketProtocol.hh index 3bffdf1be699a68036d7c7478f3d9020cf76e1a6..236d8ca4001d43cf00e7e86740f0cb6c1065d7c8 100644 --- a/Socket/Protocols/DatagramSocketProtocol.hh +++ b/Socket/Protocols/DatagramSocketProtocol.hh @@ -29,6 +29,7 @@ // Custom includes #include <sys/time.h> #include "../../Socket/SocketProtocol.hh" +#include "../../Scheduler/ClockService.hh" //#include "DatagramSocketProtocol.mpp" ///////////////////////////////hh.p//////////////////////////////////////// @@ -44,11 +45,16 @@ namespace senf { : public virtual SocketProtocol { public: - struct timeval timestamp() const; ///< Return packet timestamp of last packet + ClockService::clock_type timestamp() const; ///< Return packet timestamp of last packet /**< The returned timestamp represents the time, at which the last network packet passed to the user has been received from the network. This allows precise network timing. + + The returned value can be converted to the + senf::ClockService::clock_type representation using + semf::ClockService::from_timeval(). + \pre The \c SO_TIMESTAMP socket option must not be set on the socket. \returns timestamp when last packet was received */ diff --git a/Socket/Protocols/INet/SConscript b/Socket/Protocols/INet/SConscript index a4700dd338e9624cd1c35656f6c08a66c6813212..733c84028326995b92f818a1456f811e400df8a4 100644 --- a/Socket/Protocols/INet/SConscript +++ b/Socket/Protocols/INet/SConscript @@ -13,7 +13,7 @@ sources = SENFSCons.GlobSources() allob = [] allob.extend( - SENFSCons.Objects( env, sources = sources, LIBS = [ 'Socket', 'Utils' ] ) ) + SENFSCons.Objects( env, sources = sources, LIBS = [ 'Socket', 'Scheduler', 'Utils' ] ) ) for sc in glob.glob("*/SConscript"): ob = SConscript(sc) diff --git a/Socket/Protocols/Raw/SConscript b/Socket/Protocols/Raw/SConscript index 5e099808870afb00dd652665e7aa9b1c5b2abcba..d461a08e895e98d0dadb1487b35b2b723dbb1160 100644 --- a/Socket/Protocols/Raw/SConscript +++ b/Socket/Protocols/Raw/SConscript @@ -13,7 +13,7 @@ sources = SENFSCons.GlobSources() allob = [] allob.extend( - SENFSCons.Objects( env, sources = sources, LIBS = [ 'Socket', 'Utils' ] ) ) + SENFSCons.Objects( env, sources = sources, LIBS = [ 'Socket', 'Scheduler', 'Utils' ] ) ) for sc in glob.glob("*/SConscript"): ob = SConscript(sc) diff --git a/Socket/Protocols/SConscript b/Socket/Protocols/SConscript index 0a99e52b2cf9b9a1647f2e7972b90cd0b9242921..e0e2d490aefb223f3fb7dfc4569e99c7e3e6a4cf 100644 --- a/Socket/Protocols/SConscript +++ b/Socket/Protocols/SConscript @@ -8,7 +8,7 @@ import SENFSCons, glob SENFSCons.StandardTargets(env) sources = SENFSCons.GlobSources() -objects = SENFSCons.Objects( env, sources = sources, LIBS = [ 'Socket', 'Utils' ] ) +objects = SENFSCons.Objects( env, sources = sources, LIBS = [ 'Socket', 'Scheduler', 'Utils' ] ) for sc in glob.glob("*/SConscript"): ob = SConscript(sc) diff --git a/Socket/Protocols/UN/SConscript b/Socket/Protocols/UN/SConscript index 6a163c1e89a8c08d71ef44f0d029878b42313318..b1c332fde0538e3fbb108a5aa1f75de4d1b303bf 100644 --- a/Socket/Protocols/UN/SConscript +++ b/Socket/Protocols/UN/SConscript @@ -13,7 +13,7 @@ sources = SENFSCons.GlobSources() allob = [] allob.extend( - SENFSCons.Objects( env, sources = sources, LIBS = [ 'Socket', 'Utils' ] ) ) + SENFSCons.Objects( env, sources = sources, LIBS = [ 'Socket', 'Scheduler', 'Utils' ] ) ) for sc in glob.glob("*/SConscript"): ob = SConscript(sc) diff --git a/Socket/SConscript b/Socket/SConscript index 31777820c2727d21adc1a9c0ea21c5454fda7cfe..67b1bdc2945a83e0affb9b7c4fb22e97ab728083 100644 --- a/Socket/SConscript +++ b/Socket/SConscript @@ -21,7 +21,7 @@ SENFSCons.Lib(env, library = 'Socket', sources = sources + subob, testSources = testSources, - LIBS = [ 'Utils' ]) + LIBS = [ 'Scheduler', 'Utils' ]) SENFSCons.Doxygen(env, extra_sources = [ env.Dia2Png('SocketLibrary-classes.dia'),