[Python-Dev] [Python-checkins] cpython: Close #20656: Fix select.select() on OpenBSD 64-bit

Zachary Ware zachary.ware at gmail.com
Tue Feb 18 06:19:15 CET 2014


On Mon, Feb 17, 2014 at 6:36 PM, victor.stinner
<python-checkins at python.org> wrote:
> http://hg.python.org/cpython/rev/79ccf36b0fd0
> changeset:   89239:79ccf36b0fd0
> user:        Victor Stinner <victor.stinner at gmail.com>
> date:        Tue Feb 18 01:35:40 2014 +0100
> summary:
>   Close #20656: Fix select.select() on OpenBSD 64-bit
>
> files:
>   Modules/selectmodule.c |  22 ++++++++++++----------
>   1 files changed, 12 insertions(+), 10 deletions(-)

This changeset caused a compile warning on 32-bit Windows:

..\Modules\selectmodule.c(238): warning C4244: '=' : conversion from
'time_t' to 'long', possible loss of data
[P:\ath\to\cpython\PCbuild\select.vcxproj]

> diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
> --- a/Modules/selectmodule.c
> +++ b/Modules/selectmodule.c
> @@ -212,11 +212,18 @@
>          return NULL;
>      }
>      else {
> -#ifdef MS_WINDOWS
> +        /* On OpenBSD 5.4, timeval.tv_sec is a long.
> +         * Example: long is 64-bit, whereas time_t is 32-bit. */
>          time_t sec;
> -        if (_PyTime_ObjectToTimeval(tout, &sec, &tv.tv_usec,
> +        /* On OS X 64-bit, timeval.tv_usec is an int (and thus still 4
> +           bytes as required), but no longer defined by a long. */
> +        long usec;
> +        if (_PyTime_ObjectToTimeval(tout, &sec, &usec,
>                                      _PyTime_ROUND_UP) == -1)
>              return NULL;
> +#ifdef MS_WINDOWS
> +        /* On Windows, timeval.tv_sec is a long (32 bit),
> +         * whereas time_t can be 64-bit. */
>          assert(sizeof(tv.tv_sec) == sizeof(long));
>  #if SIZEOF_TIME_T > SIZEOF_LONG
>          if (sec > LONG_MAX) {
> @@ -225,16 +232,11 @@
>              return NULL;
>          }
>  #endif
> -        tv.tv_sec = (long)sec;
>  #else
> -        /* 64-bit OS X has struct timeval.tv_usec as an int (and thus still 4
> -           bytes as required), but no longer defined by a long. */
> -        long tv_usec;
> -        if (_PyTime_ObjectToTimeval(tout, &tv.tv_sec, &tv_usec,
> -                                    _PyTime_ROUND_UP) == -1)
> -            return NULL;
> -        tv.tv_usec = tv_usec;
> +        assert(sizeof(tv.tv_sec) >= sizeof(sec));
>  #endif
> +        tv.tv_sec = sec;

This is the offending line.

I'm not sure how best to fix it, so I'm just pointing it out :)

-- 
Zach


More information about the Python-Dev mailing list