[PHP-doc 713] Re: flock について
TAKAGI Masahiro
matakagi @ gmail.com
2008年 5月 1日 (木) 12:05:01 JST
高木です。
# Cレベルの話になると、自分の知識不足を思い知らされる……
2008/4/30 大西愼一 <vine-mls @ frs.gotdns.com>:
>
> >>>> bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
> >>>>
> >>>> とあるように返り値は、int(1) でしたが、表現としては TRUE で合っている
> >>>> のでしょうか。
> (一部無視しました)
> > ちなみに、flockのパラメータ解釈で第3引数はzvalとして扱っている
> > ようですので、結果的にboolでもintでもどちらでも動作すると思います。
> お示しいただいたソースから(大胆に推測すると)、
> zval 型(どのような型なのかは知らないのですが)の参照渡しであるかを
> チェックして、Z_LVAL 型として 1 をセットしていますが、Z_LVAL ってのは
> 定義が bool であれば bool(true)、int であれば int(1) でしょうか?
> これはこれで、未定義の時が問題になりそうですが。
>
現在のPHPの実装では、PHPのbool型はC言語レベルではlong型の0か非0かで管
理しているようです。以下、PHP 5.2.x系のヘッダファイルの抜粋です。
============================================================
Zend/zend.h
============================================================
typedef struct _zval_struct zval;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount;
zend_uchar type; /* active type */
zend_uchar is_ref;
};
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
============================================================
Zend/zend_API.h
============================================================
#define ZVAL_BOOL(z, b) { \
(z)->type = IS_BOOL; \
(z)->value.lval = ((b) != 0); \
}
#define ZVAL_LONG(z, l) { \
(z)->type = IS_LONG; \
(z)->value.lval = l; \
}
#define RETVAL_BOOL(b) ZVAL_BOOL(return_value, b)
#define RETVAL_LONG(l) ZVAL_LONG(return_value, l)
#define RETVAL_FALSE ZVAL_BOOL(return_value, 0)
#define RETVAL_TRUE ZVAL_BOOL(return_value, 1)
> 受け取る値ですので、少々拙い気がしてきました。
> マニュアルを信じて、if ( $wouldblock === TRUE ) ...
> なんて厳密な方でチェックしてしまったら、不幸な事になりませんか?
>
===による比較だとおそらく_zval_structのtypeを見ることになるので、たぶん
大西さんの予想通りの結果になるんでしょうね。ってことは、元のドキュメント
のバグか……。
とりあえずもう少し寝かせてみて、英語版ドキュメントの修正も含めて何らかの
対応を考えます。もしこのメールで書いた私の理解が間違っているようなら、ど
なたか指摘してくださると助かります。よろしくお願いします。
--
TAKAGI Masahiro mailto:matakagi @ gmail.com
PHP-doc メーリングリストの案内