static ULONG WINAPI xmlwriter_Release(IXmlWriter *iface) { xmlwriter *This = impl_from_IXmlWriter(iface); LONG ref; TRACE("%p\n", This); ref = InterlockedDecrement(&This->ref); if (ref == 0) { struct element *element, *element2; IMalloc *imalloc = This->imalloc; IXmlWriter_Flush(iface); if (This->output) IUnknown_Release(&This->output->IXmlWriterOutput_iface); /* element stack */ LIST_FOR_EACH_ENTRY_SAFE(element, element2, &This->elements, struct element, entry) { list_remove(&element->entry); free_element(This, element); } writer_free(This, This); if (imalloc) IMalloc_Release(imalloc); } return ref; }
int base_roll(struct base *base) { uint64_t log_number = logs_new_number(base->logs); if (log_number == 0) { log_error(base->db, "I have to open a new log, but it's " "impossible - too many log files are already opened. " "%s", ""); return -2; } writer_free(base->writer); base->writer = writer_new(base->log_dir, log_filename(log_number), 1); if (base->writer == NULL) { log_error(base->db, "Unable to create a new log, no %llu", (unsigned long long)log_number); return -1; } struct log *log = log_new_replay(base->db, log_number, base->log_dir, base->index_dir); if (log == NULL) { writer_free(base->writer); base->writer = NULL; log_error(base->db, "Can open new log file %llu for writing " "bug not for reading. Weird.", (unsigned long long)log_number); return -1; } log_do_replay(log, _dummy_reply_callback, NULL); struct log *newest = logs_newest(base->logs); log_freeze(newest); log_info(base->db, "log=%llx %6.1f MB committed, %6.1f MB used, " "%10u items (freezing)", (unsigned long long)log_get_number(newest), (float)log_disk_size(newest) / (1024*1024.), (float)log_used_size(newest) / (1024*1024.), log_sets_count(newest)); /* TODO: */ /* int r = log_save(newest); */ /* if (r != 0) { */ /* log_warn(base->db, "Can't save index for log %llu.", */ /* log_get_number(newest)); */ /* } */ logs_add(base->logs, log); return 0; }
static ULONG WINAPI xmlwriter_Release(IXmlWriter *iface) { xmlwriter *This = impl_from_IXmlWriter(iface); LONG ref; TRACE("%p\n", This); ref = InterlockedDecrement(&This->ref); if (ref == 0) { IMalloc *imalloc = This->imalloc; IXmlWriter_Flush(iface); if (This->output) IUnknown_Release(&This->output->IXmlWriterOutput_iface); writer_free(This, This); if (imalloc) IMalloc_Release(imalloc); } return ref; }
static void free_element(xmlwriter *writer, struct element *element) { writer_free(writer, element->qname); writer_free(writer, element); }
Writer* writer_unref(Writer *w) { if (w && (-- w->n_ref <= 0)) writer_free(w); return NULL; }