[ 
https://issues.apache.org/jira/browse/AXIS2C-254?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Samisa Abeysinghe updated AXIS2C-254:
-------------------------------------

    Fix Version/s: 1.0.0

> ops structs should be statically-allocated and shared
> -----------------------------------------------------
>
>                 Key: AXIS2C-254
>                 URL: https://issues.apache.org/jira/browse/AXIS2C-254
>             Project: Axis2-C
>          Issue Type: Improvement
>    Affects Versions: Current (Nightly)
>            Reporter: Samisa Abeysinghe
>             Fix For: 1.0.0
>
>
> At the moment, when objects have an ops field pointing to an *_ops
> struct with function pointers, you are dynamically allocating a separate
> copy of the ops struct for each instance of the class. The whole point
> of factoring out the function pointers into a separate ops struct is so
> that a single statically-allocated ops struct can be shared between all
> instances of a given class.
> Thus the pattern is supposed to be something like this:
> /* bar.h */
> typedef struct bar bar_t;
> typedef struct bar_ops {
>   void destroy(bar_t *);
>   void x(bar_t *);
> } bar_ops_t;
> struct bar {
>   const bar_ops_t *ops;
> };
> #define BAR_X(b) ((f)->ops->x(b))
> bar_t *bar1_create();
> bar_t *bar2_create();
> /* bar1.c */
> typedef struct bar1 {
>   bar_t base;
>   int some_private_data;
> } bar1_t;
> static void destroy1(bar_t *);
> static void x1(bar_t *);
> static const bar_ops_t bar1_ops = {
>   destroy1,
>   x1
> };
> bar_t *bar1_create()
> {
>    bar1_t *b1 = malloc(sizeof(bar1_t));
>    b1->ops = &bar1_ops;
>    b1->some_private_date = 42;
>    return &b1->base;
> }
> static
> void destroy1(bar_t *bar)
> {
>    free(bar)
> }
> Points to note:
> - the ops member of struct bar is a const pointer
> - bar1_ops is both static and const
> - the method implementations like x1 are all declared static (although
> the x1 function will be called from outside bar1.c, it is only called
> via the function pointer, so its name does not need to be exported)
> - the create/destroy methods do a single allocation/deallocation
> Fixing this will cut the number of allocations that you do in half!
> (based on comments by James)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to