[asterisk-dev] [Code Review] Restore ao2 API compatibility and add new ao2_callback_data function
Mark Michelson
mmichelson at digium.com
Sat Nov 22 20:28:39 CST 2008
> On 2008-11-22 19:36:02, Sean Bright wrote:
> > /trunk/main/astobj2.c, lines 626-636
> > <http://reviewboard.digium.com/r/64/diff/1/?file=1603#file1603line626>
> >
> > This is really the meat and potatoes of the diff. Casting the void * to an appropriate function *. I think it's safe, but there may be a better way.
>
> wrote:
> I *think* the function pointer casting is fine, in that it makes sense to me. It would be nice to add in a check that could be executed at build time to be sure that if the type is WITH_DATA that the callback function is of the appropriate type, but I'm not sure if that's possible. As it is right now, I think that you could make a logic error (in that type is WITH_DATA but the cb_fn is of type ao2_callback_fn * instead of ao2_callback_data_fn *) but the compiler would not complain about it. Someone can correct me if this analysis is incorrect.
>
> I'm concerned with the change in logic for how match is set. I know it's somewhat paranoid, but in the case that, for whatever reason, we decide to add some new CMP_* return value for the callback function, then it requires changing the initialization of match here. If you initialize match to 0 and just assign the return value of the callback function to the match variable, then no such precaution needs to be taken. Plus, I think the notation is clearer when no bitwise logic is used.
>
> wrote:
> Well, you're right that the compiler would not complain. I will look at the GCC docs/mailing list to see if there is a way to check that stuff at runtime, or Kevin can pipe in because he's the GCC guru.
>
> As for the "change in logic" I don't know what you mean. The original code bitwise and-ed the result of the callback with (CMP_MATCH | CMP_STOP) as well, I just moved that to a single place instead of duplicating it with each function call, or am I not seeing something?
>
> wrote:
> And re: function pointer type safety - __ao2_callback is not callable from outside astobj2.c, and the delegating functions in astobj2.c both have the correct type information for their respective callbacks (ao2_callback_fn and ao2_callback_data_fn). So the only way this would be a problem would be if you were adding code into astobj.c itself.
Okay, I missed the fact that the result was originally bitwise anded with (CMP_MATCH | CMP_STOP). And with the last note you made, it sounds like everything's cool. I need to be more careful and look at the *entire* diff instead of just the "interesting" part so I don't make a blunder like the type-checking remark in my previous comment. Consider this a "Ship it!" from me.
- Mark
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://reviewboard.digium.com/r/64/#review153
-----------------------------------------------------------
On 2008-11-21 21:59:43, Sean Bright wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://reviewboard.digium.com/r/64/
> -----------------------------------------------------------
>
> (Updated 2008-11-21 21:59:43)
>
>
> Review request for Asterisk Developers.
>
>
> Summary
> -------
>
> This patch, for all intents and purposes, simply reverts the majority of the ao2 changes that added the 'void *data' argument to the ao2_callback_fn, ao2_callback, and ao2_find calls. It adds a new function, ao2_callback_data which takes the extra void *, and chan_sip is updated to use it (as this was the only place that was actually using the new argument).
>
> Not included in this patch is documentation of the new function ao2_callback_data. This will be added before commit. Secondly, Russell suggested adding an ao2_find_data, but this is problematic since this calls the cmp callback on the container being passed. I opted not to include it in this patch.
>
> The real meat-and-potatoes to keep an eye on are the changes to main/astobj2.c. The changes (casting a void * to the appropriate callback type) feels dirty, but it is necessary to avoid a good chunk of code duplication.
>
> (As a total aside, for those of you having problems using post-review, I used `post-review --branch=/trunk --username=seanbright --password=mypassword` in my WC and it worked perfectly)
>
>
> Diffs
> -----
>
> /trunk/apps/app_queue.c 158681
> /trunk/channels/chan_console.c 158681
> /trunk/channels/chan_iax2.c 158681
> /trunk/channels/chan_sip.c 158681
> /trunk/funcs/func_dialgroup.c 158681
> /trunk/include/asterisk/astobj2.h 158681
> /trunk/main/astobj2.c 158681
> /trunk/main/config.c 158681
> /trunk/main/features.c 158681
> /trunk/main/manager.c 158681
> /trunk/main/taskprocessor.c 158681
> /trunk/res/res_clialiases.c 158681
> /trunk/res/res_phoneprov.c 158681
> /trunk/res/res_timing_pthread.c 158681
> /trunk/res/res_timing_timerfd.c 158681
> /trunk/utils/hashtest2.c 158681
>
> Diff: http://reviewboard.digium.com/r/64/diff
>
>
> Testing
> -------
>
> Compilation and developer tests.
>
>
> Thanks,
>
> Sean
>
>
More information about the asterisk-dev
mailing list