+ int mem_max = 2000000;
+ struct map_cache *m_p;
+
+ m_p = xmalloc (sizeof(*m_p));
+ m_p->cf = cf;
+ m_p->max = mem_max / cf->head.block_size;
+ m_p->buf = xmalloc (mem_max);
+ m_p->no = 0;
+ m_p->map = xmalloc (sizeof(*m_p->map) * m_p->max);
+ return m_p;
+}
+
+static int map_cache_cmp_from (const void *p1, const void *p2)
+{
+ return ((struct map_cache_entity*) p1)->from -
+ ((struct map_cache_entity*) p2)->from;
+}
+
+static int map_cache_cmp_to(const void *p1, const void *p2)
+{
+ return ((struct map_cache_entity*) p1)->to -
+ ((struct map_cache_entity*) p2)->to;
+}
+
+static int map_cache_flush(struct map_cache *m_p)
+{
+ int i;
+
+ qsort (m_p->map, m_p->no, sizeof(*m_p->map), map_cache_cmp_from);
+ assert (m_p->no < 2 || m_p->map[0].from < m_p->map[1].from);
+ for (i = 0; i<m_p->no; i++)
+ {
+ if (mf_read(m_p->cf->block_mf, m_p->map[i].from, 0, 0,
+ m_p->buf + i * m_p->cf->head.block_size) != 1)
+ {
+ yaz_log (YLOG_FATAL, "read commit block at position %d",
+ m_p->map[i].from);
+ return -1;
+ }
+ m_p->map[i].from = i;
+ }
+ qsort (m_p->map, m_p->no, sizeof(*m_p->map), map_cache_cmp_to);
+ assert (m_p->no < 2 || m_p->map[0].to < m_p->map[1].to);
+ for (i = 0; i<m_p->no; i++)