diff --git a/src/embed/embed.c b/src/embed/embed.c index ddb9009c6..d4b1608cb 100644 --- a/src/embed/embed.c +++ b/src/embed/embed.c @@ -29,6 +29,21 @@ void ext_php_rs_sapi_startup() { zend_signal_startup(); } +SAPI_API void ext_php_rs_sapi_shutdown() { + #ifdef ZTS + tsrm_shutdown(); + #endif +} + +SAPI_API void ext_php_rs_sapi_per_thread_init() { + #ifdef ZTS + (void)ts_resource(0); + #ifdef PHP_WIN32 + ZEND_TSRMLS_CACHE_UPDATE(); + #endif + #endif +} + void ext_php_rs_php_error(int type, const char *format, ...) { va_list args; va_start(args, format); diff --git a/src/embed/embed.h b/src/embed/embed.h index 41a5e0b17..ae6b7c382 100644 --- a/src/embed/embed.h +++ b/src/embed/embed.h @@ -7,5 +7,7 @@ void* ext_php_rs_embed_callback(int argc, char** argv, void* (*callback)(void *), void *ctx); void ext_php_rs_sapi_startup(); +void ext_php_rs_sapi_shutdown(); +void ext_php_rs_sapi_per_thread_init(); void ext_php_rs_php_error(int type, const char *format, ...); diff --git a/src/embed/ffi.rs b/src/embed/ffi.rs index 91ce3a59e..f0ad11436 100644 --- a/src/embed/ffi.rs +++ b/src/embed/ffi.rs @@ -18,6 +18,9 @@ extern "C" { ) -> *mut c_void; pub fn ext_php_rs_sapi_startup(); + pub fn ext_php_rs_sapi_shutdown(); + pub fn ext_php_rs_sapi_per_thread_init(); + pub fn ext_php_rs_php_error( type_: ::std::os::raw::c_int, error_msg: *const ::std::os::raw::c_char, diff --git a/src/embed/sapi.rs b/src/embed/sapi.rs index 4053a7512..dfe5092b5 100644 --- a/src/embed/sapi.rs +++ b/src/embed/sapi.rs @@ -6,6 +6,9 @@ use crate::ffi::sapi_module_struct; /// A Zend module entry, also known as an extension. pub type SapiModule = sapi_module_struct; +unsafe impl Send for SapiModule {} +unsafe impl Sync for SapiModule {} + impl SapiModule { /// Allocates the module entry on the heap, returning a pointer to the /// memory location. The caller is responsible for the memory pointed to. diff --git a/src/zend/globals.rs b/src/zend/globals.rs index f080b3439..329d2e613 100644 --- a/src/zend/globals.rs +++ b/src/zend/globals.rs @@ -562,6 +562,7 @@ impl SapiGlobals { } } +/// Stores SAPI headers. Exposed through `SapiGlobals`. pub type SapiHeaders = sapi_headers_struct; impl<'a> SapiHeaders { @@ -571,6 +572,7 @@ impl<'a> SapiHeaders { } } +/// Manage a key/value pair of SAPI headers. pub type SapiHeader = sapi_header_struct; impl<'a> SapiHeader { diff --git a/src/zend/mod.rs b/src/zend/mod.rs index 5ee46ebae..f43c14ce3 100644 --- a/src/zend/mod.rs +++ b/src/zend/mod.rs @@ -28,6 +28,8 @@ pub use globals::ExecutorGlobals; pub use globals::FileGlobals; pub use globals::ProcessGlobals; pub use globals::SapiGlobals; +pub use globals::SapiHeader; +pub use globals::SapiHeaders; pub use globals::SapiModule; pub use handlers::ZendObjectHandlers; pub use ini_entry_def::IniEntryDef;