> On Thu, Jan 20, 2022 at 1:56 AM Su, Tao <tao...@intel.com> 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

Reply via email to