+void LoadSnapshotBuffers(ListNode *snapshot_buffers)
+{
+ while (snapshot_buffers != NULL)
+ {
+ LoadSnapshotBuffer((struct SnapshotNodeInfo *)snapshot_buffers->content);
+
+ snapshot_buffers = snapshot_buffers->next;
+ }
+}
+
+static void FreeSnapshotBuffer(void *bi_raw)
+{
+ struct SnapshotNodeInfo *bi = (struct SnapshotNodeInfo *)bi_raw;
+
+#if DEBUG_SNAPSHOTS
+ num_snapshot_buffers--;
+ num_snapshot_bytes -= bi->size;
+#endif
+
+ checked_free(bi->buffer_copy);
+ checked_free(bi);
+}
+
+void FreeSnapshotBuffers(ListNode *snapshot_buffers)
+{
+ while (snapshot_buffers != NULL)
+ deleteNodeFromList(&snapshot_buffers, NULL, FreeSnapshotBuffer);
+}
+
+// -----------------------------------------------------------------------------
+// functions for handling one of several snapshots
+// -----------------------------------------------------------------------------
+
+static void FreeSnapshot(void *snapshot_buffers_ptr)
+{
+ FreeSnapshotBuffers(snapshot_buffers_ptr);
+}
+
+void FreeSnapshotSingle()
+{
+ FreeSnapshotBuffers(snapshot_single);
+
+ snapshot_single = NULL;
+}
+
+static void FreeSnapshotList_UpToNode(ListNode *node)
+{
+ while (snapshot_list != node)
+ {
+#if DEBUG_SNAPSHOTS
+ printf("::: FreeSnapshotList_*() [%s, %d, %d]\n",
+ snapshot_list->key, num_snapshot_buffers, num_snapshot_bytes);
+#endif
+
+ deleteNodeFromList(&snapshot_list, snapshot_list->key, FreeSnapshot);
+
+ num_snapshots_in_list--;
+ }
+}
+
+void FreeSnapshotList()