2012-04-17 4 views
2

LinuxでPHP 5.4.0を実行しています。モジュールがそのMSHUTDOWNを終了したときにここ PHPモジュールがts_allocate_dtorでクラッシュする

は、ZEND_MINIT_FUNCTION

#ifdef ZTS 
ts_allocate_id(&sample_globals_id, 
    sizeof(zend_sample_globals), 
    (ts_allocate_ctor) php_sample_init_globals, 
    (ts_allocate_dtor) php_sample_destroy_globals); 
#else 
    php_sample_init_globals(& sample_globals TSRMLS_CC); 
#endif 

このコードがクラッシュのコードです。 TSRM.c、この行(デストラクタの呼び出し)にGDBポイント:

if (p->storage[j]) { 
    if (resource_types_table && !resource_types_table[j].done && resource_types_table[j].dtor) { 
    resource_types_table[j].dtor(p->storage[j], &p->storage); 
    } 
free(p->storage[j]); 
} 

でも見知らぬ人、私はNULLとデストラクタ関数を交換するとき、それは動作します。このように:

ts_allocate_id(&sample_globals_id, 
    sizeof(zend_sample_globals), 
    (ts_allocate_ctor) php_sample_init_globals, 
    NULL); //Works, but destructor is not called 

これはどうして起こるのでしょうか? ありがとうございます

+0

どのような形式のクラッシュですか?これは二重自由であるかもしれませんか? –

+0

私はそうは思わない、デストラクタphp_sample_destroy_globals()が空であってもクラッシュする。 クラッシュはセグメンテーションエラー – Vasisualiy

+0

ですが、実際にはこのケースと非常によく似ています http://osdir.com/ml/php.pecl.devel/2007-03/msg00036.html – Vasisualiy

答えて

2

見つかりました。 奇妙なことに、これはANYチュートリアルでは説明されていませんが、答えはextディレクトリのソースコードにあります。

私は

#ifdef ZTS 
    ts_free_id(sample_globals_id); 
#endif 

をMSHUTDOWNする次のコードを追加しましたそして今、それが正常に動作します。 Phhew ...

関連する問題