diff options
-rw-r--r-- | Doc/library/time.rst | 16 | ||||
-rw-r--r-- | Lib/test/test_decimal.py | 70 | ||||
-rw-r--r-- | Lib/test/test_thread.py | 1 | ||||
-rw-r--r-- | Lib/test/test_time.py | 11 | ||||
-rw-r--r-- | Modules/_decimal/_decimal.c | 10 | ||||
-rw-r--r-- | Modules/timemodule.c | 33 |
6 files changed, 65 insertions, 76 deletions
diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 581b68af9d0..8156b018abd 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -151,6 +151,13 @@ The module defines the following functions and data items: .. versionadded:: 3.3 +.. function:: clock_settime(clk_id, time) + + Set the time of the specified clock *clk_id*. + + .. versionadded:: 3.3 + + .. data:: CLOCK_REALTIME System-wide real-time clock. Setting this clock requires appropriate @@ -159,6 +166,15 @@ The module defines the following functions and data items: .. versionadded:: 3.3 +.. data:: CLOCK_HIGHRES + + The Solaris OS has a CLOCK_HIGHRES timer that attempts to use an optimal + hardware source, and may give close to nanosecond resolution. CLOCK_HIGHRES + is the nonadjustable, high-resolution clock. + + .. versionadded:: 3.3 + + .. data:: CLOCK_MONOTONIC Clock that cannot be set and represents monotonic time since some diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index 286d82c0da0..694b959e218 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -56,76 +56,6 @@ sys.modules['decimal'] = C fractions = {C:cfractions, P:pfractions} sys.modules['decimal'] = orig_sys_decimal -############ RunFirst ############ -class RunFirst(unittest.TestCase): - - def setUp(self): - self.save_default = self.decimal.DefaultContext.copy() - - def tearDown(self): - DefaultContext = self.decimal.DefaultContext - - DefaultContext.prec = self.save_default.prec - DefaultContext.rounding = self.save_default.rounding - DefaultContext.Emax = self.save_default.Emax - DefaultContext.Emin = self.save_default.Emin - DefaultContext.capitals = self.save_default.capitals - DefaultContext.clamp = self.save_default.clamp - DefaultContext.flags = self.save_default.flags - DefaultContext.traps = self.save_default.traps - - self.decimal.setcontext(self.decimal.DefaultContext) - - def test_00default_context(self): - # The test depends on the fact that getcontext() is called - # for the first time. - DefaultContext = self.decimal.DefaultContext - ROUND_05UP = self.decimal.ROUND_05UP - Clamped = self.decimal.Clamped - InvalidOperation = self.decimal.InvalidOperation - - DefaultContext.prec = 5001 - DefaultContext.rounding = ROUND_05UP - DefaultContext.Emax = 10025 - DefaultContext.Emin = -10025 - DefaultContext.capitals = 0 - DefaultContext.clamp = 1 - DefaultContext.flags[InvalidOperation] = True - DefaultContext.clear_traps() - DefaultContext.traps[Clamped] = True - - # implicit initialization on first access - c = self.decimal.getcontext() - - self.assertEqual(c.prec, 5001) - self.assertEqual(c.rounding, ROUND_05UP) - self.assertEqual(c.Emax, 10025) - self.assertEqual(c.Emin, -10025) - self.assertEqual(c.capitals, 0) - self.assertEqual(c.clamp, 1) - for k in c.flags: - self.assertFalse(c.flags[k]) - for k in c.traps: - if k is Clamped: - self.assertTrue(c.traps[k]) - else: - self.assertFalse(c.traps[k]) - - # explicit initialization - self.decimal.setcontext(DefaultContext) - c = self.decimal.getcontext() - for k in c.flags: - self.assertFalse(c.flags[k]) - -class CRunFirst(RunFirst): - decimal = C -class PyRunFirst(RunFirst): - decimal = P -if C: - run_unittest(CRunFirst, PyRunFirst) -else: - run_unittest(PyRunFirst) -############ END RunFirst ############ # Useful Test Constant Signals = { diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py index deb4bf36202..41fb3acd7b3 100644 --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -132,7 +132,6 @@ class ThreadRunningTests(BasicThreadTest): # See issue #14474 def task(): started.release() - sys.stderr = stderr raise SyntaxError def mywrite(self, *args): try: diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index 28d018afe7a..fb2489c4532 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -47,6 +47,17 @@ class TimeTestCase(unittest.TestCase): self.assertGreater(res, 0.0) self.assertLessEqual(res, 1.0) + @unittest.skipUnless(hasattr(time, 'clock_settime'), + 'need time.clock_settime()') + def test_clock_settime(self): + t = time.clock_gettime(time.CLOCK_REALTIME) + try: + time.clock_settime(time.CLOCK_REALTIME, t) + except PermissionError: + pass + + self.assertRaises(OSError, time.clock_settime, time.CLOCK_MONOTONIC, 0) + def test_conversions(self): self.assertEqual(time.ctime(self.t), time.asctime(time.localtime(self.t))) diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index d5d11341e39..32e336b4fff 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -1510,7 +1510,7 @@ current_context(void) #define CURRENT_CONTEXT_ADDR(ctx) \ ctx = CTX(current_context()) -/* Return current context, increment reference */ +/* Return a new reference to the current context */ static PyObject * PyDec_GetCurrentContext(void) { @@ -1614,7 +1614,7 @@ current_context(void) ctx = CTX(_c_t_x_o_b_j); \ } -/* Return current context, increment reference */ +/* Return a new reference to the current context */ static PyObject * PyDec_GetCurrentContext(void) { @@ -1759,7 +1759,7 @@ static PyTypeObject PyDecContextManager_Type = 0, /* tp_print */ (getattrfunc) 0, /* tp_getattr */ (setattrfunc) 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc) 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2699,7 +2699,7 @@ ctx_create_decimal(PyObject *context, PyObject *args) /******************************************************************************/ -/* Implicit conversions to Decimal */ +/* Implicit conversions to Decimal */ /******************************************************************************/ /* Try to convert PyObject v to a new PyDecObject conv. If the conversion @@ -2796,7 +2796,7 @@ convert_op(int type_err, PyObject **conv, PyObject *v, PyObject *context) /******************************************************************************/ -/* Implicit conversions to Decimal for comparison */ +/* Implicit conversions to Decimal for comparison */ /******************************************************************************/ /* Convert rationals for comparison */ diff --git a/Modules/timemodule.c b/Modules/timemodule.c index f44e0c40c4e..23f3ddd765c 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -158,6 +158,33 @@ PyDoc_STRVAR(clock_gettime_doc, "clock_gettime(clk_id) -> floating point number\n\ \n\ Return the time of the specified clock clk_id."); + +static PyObject * +time_clock_settime(PyObject *self, PyObject *args) +{ + clockid_t clk_id; + PyObject *obj; + struct timespec tp; + int ret; + + if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj)) + return NULL; + + if (_PyTime_ObjectToTimespec(obj, &tp.tv_sec, &tp.tv_nsec) == -1) + return NULL; + + ret = clock_settime((clockid_t)clk_id, &tp); + if (ret != 0) { + PyErr_SetFromErrno(PyExc_IOError); + return NULL; + } + Py_RETURN_NONE; +} + +PyDoc_STRVAR(clock_settime_doc, +"clock_settime(clk_id, time)\n\ +\n\ +Set the time of the specified clock clk_id."); #endif #ifdef HAVE_CLOCK_GETRES @@ -962,6 +989,9 @@ PyInit_timezone(PyObject *m) { #ifdef CLOCK_MONOTONIC_RAW PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW); #endif +#ifdef CLOCK_HIGHRES + PyModule_AddIntMacro(m, CLOCK_HIGHRES); +#endif #ifdef CLOCK_PROCESS_CPUTIME_ID PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID); #endif @@ -980,6 +1010,9 @@ static PyMethodDef time_methods[] = { #ifdef HAVE_CLOCK_GETTIME {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc}, #endif +#ifdef HAVE_CLOCK_GETTIME + {"clock_settime", time_clock_settime, METH_VARARGS, clock_settime_doc}, +#endif #ifdef HAVE_CLOCK_GETRES {"clock_getres", time_clock_getres, METH_VARARGS, clock_getres_doc}, #endif |