int br_iterate_utemplates_file(FILE *file, br_utemplate_callback callback, br_callback_context context, bool parallel) { int count = 0; QFutureSynchronizer<void> futures; while (true) { br_utemplate t = (br_utemplate) malloc(sizeof(br_universal_template)); if (!read_buffer(file, (char*) t, sizeof(br_universal_template))) { free(t); break; } t = (br_utemplate) realloc(t, sizeof(br_universal_template) + t->mdSize + t->fvSize); if (!read_buffer(file, (char*) &t->data, t->mdSize + t->fvSize)) { free(t); // Try to rewind header read if (fseek(file, -sizeof(br_universal_template), SEEK_CUR)) qFatal("Unable to recover from partial template read!"); break; } if (parallel) futures.addFuture(QtConcurrent::run(callAndFree, callback, t, context)); else callAndFree(callback, t, context); count++; } return count; }
void br_iterate_utemplates_file(FILE *file, br_utemplate_callback callback, br_callback_context context, bool parallel) { QFutureSynchronizer<void> futures; while (true) { br_utemplate t = (br_utemplate) malloc(sizeof(br_universal_template)); if (!read_buffer(file, (char*) t, sizeof(br_universal_template), true)) { free(t); return; } t = (br_utemplate) realloc(t, sizeof(br_universal_template) + t->size); read_buffer(file, (char*) &t->data, t->size, false); if (parallel) futures.addFuture(QtConcurrent::run(callAndFree, callback, t, context)); else callAndFree(callback, t, context); } futures.waitForFinished(); }