Hi,
The __APPLE__ implementation also pointed to the implementation in that file
and I used it to come up with a patch.
#elif defined(__FreeBSD__)
void notifyOne(const void* uaddr) {
_umtx_op(const_cast<void*>(uaddr), UMTX_OP_WAKE, 1, NULL, NULL);
}
void notifyMany(const void* uaddr, int nToWake) {
_umtx_op(const_cast<void*>(uaddr), UMTX_OP_WAKE, nToWake, NULL, NULL);
}
void notifyAll(const void* uaddr) {
_umtx_op(const_cast<void*>(uaddr), UMTX_OP_WAKE, INT_MAX, NULL, NULL);
}
bool waitUntil(const void* uaddr,
uint32_t old,
boost::optional<system_clock::time_point> deadline) {
struct timespec timeout;
bool timeoutOverflow = false;
if (deadline) {
int64_t micros = durationCount<Microseconds>(*deadline -
system_clock::now());
if (micros <= 0) {
return false; // Synthesize a timeout.
}
if (micros > int64_t(std::numeric_limits<uint32_t>::max())) {
// 2**32 micros is a little over an hour. If this happens, we wait
as long as we can,
// then return as-if a spurious wakeup happened, rather than a
timeout. This will cause
// the caller to loop and we will compute a smaller time each pass,
eventually reaching
// a representable timeout.
micros = std::numeric_limits<uint32_t>::max();
timeoutOverflow = true;
}
timeout.tv_sec = micros / 1000;
timeout.tv_nsec = (micros % 1000) * 1000;
}
if (_umtx_op(const_cast<void*>(uaddr), UMTX_OP_WAIT, old, (void*)sizeof(struct
timespec), &timeout) != -1)
return true;
// There isn't a good list of possible errors, so assuming that anything
other than a timeout
// error is a possible spurious wakeup.
return timeoutOverflow || errno != ETIMEDOUT;
}
It compiles and runs in my simple tests (although I don't know if my simple
tests execute this part of mongodb code). Suggestions are of course welcome.
Regards,
Ronald.
Van: Michael Gmelin <gre...@freebsd.org>
Datum: dinsdag, 23 juli 2024 17:32
Aan: Ronald Klop <ronald-li...@klop.ws>
Onderwerp: Re: advice for implementing an atomics wrapper
Does this help?
https://reviews.llvm.org/D142134
On 23. Jul 2024, at 16:17, Ronald Klop <ronald-li...@klop.ws> wrote:
>
Sorry,
Something broke the pasted URL.
https://github.com/mongodb/mongo/blob/master/src/mongo/platform/waitable_atomic.cpp
Another attempt.
Ronald.
Van: Ronald Klop <ronald-li...@klop.ws>
Datum: dinsdag, 23 juli 2024 16:14
Aan: freebsd-po...@freebsd.org
Onderwerp: advice for implementing an atomics wrapper
Hi,
For mongodb 8.0 I need to give a FreeBSD implementation of this file.
https://github.com/mongodb/mongo/blob/master/src/mongo/platform/waitable_atomic.cpp
Using the __Apple__ definition gives:
ld.lld: error: undefined symbol: __ulock_wake
ld.lld: error: undefined symbol: __ulock_wait
And the __linux__ definition uses futex which FreeBSD does not have AFAIK.
What is an easy way to port this file?
Regards,
Ronald.