void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer **memoryBuffers)
{
	if (this->m_chunkExecutionStates[chunkNumber] == COM_ES_SCHEDULED)
		this->m_chunkExecutionStates[chunkNumber] = COM_ES_EXECUTED;

	atomic_add_and_fetch_u(&this->m_chunksFinished, 1);
	if (memoryBuffers) {
		for (unsigned int index = 0; index < this->m_cachedMaxReadBufferOffset; index++) {
			MemoryBuffer *buffer = memoryBuffers[index];
			if (buffer) {
				if (buffer->isTemporarily()) {
					memoryBuffers[index] = NULL;
					delete buffer;
				}
			}
		}
		MEM_freeN(memoryBuffers);
	}
	if (this->m_bTree) {
		// status report is only performed for top level Execution Groups.
		float progress = this->m_chunksFinished;
		progress /= this->m_numberOfChunks;
		this->m_bTree->progress(this->m_bTree->prh, progress);

		char buf[128];
		BLI_snprintf(buf, sizeof(buf), IFACE_("Compositing | Tile %u-%u"),
		             this->m_chunksFinished,
		             this->m_numberOfChunks);
		this->m_bTree->stats_draw(this->m_bTree->sdh, buf);
	}
}