2
0
mirror of https://github.com/boostorg/build.git synced 2026-02-15 13:02:11 +00:00

Boost Jam code cleanup - extracted Windows specific FILETIME structure conversion functions from execnt.c to a lowel level filent.c Windows specific module so they may be reused in both. Renamed the functions to make their purpose clearer.

[SVN r79497]
This commit is contained in:
Jurko Gospodnetić
2012-07-14 13:23:45 +00:00
parent 9f5192acff
commit e8febc705c
3 changed files with 74 additions and 56 deletions

View File

@@ -31,16 +31,13 @@
* exec_cmd() - launch an async command execution
* exec_wait() - wait for any of the async command processes to
* terminate
*
* Internal routines:
* filetime_dt() - Windows FILETIME --> POSIX time_t conversion
* filetime_seconds() - Windows FILETIME --> number of seconds conversion
*/
#include "jam.h"
#ifdef USE_EXECNT
#include "execcmd.h"
#include "filent.h"
#include "lists.h"
#include "output.h"
#include "pathsys.h"
@@ -51,8 +48,6 @@
#include <errno.h>
#include <time.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <process.h>
#include <tlhelp32.h>
@@ -669,46 +664,6 @@ static FILETIME negate_FILETIME( FILETIME t )
}
/*
* filetime_seconds() - Windows FILETIME --> number of seconds conversion
*/
static double filetime_seconds( FILETIME const t )
{
return t.dwHighDateTime * ( (double)( 1UL << 31 ) * 2.0 * 1.0e-7 ) +
t.dwLowDateTime * 1.0e-7;
}
/*
* filetime_dt() - Windows FILETIME --> POSIX time_t conversion
*
* Lifted shamelessly from the CPython implementation.
*/
static time_t filetime_dt( FILETIME const ft )
{
/* Seconds between 1.1.1601 and 1.1.1970 */
static __int64 const secs_between_epochs = 11644473600;
/* We can not simply cast and dereference a FILETIME, since it might not be
* aligned properly. __int64 type variables are expected to be aligned to an
* 8 byte boundary while FILETIME structures may be aligned to any 4 byte
* boundary. Using an incorrectly aligned __int64 variable may cause a
* performance penalty on some platforms or even exceptions on others
* (documented on MSDN).
*/
__int64 in;
memcpy( &in, &ft, sizeof( in ) );
/* FILETIME resolution: 100ns. */
/* For resolutions finer than 1 second use the following:
* nsec = (int)( in % 10000000 ) * 100;
*/
return (time_t)( ( in / 10000000 ) - secs_between_epochs );
}
static void record_times( HANDLE const process, timing_info * const time )
{
FILETIME creation;
@@ -717,10 +672,10 @@ static void record_times( HANDLE const process, timing_info * const time )
FILETIME user;
if ( GetProcessTimes( process, &creation, &exit, &kernel, &user ) )
{
time->system = filetime_seconds( kernel );
time->user = filetime_seconds( user );
time->start = filetime_dt( creation );
time->end = filetime_dt( exit );
time->system = filetime_to_seconds( kernel );
time->user = filetime_to_seconds( user );
time->start = filetime_to_timestamp( creation );
time->end = filetime_to_timestamp( exit );
}
}
@@ -901,7 +856,7 @@ static double running_time( HANDLE const process )
{
/* Compute the elapsed time. */
GetSystemTimeAsFileTime( &current );
return filetime_seconds( add_FILETIME( current,
return filetime_to_seconds( add_FILETIME( current,
negate_FILETIME( creation ) ) );
}
return 0.0;
@@ -955,7 +910,7 @@ static double creation_time( HANDLE const process )
FILETIME user;
FILETIME current;
return GetProcessTimes( process, &creation, &exit, &kernel, &user )
? filetime_seconds( creation )
? filetime_to_seconds( creation )
: 0.0;
}

View File

@@ -15,8 +15,10 @@
* filent.c - scan directories and archives on NT
*
* External routines:
* file_archscan() - scan an archive for files
* file_mkdir() - create a directory
* file_archscan() - scan an archive for files
* file_mkdir() - create a directory
* filetime_to_seconds() - Windows FILETIME --> number of seconds conversion
* filetime_to_timestamp() - Windows FILETIME --> timestamp conversion
*
* External routines called only via routines in filesys.c:
* file_collect_dir_content_() - collects directory content information
@@ -26,6 +28,7 @@
#include "jam.h"
#ifdef OS_NT
#include "filent.h"
#include "filesys.h"
#include "object.h"
@@ -46,8 +49,6 @@
#include <direct.h>
#include <io.h>
#include <windows.h>
/*
* file_collect_dir_content_() - collects directory content information
@@ -347,4 +348,44 @@ void file_archscan( char const * archive, scanback func, void * closure )
close( fd );
}
/*
* filetime_to_seconds() - Windows FILETIME --> number of seconds conversion
*/
double filetime_to_seconds( FILETIME const t )
{
return t.dwHighDateTime * ( (double)( 1UL << 31 ) * 2.0 * 1.0e-7 ) +
t.dwLowDateTime * 1.0e-7;
}
/*
* filetime_to_timestamp() - Windows FILETIME --> timestamp conversion
*
* Lifted shamelessly from the CPython implementation.
*/
time_t filetime_to_timestamp( FILETIME const ft )
{
/* Seconds between 1.1.1601 and 1.1.1970 */
static __int64 const secs_between_epochs = 11644473600;
/* We can not simply cast and dereference a FILETIME, since it might not be
* aligned properly. __int64 type variables are expected to be aligned to an
* 8 byte boundary while FILETIME structures may be aligned to any 4 byte
* boundary. Using an incorrectly aligned __int64 variable may cause a
* performance penalty on some platforms or even exceptions on others
* (documented on MSDN).
*/
__int64 in;
memcpy( &in, &ft, sizeof( in ) );
/* FILETIME resolution: 100ns. */
/* For resolutions finer than 1 second use the following:
* nsec = (int)( in % 10000000 ) * 100;
*/
return (time_t)( ( in / 10000000 ) - secs_between_epochs );
}
#endif /* OS_NT */

22
v2/engine/filent.h Normal file
View File

@@ -0,0 +1,22 @@
/*
* Copyright 2012 Jurko Gospodnetic
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
*/
/*
* filent.h - Windows specific file routines
*/
#ifndef FILENT_JG20120714_H
#define FILENT_JG20120714_H
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <time.h>
double filetime_to_seconds( FILETIME const ft );
time_t filetime_to_timestamp( FILETIME const ft );
#endif