On 18 April 2016 at 10:18, lh_mouse wrote:
>> I don't see why it has to be a struct, it just has to be suitable as
>> an argument to the relevant __gthread functions.
>
> The type __gthread_time_t is referenced in 
> gcc/libstdc++-v3/include/std/mutex:157
>           __gthread_time_t __ts = {
>             static_cast<std::time_t>(__s.time_since_epoch().count()),
>             static_cast<long>(__ns.count())
>           };
> This definition uses a braced-init-list that has two elements and is 
> unsuitable for scalar types.

Yes I know.

What I meant is that there's no fundamental reason it needs to be a
struct. That code could be changed.

>> If the current code assumes a struct and the Windows API calls need an
>> integer then either the existing code needs to be made more flexible,
>> or you need to define it as a struct and then convert to an integer
>> inside your new gthread wrapper functions.
>
> The Windows APIs involved use LARGE_INTEGER - a union of a 64-bit integer and 
> an array of two 32-bit integers - because some languages might have no native 
> 64-bit integer types.
> Actually in C99 and C++11 we just assume there is long long and int64_t 
> despite the fact that ISO C marks int64_t as optional, so it can be regarded 
> as a union whose only element is an int64_t.

What are the units of the argument? Milliseconds?

You have two choices, either modify all the places in libstdc++ that
use __gthread_time_t, changing the code to use some new function
template that populates a __gthread_time_t from a
std::chrono::time_point<C,D> or std::chrono::duration<R,P>, or define
a similar struct in your gthreads header and convert it to int64_t
inside your functions.  For functions taking a relative time the
conversion from a { seconds, nanoseconds } struct to milliseconds is
trivial, for functions taking an absolute time you need to know the
epoch of the clock that was used when populating the struct.

Reply via email to