+ struct SnapshotNodeInfo *bi = (struct SnapshotNodeInfo *)bi_raw;
+
+ num_snapshot_buffers--;
+ num_snapshot_bytes -= bi->size;
+
+ 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 single shapshot or list of snapshots
+// -----------------------------------------------------------------------------
+
+static void FreeSnapshot(void *snapshot_buffers_ptr)
+{
+ FreeSnapshotBuffers(snapshot_buffers_ptr);
+}
+
+void FreeSnapshotSingle(void)
+{
+ 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--;
+ next_snapshot_key = (snapshot_list ? atoi(snapshot_list->key) + 1 : 0);
+ }
+}
+
+void FreeSnapshotList(void)
+{
+#if DEBUG_SNAPSHOTS
+ printf("::: FreeSnapshotList()\n");
+#endif
+
+ FreeSnapshotList_UpToNode(NULL);
+
+ num_snapshots = 0;
+ num_snapshot_buffers = 0;
+ num_snapshot_bytes = 0;
+ next_snapshot_key = 0;
+
+ snapshot_current = NULL;
+}
+
+static void ReduceSnapshotList(void)
+{
+#if DEBUG_SNAPSHOTS
+ printf("::: (Reducing number of snapshots from %d ",
+ num_snapshots);
+#endif
+
+ // maximum number of snapshots exceeded -- thin out list of snapshots
+ ListNode *node = snapshot_list;
+ int num_snapshots_to_skip = num_snapshots / 10;
+
+ // do not remove the newest snapshots from the list
+ while (node && num_snapshots_to_skip--)
+ node = node->next;