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

From: naruse@...
Date: 2015-09-30 10:12:51 UTC
List: ruby-dev #49271
Issue #11558 has been updated by Yui NARUSE.


Akira Tanaka wrote:
> Yui NARUSE wrote:
> > 既存の非公開APIを公開してください。
> > struct tm * localtime_with_gmtoff_zone(const time_t *t, struct tm *result, long *gmtoff, const char **zone);
> 
> time_t を使うと 2038年問題を考慮しないといけないので、よくないと思います。
> struct tm を使うと (tm_year が int なので) 2**31年問題を考慮しないといけないので、よくないと思います。

time_tは入力なので、このAPIが考える必要は必ずしもないのではありませんか。
内部処理はyearはint64_tでやって、struct tmにつっこむときにエラーを返せばいいかな。

> zone を char * で返すのはメモリ管理に責任を持てなくなるので、よくないと思います。

これは確かにNULLを渡すことしか考えていなかったので、zoneを削除したものにした方がよいですね。

> > time_t timegm_noleapsecond(struct tm *tm);
> 
> time_t と struct tm は上記のようによくないと思います。

こちらはtimet_t (32bit) が危ないですね。
入力はstruct tmのままで、戻り値は64bitですかねぇ。

> > void tm_add_offset(struct tm *tm, long diff);
> 
> struct tm は上記のようによくないと思います。
> tm_year が overflow したらどうするんでしょうか。

tm_yearがint64_tでもギリギリ狙ったらあふれますよね。
さておき、戻り値intにしてエラー返すのがよいかな。

> まぁ、time_t と struct tm が癌なので、Ruby の公開API用の構造体を定義すれば解決できるとは思います。

VALUEにしないかぎり、入力を納められる出力のサイズ問題は解決不可能ではありませんか。
VALUEにはしたくありませんが……。

そういえば、struct timespecもtv_sevはtime_tですね。

----------------------------------------
Feature #11558: Time related C APIs
https://bugs.ruby-lang.org/issues/11558#change-54326

* Author: Yui NARUSE
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
Time関連のC APIを追加して欲しいです。
具体的には以下のようなものが欲しいです。

struct timespecとoffsetを取って、Timeを返してください。
VALUE rb_time_timespec_new(const struct timespec *ts, int offset);
趣旨としては、[秒, ナノ秒, offset]からTimeを作って欲しいと言うことです。
(rb_time_num_new(Rational, offset)とかだと手間かかる上に遅い)

現在時刻をstruct timespecで欲しいです。
void timespec_now(struct timespec *ts);


既存の非公開APIを公開してください。
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);


https://github.com/nurse/strptime/blob/v0.1.1/ext/strptime/ruby_time.c



-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next