[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 メーリングリストの案内