mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2025-12-06 08:46:45 +08:00
Problem: - 'linux' is a predefined macro on Linux platforms - Using 'namespace linux' causes compilation errors - Preprocessor replaces 'linux' with '1' before compilation Solution: - Rename 'namespace linux' to 'namespace linux_' - Rename 'namespace posix' to 'namespace posix_' - Update all 7 call sites accordingly: - linux/condition.h: linux_::detail::make_timespec() - linux/mutex.h: linux_::detail::make_timespec() (2 places) - posix/condition.h: posix_::detail::make_timespec() - posix/mutex.h: posix_::detail::make_timespec() (2 places) - posix/semaphore_impl.h: posix_::detail::make_timespec() This prevents preprocessor macro expansion issues while maintaining the ODR violation fix from the previous commit.
42 lines
1.0 KiB
C++
42 lines
1.0 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <system_error>
|
|
|
|
#include <sys/time.h>
|
|
#include <time.h>
|
|
#include <errno.h>
|
|
|
|
#include "libipc/utility/log.h"
|
|
|
|
namespace ipc {
|
|
namespace posix_ {
|
|
namespace detail {
|
|
|
|
inline bool calc_wait_time(timespec &ts, std::uint64_t tm /*ms*/) noexcept {
|
|
timeval now;
|
|
int eno = ::gettimeofday(&now, NULL);
|
|
if (eno != 0) {
|
|
ipc::error("fail gettimeofday [%d]\n", eno);
|
|
return false;
|
|
}
|
|
ts.tv_nsec = (now.tv_usec + (tm % 1000) * 1000) * 1000;
|
|
ts.tv_sec = now.tv_sec + (tm / 1000) + (ts.tv_nsec / 1000000000l);
|
|
ts.tv_nsec %= 1000000000l;
|
|
return true;
|
|
}
|
|
|
|
inline timespec make_timespec(std::uint64_t tm /*ms*/) noexcept(false) {
|
|
timespec ts {};
|
|
if (!calc_wait_time(ts, tm)) {
|
|
ipc::error("fail calc_wait_time: tm = %zd, tv_sec = %ld, tv_nsec = %ld\n",
|
|
tm, ts.tv_sec, ts.tv_nsec);
|
|
throw std::system_error{static_cast<int>(errno), std::system_category()};
|
|
}
|
|
return ts;
|
|
}
|
|
|
|
} // namespace detail
|
|
} // namespace posix_
|
|
} // namespace ipc
|