On Wed, Apr 28, 2010 at 03:26:29PM -0400, Stephen Gallagher wrote:
On 04/28/2010 02:57 PM, Stephen Gallagher wrote:
Simo made some excellent suggestions on IRC, so I have incorporated them:
First, I changed the interface for be_add_online_cb() so that it will now take a mem_ctx and pass back (if requested) the online_cb object. (This object is now opaque). This way, the callback will be automatically freed if the parent context goes away for any reason.
I removed the be_remove_online_cb() function, so the interface to remove a callback will simply be to call talloc_free() on the opaque object returned from be_add_online_cb. This will allow us to potentially set the same callback function multiple times, with different private data.
New patch attached.
Fix some style issues with the previous patch.
-- Stephen Gallagher RHCE 804006346421761
Delivering value year after year. Red Hat ranks #1 in value among software vendors. http://www.redhat.com/promo/vendor/
+static int online_cb_destructor(TALLOC_CTX *ptr); +int be_add_online_cb(TALLOC_CTX *mem_ctx,
struct be_ctx *ctx,
be_conn_online_callback_t cb,
void *pvt,
struct be_conn_online_cb **online_cb)
+{
- struct be_conn_online_cb *on_cb;
- if (!ctx || !cb) {
return EINVAL;
- }
- on_cb = talloc(mem_ctx, struct be_conn_online_cb);
- if (!online_cb) {
if (!on_cb) ??
bye, Sumit
return ENOMEM;
- }
- on_cb->cb = cb;
- on_cb->pvt = pvt;
- on_cb->be = ctx;
- DLIST_ADD(ctx->online_cb_list, on_cb);
- talloc_set_destructor((TALLOC_CTX *)on_cb, online_cb_destructor);
- /* Make sure we run the callback for the first
* connection after startup.
*/
- ctx->run_online_cb = true;
- if (online_cb) {
*online_cb = on_cb;
- }
- return EOK;
+}