static int agmtlist_delete_callback(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg) { Repl_Agmt *ra; Object *ro; slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name, "agmt_delete: begin\n"); ro = objset_find(agmt_set, agmt_dn_cmp, (const void *)slapi_entry_get_sdn_const(e)); ra = (NULL == ro) ? NULL : (Repl_Agmt *)object_get_data(ro); if (NULL == ra) { slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name, "agmtlist_delete: " "Tried to delete replication agreement \"%s\", but no such " "agreement was configured.\n", slapi_sdn_get_dn(slapi_entry_get_sdn_const(e))); } else { agmt_stop(ra); object_release(ro); /* Release ref acquired in objset_find */ objset_remove_obj(agmt_set, ro); /* Releases a reference (should be final reference */ } *returncode = LDAP_SUCCESS; return SLAPI_DSE_CALLBACK_OK; }
/* find the instance in the objset and remove it */ int ldbm_instance_destroy(ldbm_instance *inst) { Object *object = NULL; struct ldbminfo *li = inst->inst_li; object = objset_find(li->li_instance_set, ldbm_instance_comparator, inst); if (object == NULL) { return -1; } /* decref from objset_find */ object_release(object); /* now remove from the instance set */ objset_remove_obj(li->li_instance_set, object); return 0; }
void agmtlist_shutdown() { Repl_Agmt *ra; Object *ro; Object *next_ro; ro = objset_first_obj(agmt_set); while (NULL != ro) { ra = (Repl_Agmt *)object_get_data(ro); agmt_stop(ra); agmt_update_consumer_ruv (ra); next_ro = objset_next_obj(agmt_set, ro); /* Object ro was released in objset_next_obj, * but the address ro can be still used to remove ro from objset. */ objset_remove_obj(agmt_set, ro); ro = next_ro; } objset_delete(&agmt_set); agmt_set = NULL; }