On Thu, Feb 15, 2018 at 12:26 PM, Jim Jagielski <j...@jagunet.com> wrote:
> It seems like some serious overhead to force a function call
> for each and every access to a struct field, especially if
> it's only so we can adjust those struct fields w/o a corresponding
> change in the ABI...

Why would you do that?

The only modules who would call these functions would be those making
a duplicate of the entire structure.

Why does this happen? mod_cluster rearranges shm slots, I'm guessing.
mod_ftp took a completely generic server_rec, duplicated it, then
changed the value of the document_root member, and seeded new
request_rec structures in response to ftp commands. There are many
examples of why a _create() accessor is a good thing for module
developers, but it's not impossible to imagine these modules having a
need to make _copy() of one of our structures.

However we solve, the function template could be macroized, e.g.

#define AP_DECLARE_STRUCT_ACCESSORS(stype) \
  AP_DECLARE(struct stype *) ap_##stype##_palloc(apr_pool_t *p); \
  AP_DECLARE(apr_size_t) ap_##stype##_sizeof(); \
  AP_DECLARE(void) ap_##stype##_copy(struct stype *new, struct stype *orig);

#define AP_IMPLEMENT_STRUCT_ACCESSORS(stype) \
  AP_DECLARE(struct stype *) ap_##stype##_palloc(apr_pool_t *p) \
  { return apr_pcalloc(p, sizeof(struct stype)); } \
  AP_DECLARE(apr_size_t) ap_##stype##_sizeof() \
  { return sizeof(new); } \
  AP_DECLARE(void) ap_##stype##_copy(struct stype *new, struct stype *orig) \
  { return memcpy(new, orig, sizeof(struct stype)); }

The apr_stype_create() call has a whole lot more decorative things to
do by default, and can't really be macroized, but should be split as
necessary into context-free default initialization (ap_stype_create)
and the current phase-specific core logic (e.g. most of
core_create_conn as implemented today.)

Reply via email to