Example #1
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) {
        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;
}
Example #2
0
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;
}
Example #3
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;
}
Example #4
0
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;
}