windows: Add modtime implementation
This commit is contained in:
parent
d25cba4f64
commit
5ed284a15e
@ -91,6 +91,11 @@ void mp_deinit(void) {
|
|||||||
//mp_obj_dict_free(&dict_main);
|
//mp_obj_dict_free(&dict_main);
|
||||||
mp_module_deinit();
|
mp_module_deinit();
|
||||||
mp_emit_glue_deinit();
|
mp_emit_glue_deinit();
|
||||||
|
|
||||||
|
// call port specific deinitialization if any
|
||||||
|
#ifdef MICROPY_PORT_INIT_FUNC
|
||||||
|
MICROPY_PORT_DEINIT_FUNC;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_t mp_load_const_dec(qstr qstr) {
|
mp_obj_t mp_load_const_dec(qstr qstr) {
|
||||||
|
@ -36,6 +36,23 @@
|
|||||||
#include "obj.h"
|
#include "obj.h"
|
||||||
#include "runtime.h"
|
#include "runtime.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
void msec_sleep_tv(struct timeval *tv) {
|
||||||
|
msec_sleep(tv->tv_sec * 1000.0 + tv->tv_usec / 1000.0);
|
||||||
|
}
|
||||||
|
#define sleep_select(a,b,c,d,e) msec_sleep_tv((e))
|
||||||
|
#else
|
||||||
|
#define sleep_select select
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CLOCKS_PER_SEC == 1000000 // POSIX
|
||||||
|
#define CLOCK_DIV 1000.0
|
||||||
|
#elif CLOCKS_PER_SEC == 1000 // WIN32
|
||||||
|
#define CLOCK_DIV 1.0
|
||||||
|
#else
|
||||||
|
#error Unsupported clock() implementation
|
||||||
|
#endif
|
||||||
|
|
||||||
STATIC mp_obj_t mod_time_time() {
|
STATIC mp_obj_t mod_time_time() {
|
||||||
#if MICROPY_ENABLE_FLOAT
|
#if MICROPY_ENABLE_FLOAT
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
@ -51,11 +68,10 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_time_time_obj, mod_time_time);
|
|||||||
// Note: this is deprecated since CPy3.3, but pystone still uses it.
|
// Note: this is deprecated since CPy3.3, but pystone still uses it.
|
||||||
STATIC mp_obj_t mod_time_clock() {
|
STATIC mp_obj_t mod_time_clock() {
|
||||||
#if MICROPY_ENABLE_FLOAT
|
#if MICROPY_ENABLE_FLOAT
|
||||||
// POSIX requires CLOCKS_PER_SEC equals 1000000, so that's what we assume.
|
|
||||||
// float cannot represent full range of int32 precisely, so we pre-divide
|
// float cannot represent full range of int32 precisely, so we pre-divide
|
||||||
// int to reduce resolution, and then actually do float division hoping
|
// int to reduce resolution, and then actually do float division hoping
|
||||||
// to preserve integer part resolution.
|
// to preserve integer part resolution.
|
||||||
return mp_obj_new_float((float)(clock() / 1000) / 1000.0);
|
return mp_obj_new_float((float)(clock() / 1000) / CLOCK_DIV);
|
||||||
#else
|
#else
|
||||||
return mp_obj_new_int((machine_int_t)clock());
|
return mp_obj_new_int((machine_int_t)clock());
|
||||||
#endif
|
#endif
|
||||||
@ -69,7 +85,7 @@ STATIC mp_obj_t mod_time_sleep(mp_obj_t arg) {
|
|||||||
double ipart;
|
double ipart;
|
||||||
tv.tv_usec = round(modf(val, &ipart) * 1000000);
|
tv.tv_usec = round(modf(val, &ipart) * 1000000);
|
||||||
tv.tv_sec = ipart;
|
tv.tv_sec = ipart;
|
||||||
select(0, NULL, NULL, NULL, &tv);
|
sleep_select(0, NULL, NULL, NULL, &tv);
|
||||||
#else
|
#else
|
||||||
sleep(mp_obj_get_int(arg));
|
sleep(mp_obj_get_int(arg));
|
||||||
#endif
|
#endif
|
||||||
|
@ -31,8 +31,10 @@ SRC_C = \
|
|||||||
unix/main.c \
|
unix/main.c \
|
||||||
unix/file.c \
|
unix/file.c \
|
||||||
unix/input.c \
|
unix/input.c \
|
||||||
|
unix/modtime.c \
|
||||||
realpath.c \
|
realpath.c \
|
||||||
init.c \
|
init.c \
|
||||||
|
sleep.c \
|
||||||
|
|
||||||
OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
|
OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
|
||||||
|
|
||||||
|
@ -26,11 +26,21 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
HANDLE hSleepEvent = NULL;
|
||||||
|
|
||||||
void init() {
|
void init() {
|
||||||
|
hSleepEvent = CreateEvent(NULL, TRUE, FALSE, FALSE);
|
||||||
#ifdef __MINGW32__
|
#ifdef __MINGW32__
|
||||||
putenv("PRINTF_EXPONENT_DIGITS=2");
|
putenv("PRINTF_EXPONENT_DIGITS=2");
|
||||||
#else
|
#else
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void deinit() {
|
||||||
|
if (hSleepEvent != NULL) {
|
||||||
|
CloseHandle(hSleepEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -25,3 +25,4 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void init(void);
|
void init(void);
|
||||||
|
void deinit(void);
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_DOUBLE)
|
#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_DOUBLE)
|
||||||
#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ)
|
#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ)
|
||||||
#define MICROPY_PORT_INIT_FUNC init()
|
#define MICROPY_PORT_INIT_FUNC init()
|
||||||
|
#define MICROPY_PORT_DEINIT_FUNC deinit()
|
||||||
|
|
||||||
// type definitions for the specific machine
|
// type definitions for the specific machine
|
||||||
|
|
||||||
@ -69,9 +70,15 @@ extern const struct _mp_obj_fun_native_t mp_builtin_open_obj;
|
|||||||
#define MICROPY_EXTRA_BUILTINS \
|
#define MICROPY_EXTRA_BUILTINS \
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_open), (mp_obj_t)&mp_builtin_open_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_open), (mp_obj_t)&mp_builtin_open_obj },
|
||||||
|
|
||||||
|
extern const struct _mp_obj_module_t mp_module_time;
|
||||||
|
#define MICROPY_EXTRA_BUILTIN_MODULES \
|
||||||
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&mp_module_time }, \
|
||||||
|
|
||||||
#include "realpath.h"
|
#include "realpath.h"
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
|
|
||||||
|
// sleep for given number of milliseconds
|
||||||
|
void msec_sleep(double msec);
|
||||||
|
|
||||||
// MSVC specifics
|
// MSVC specifics
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
58
windows/msvc/gettimeofday.c
Normal file
58
windows/msvc/gettimeofday.c
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Micro Python project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, 2014 Damien P. George
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Winsock2.h>
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
unsigned __int64 tm; // time in 100 nanoseconds interval
|
||||||
|
FILETIME ft;
|
||||||
|
} FT;
|
||||||
|
|
||||||
|
int gettimeofday(struct timeval *tp, struct timezone *tz) {
|
||||||
|
if (tp == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// UTC time
|
||||||
|
FT ft;
|
||||||
|
ZeroMemory(&ft, sizeof(ft));
|
||||||
|
GetSystemTimeAsFileTime(&ft.ft);
|
||||||
|
|
||||||
|
// to microseconds
|
||||||
|
ft.tm /= 10;
|
||||||
|
|
||||||
|
// convert to unix format
|
||||||
|
// number of microseconds intervals between the 1st january 1601 and the 1st january 1970 (369 years + 89 leap days)
|
||||||
|
const unsigned __int64 deltaEpoch = 11644473600000000ull;
|
||||||
|
const unsigned __int64 microSecondsToSeconds = 1000000ull;
|
||||||
|
tp->tv_usec = ft.tm % microSecondsToSeconds;
|
||||||
|
tp->tv_sec = (ft.tm - deltaEpoch) / microSecondsToSeconds;
|
||||||
|
|
||||||
|
// see man gettimeofday: timezone is deprecated and expected to be NULL
|
||||||
|
(void)tz;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -5,7 +5,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="$(PyBaseDir)py\*.c" />
|
<ClCompile Include="$(PyBaseDir)py\*.c" />
|
||||||
<ClCompile Include="$(PyBaseDir)unix\*.c" Exclude="$(PyBaseDir)unix\mod*.c" />
|
<ClCompile Include="$(PyBaseDir)unix\*.c" Exclude="$(PyBaseDir)unix\modffi.c;$(PyBaseDir)unix\modsocket.c" />
|
||||||
<ClCompile Include="$(PyBaseDir)windows\*.c" />
|
<ClCompile Include="$(PyBaseDir)windows\*.c" />
|
||||||
<ClCompile Include="$(PyBaseDir)windows\msvc\*.c" />
|
<ClCompile Include="$(PyBaseDir)windows\msvc\*.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
28
windows/msvc/sys/time.h
Normal file
28
windows/msvc/sys/time.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Micro Python project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, 2014 Damien P. George
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Get the definitions for timeval etc
|
||||||
|
#include <Winsock2.h>
|
34
windows/sleep.c
Normal file
34
windows/sleep.c
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Micro Python project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, 2014 Damien P. George
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
extern HANDLE hSleepEvent;
|
||||||
|
|
||||||
|
void msec_sleep(double msec) {
|
||||||
|
ResetEvent(hSleepEvent);
|
||||||
|
WaitForSingleObjectEx(hSleepEvent, msec, FALSE);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user