diff options
author | Alan Antonuk <alan.antonuk@gmail.com> | 2013-06-14 14:50:13 -0700 |
---|---|---|
committer | Alan Antonuk <alan.antonuk@gmail.com> | 2013-06-14 15:52:56 -0700 |
commit | 2308069ccad42b892f10f7cb4d5dd68e890408c8 (patch) | |
tree | 7f463a8abce0dab566dd0c639f9ae074e158210d /librabbitmq | |
parent | c83e7288ce82965a1cd1dc6d80db0486476d5f06 (diff) | |
download | rabbitmq-c-github-ask-2308069ccad42b892f10f7cb4d5dd68e890408c8.tar.gz |
Add amqp_get_monotonic_timestamp() function
Diffstat (limited to 'librabbitmq')
-rw-r--r-- | librabbitmq/CMakeLists.txt | 3 | ||||
-rw-r--r-- | librabbitmq/amqp_timer.c | 94 | ||||
-rw-r--r-- | librabbitmq/amqp_timer.h | 36 |
3 files changed, 132 insertions, 1 deletions
diff --git a/librabbitmq/CMakeLists.txt b/librabbitmq/CMakeLists.txt index f310743..8ab8bff 100644 --- a/librabbitmq/CMakeLists.txt +++ b/librabbitmq/CMakeLists.txt @@ -120,6 +120,7 @@ set(RABBITMQ_SOURCES ${AMQP_FRAMING_C_PATH} amqp_api.c amqp.h amqp_connection.c amqp_mem.c amqp_private.h amqp_socket.c amqp_table.c amqp_url.c amqp_socket.h amqp_tcp_socket.c amqp_tcp_socket.h + amqp_timer.c amqp_timer.h ${AMQP_SSL_SRCS} ) @@ -127,7 +128,7 @@ add_definitions(-DAMQP_BUILD) include(InstallMacros) -set(RMQ_LIBRARIES ${AMQP_SSL_LIBS} ${SOCKET_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) +set(RMQ_LIBRARIES ${AMQP_SSL_LIBS} ${SOCKET_LIBRARIES} ${LIBRT} ${CMAKE_THREAD_LIBS_INIT}) if (BUILD_SHARED_LIBS) add_library(rabbitmq SHARED ${RABBITMQ_SOURCES}) diff --git a/librabbitmq/amqp_timer.c b/librabbitmq/amqp_timer.c new file mode 100644 index 0000000..aa7f6d4 --- /dev/null +++ b/librabbitmq/amqp_timer.c @@ -0,0 +1,94 @@ +/* vim:set ft=c ts=2 sw=2 sts=2 et cindent: */ +/* + * Copyright 2013 Alan Antonuk + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#include "amqp_timer.h" + +#if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) +# define AMQP_WIN_TIMER_API +#elif (defined(machintosh) || defined(__APPLE__) || defined(__APPLE_CC__)) +# define AMQP_MAC_TIMER_API +#else +# define AMQP_POSIX_TIMER_API +#endif + + +#ifdef AMQP_WIN_TIMER_API +#define WIN32_LEAN_AND_MEAN +#include <Windows.h> + +uint64_t +amqp_get_monotonic_timestamp(void) +{ + static uint64_t NS_PER_COUNT = 0; + LARGE_INTEGER perf_count; + + if (0 == NS_PER_COUNT) { + LARGE_INTEGER perf_frequency; + if (!QueryPerformanceFrequency(&perf_frequency)) { + return 0; + } + NS_PER_COUNT = AMQP_NS_PER_S / perf_frequency.QuadPart; + } + + if (!QueryPerformanceCounter(&perf_count)) { + return 0; + } + + return perf_count.QuadPart * NS_PER_COUNT; +} +#endif /* AMQP_WIN_TIMER_API */ + +#ifdef AMQP_MAC_TIMER_API +# include <mach/mach_time.h> + +uint64_t +amqp_get_monotonic_timestamp(void) +{ + static mach_timebase_info_data_t s_timebase = {0, 0}; + uint64_t timestamp; + + timestamp = mach_absolute_time(); + + if (s_timebase.denom == 0) { + mach_timebase_info(&s_timebase); + } + + timestamp = timestamp * s_timebase.numer / s_timebase.denom; + + return timestamp; +} +#endif /* AMQP_MAC_TIMER_API */ + +#ifdef AMQP_POSIX_TIMER_API +#include <time.h> + +uint64_t +amqp_get_monotonic_timestamp(void) +{ + struct timespec tp; + if (-1 == clock_gettime(CLOCK_MONOTONIC, &tp)) { + return 0; + } + + return ((uint64_t)tp.tv_sec * AMQP_NS_PER_S + (uint64_t)tp.tv_nsec); +} +#endif /* AMQP_POSIX_TIMER_API */ diff --git a/librabbitmq/amqp_timer.h b/librabbitmq/amqp_timer.h new file mode 100644 index 0000000..d1718af --- /dev/null +++ b/librabbitmq/amqp_timer.h @@ -0,0 +1,36 @@ +/* vim:set ft=c ts=2 sw=2 sts=2 et cindent: */ +/* + * Copyright 2013 Alan Antonuk + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#ifndef AMQP_TIMER_H +#define AMQP_TIMER_H + +#include <stdint.h> + +#define AMQP_NS_PER_S 1000000000 +#define AMQP_NS_PER_US 1000 + +/* Gets a monotonic timestamp in ns */ +uint64_t +amqp_get_monotonic_timestamp(void); + +#endif /* AMQP_TIMER_H */ + |