15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ptw32_timespec.c
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description:
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This translation unit implements routines which are private to
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the implementation and may be used throughout it.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * --------------------------------------------------------------------------
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Pthreads-win32 - POSIX Threads Library for Win32
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Copyright(C) 1998 John E. Bossom
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Copyright(C) 1999,2005 Pthreads-win32 contributors
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Contact Email: rpj@callisto.canberra.edu.au
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      The current list of contributors is contained
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      in the file CONTRIBUTORS included with the source
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      code distribution. The list can also be seen at the
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      following World Wide Web location:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      http://sources.redhat.com/pthreads-win32/contributors.html
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      This library is free software; you can redistribute it and/or
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      modify it under the terms of the GNU Lesser General Public
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      License as published by the Free Software Foundation; either
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      version 2 of the License, or (at your option) any later version.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      This library is distributed in the hope that it will be useful,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      but WITHOUT ANY WARRANTY; without even the implied warranty of
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Lesser General Public License for more details.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      You should have received a copy of the GNU Lesser General Public
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      License along with this library in the file COPYING.LIB;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      if not, write to the Free Software Foundation, Inc.,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "pthread.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "implement.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NEED_FTIME)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * time between jan 1, 1601 and jan 1, 1970 in units of 100 nanoseconds
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_TIMESPEC_TO_FILETIME_OFFSET \
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  ( ((int64_t) 27111902 << 32) + (int64_t) 3577643008 )
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INLINE void
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ptw32_timespec_to_filetime (const struct timespec *ts, FILETIME * ft)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /*
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * -------------------------------------------------------------------
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * converts struct timespec
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * where the time is expressed in seconds and nanoseconds from Jan 1, 1970.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * into FILETIME (as set by GetSystemTimeAsFileTime), where the time is
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * expressed in 100 nanoseconds from Jan 1, 1601,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * -------------------------------------------------------------------
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *(int64_t *) ft = ts->tv_sec * 10000000
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    + (ts->tv_nsec + 50) / 100 + PTW32_TIMESPEC_TO_FILETIME_OFFSET;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INLINE void
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ptw32_filetime_to_timespec (const FILETIME * ft, struct timespec *ts)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /*
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * -------------------------------------------------------------------
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * converts FILETIME (as set by GetSystemTimeAsFileTime), where the time is
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * expressed in 100 nanoseconds from Jan 1, 1601,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * into struct timespec
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * where the time is expressed in seconds and nanoseconds from Jan 1, 1970.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * -------------------------------------------------------------------
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ts->tv_sec =
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (int) ((*(int64_t *) ft - PTW32_TIMESPEC_TO_FILETIME_OFFSET) / 10000000);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ts->tv_nsec =
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (int) ((*(int64_t *) ft - PTW32_TIMESPEC_TO_FILETIME_OFFSET -
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((int64_t) ts->tv_sec * (int64_t) 10000000)) * 100);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NEED_FTIME */
84