[ruby-dev:49280] Re: [Ruby trunk - Feature #11558] Time related C APIs

From: Tanaka Akira <akr@...>
Date: 2015-10-03 12:56:38 UTC
List: ruby-dev #49280
2015年10月2日 1:10 KOSAKI Motohiro <kosaki.motohiro@gmail.com>:

>> DragonFly BSD は 4.0 以降は 32bit 環境をサポートしないそうなので問題ないでしょう。
>> https://www.dragonflybsd.org/release40/
>
> 感触としては、いま time_t
> の64bit化に着手してないOSは、2038年まで生き残らないと開発元が思ってるってことだから、あまり重要視しなくていいのではないのかという気がしてきています。

PC 以上にしか興味がないという可能性はあると思いますが。
32bit 環境のサポートを打ち切った環境についてはそういうことでしょう。

> ただ、ruby独自のtimespecモドキをつくるみたいなアプローチは気に入りません。
> ちゃんと時間を扱いたいならTimeオブジェクト作れ一択なので、そう出来ないということは、OSやらまわりのライブラリやらの制約があるケースがほとんどではないかと
> 推察します。
>
> よって、型としては time_t, struct tm をつかいつつ、ちゃんとコーナーケースを考えて
> エラー処理をしてくれるAPIがもっともうれしいんじゃないかと思えます。

struct tm は tm_gmtoff が存在するとは限らないのがなぁ。

あと、忘れていましたが、提案されているのは Time オブジェクトは扱わない
API が多いのです。
以下はどれも Time オブジェクトは扱いません。

void timespec_now(struct timespec *ts);
struct tm * localtime_with_gmtoff_zone(const time_t *t, struct tm
*result, long *gmtoff, const char **zone);
time_t timegm_noleapsecond(struct tm *tm);
void tm_add_offset(struct tm *tm, long diff);

もし、struct tm のままでやるのであれば、
とりあえず tm_add_offset を Ruby に追加するのはありえないと思います。

tm_add_offset はという関数自体は Ruby 本体には現在存在しません。
vtm_add_offset というのがありますが、
これは struct vtm という、年を VALUE にするなどいろいろと
struct tm よりも Ruby の都合に合わせた構造体に対するものです。
もし、struct tm に対する関数を追加しても、Ruby 本体では使わないでしょう。
そういう、Ruby では使いもしない関数を提供して公開しろ、というのは理不尽でしょう。

もし、struct tm ではないマシな何かを提供して Unix よりもマシな API をひととおり
提供するというのであれば、それを Ruby 本体でも使った上で、外にも提供するというのも
ありうるとは思うのですが。

そういうことを考えると、timespec_now も提供するなら
Ruby の内部でも使うようにするのが条件になるかな。
time_init_0 から抽出すればいいので難しくはないと思いますが。
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread

Prev Next