> On Thu, Jan 20, 2022 at 1:56 AM Su, Tao <[email protected]> wrote:
> >
> > Hello internals,
> >
> > I am trying to read Zend header files to understand its functional
> > interfaces,
> > but have got confusion and anybody knows why zend_startup_system_id()
> and zend_finalize_system_id()
> > do not have to be protected by BEGIN_EXTERN_C()/END_EXTERN_C()
> enclosure,
> > but zend_add_system_entropy() has to.
> >
> > Is the following code intentional for any reason?
> > And also, these two functions do not have ZEND_API attribute. Thanks.
> >
> > Zend/zend_system_id.h
> > BEGIN_EXTERN_C()
> > /* True global; Write-only during MINIT/startup */
> > extern ZEND_API char zend_system_id[32];
> >
> > ZEND_API ZEND_RESULT_CODE zend_add_system_entropy(const char
> *module_name, const char *hook_name, const void *data, size_t size);
> > END_EXTERN_C()
> >
> > void zend_startup_system_id(void);
> > void zend_finalize_system_id(void);
> >
> >
> > =======================================
> > Tony Su (Su, Tao)
> > make a 'lazy' programmer diligently with efficiency
> >
>
> I haven't looked at the details of these specific functions recently,
> but in general functions which are marked ZEND_API are capable of
> being called from extensions and modules. These same ZEND_API
> functions need to be in `extern "C"` sections for that to happen if
> the extension or module is using C++.
>
> I would guess that `zend_startup_system_id` and
> `zend_finalize_system_id` do not need to be used outside of the engine
> but needed to have a forward declaration for code organization
> reasons.
Thanks Levi for the clarification. Things become clearer. Here are some
following questions
1) when you say 'outside of the engine', what is the boundary of outside/inside?
My understanding is that all code under Zend/ folder is considered as
inside the Zend engine;
Other components outside that folder should be considered as consumer/user
of Zend.
Is this correct? Pls fix me if I mistook something.
Functions marked with ZEND_API in header files under Zend/ folder
should be thought as the interface for outside users. Technically,
these functions should be marked with `extern "C"` to support
C++ extension/module.
Is this correct? Pls fix me if I mistook something.
2) a quick search shows that main/main.c calls zend_startup_system_id()
If main/main.c is a Zend user, logically, zend_startup_system_id()
should be declared with ZEND_API and extern "C"?
/* extract from main/main.c::php_module_startup() */
/* Begin to fingerprint the process state */
zend_startup_system_id();
3) I found another Zend/zend_gdb.h header file where three functions
are marked with ZEND_API but are not enclosed by `extern "C"`.
/* Zend/zend_gdb.h */
ZEND_API bool zend_gdb_register_code(const void *object, size_t size);
ZEND_API void zend_gdb_unregister_all(void);
ZEND_API bool zend_gdb_present(void);
4) In Zend/zend.gdb.c source file, I saw a function
__jit_debug_register_code()
marked with ZEND_API, but not declared in header file?
Logically and programmatically, I got confused and could not grasp
ZEND_API usage style.
/* Zend/zend_gdb.c */
ZEND_API zend_never_inline void __jit_debug_register_code(void)
{
__asm__ __volatile__("");
}
-- Tao Su