Support building on macOS. This change allows all the C++ targets to be built on OS X. (Tested with 10.12.1) Thanks to Ben Laurie for the change. Change-Id: I1bb6cfbe920aef2eaea7e3f7ef7c669d1218275a
diff --git a/BUILDING.md b/BUILDING.md index b633f73..adcab35 100644 --- a/BUILDING.md +++ b/BUILDING.md
@@ -2,7 +2,7 @@ ## C++ -The Roughtime C++ code is built using [Bazel](https://www.bazel.io/). Everything should build on Linux. On MacOS, `simple_client` should build. +The Roughtime C++ code is built using [Bazel](https://www.bazel.io/). Everything should build on Linux and macOS, `simple_client` should build. In order to build, install Bazel and run `bazel build ... && bazel test ...`. That should download and build BoringSSL, gTest and Protocol Buffers automatically.
diff --git a/sys_time.cc b/sys_time.cc index 5fa9532..c0b86df 100644 --- a/sys_time.cc +++ b/sys_time.cc
@@ -14,16 +14,33 @@ #include "sys_time.h" +#if defined(__MACH__) +#include <sys/time.h> +#else #include <time.h> +#endif #include <google/protobuf/stubs/logging.h> namespace roughtime { +static const uint32_t kOneSecondRadius = 1000000; + SystemTimeSource::SystemTimeSource() {} SystemTimeSource::~SystemTimeSource() {} +#if defined(__MACH__) +std::pair<rough_time_t, uint32_t> SystemTimeSource::Now() { + struct timeval tv; + GOOGLE_CHECK_EQ(0, gettimeofday(&tv, nullptr)); + uint64_t now = tv.tv_sec; + now *= 1000000; + now += tv.tv_usec; + + return std::make_pair(now, kOneSecondRadius); +} +#else std::pair<rough_time_t, uint32_t> SystemTimeSource::Now() { struct timespec ts; GOOGLE_CHECK_EQ(0, clock_gettime(CLOCK_REALTIME_COARSE, &ts)); @@ -31,7 +48,8 @@ now *= 1000000; now += ts.tv_nsec / 1000; - return std::make_pair(now, 1000000); + return std::make_pair(now, kOneSecondRadius); } +#endif } // namespace roughtime
diff --git a/udp_processor.cc b/udp_processor.cc index 6d8cbb4..9266193 100644 --- a/udp_processor.cc +++ b/udp_processor.cc
@@ -110,6 +110,32 @@ } } +#if defined(__MACH__) +static const unsigned MSG_WAITFORONE = 0; + +static int recvmmsg(int fd, struct mmsghdr *msgvec, unsigned vlen, + unsigned flags, struct timespec *timeout) { + ssize_t r = recvmsg(fd, &msgvec->msg_hdr, 0); + if (r < 0) { + return r; + } + + msgvec->msg_len = r; + return 1; +} + +int sendmmsg(int fd, struct mmsghdr *msgvec, unsigned vlen, unsigned flags) { + GOOGLE_CHECK_EQ(1, vlen); + ssize_t r = sendmsg(fd, &msgvec->msg_hdr, 0); + if (r < 0) { + return r; + } + + msgvec->msg_len = r; + return 1; +} +#endif + bool UdpProcessor::ProcessBatch(int fd, Server *server, Stats *out_stats) { server->Reset(); memset(out_stats, 0, sizeof(Stats));
diff --git a/udp_processor.h b/udp_processor.h index ba96dea..d051348 100644 --- a/udp_processor.h +++ b/udp_processor.h
@@ -25,6 +25,14 @@ namespace roughtime { +#if defined(__MACH__) +struct mmsghdr { + uint8_t *iov_base; + size_t msg_len; + msghdr msg_hdr; +}; +#endif + // UdpProcessor manages a set of receive buffers for processing UDP requests. class UdpProcessor { public: