static void _tarif_clear(gint tarif_id) { GSList **tarif = NULL; GSList *link = NULL; CCL_tarifpart *tp = NULL; GData *freed = NULL; tarif = g_new0(GSList *, 1); *tarif = g_datalist_id_get_data(&ccl->tarifs, tarif_id); g_assert(NULL != tarif); g_datalist_init(&freed); while ((link = g_slist_last(*tarif)) && *tarif) { *tarif = g_slist_remove_link(*tarif, link); tp = (CCL_tarifpart *) link->data; if (!g_datalist_id_get_data(&freed, GPOINTER_TO_INT(tp->prices))) { g_datalist_clear(tp->prices); g_datalist_id_set_data(&freed, GPOINTER_TO_INT(tp->prices), (void *)tp->prices); g_free(tp->prices); } g_slist_free_1(link); g_free(tp); } g_datalist_clear(&freed); *tarif = NULL; g_datalist_id_remove_data(&ccl->tarifs, tarif_id); g_free(tarif); }
int gs_pop_transaction(unsigned short id) { GData* transact_data = (GData*)thread_tls_get(&tls_transact_data); transaction_t* transact = g_datalist_id_get_data(&transact_data, (GQuark)id); if(!transact) return -1; if(transact->extra) free(transact->extra); g_datalist_id_remove_data(&transact_data, (GQuark)id); thread_tls_set(&tls_transact_data, transact_data); return 0; }
int gs_call_transaction(cid_t client_id, unsigned short id, nethost_t* client, nethost_t* server) { int retval; GData* transact_data = (GData*)thread_tls_get(&tls_transact_data); transaction_t* transact = g_datalist_id_get_data(&transact_data, (GQuark)id); if(!transact) return -1; retval = transact->function(client_id, client, server, transact->extra); if(transact->extra) free(transact->extra); g_datalist_id_remove_data(&transact_data, (GQuark)id); thread_tls_set(&tls_transact_data, transact_data); return retval; }