Commit 5e97b34d authored by Nick Mathewson's avatar Nick Mathewson 🥔
Browse files

On windows, don't force-unlink active conscache objects.

Part of a fix for bug 22752: We can't unlink these because Windows
doesn't allow you to unlink an in-use file.
parent 6307a759
Loading
Loading
Loading
Loading
+22 −4
Original line number Diff line number Diff line
@@ -9,6 +9,11 @@

#define CCE_MAGIC 0x17162253

#ifdef _WIN32
/* On Windows, unlink won't work if there's an active mmap. */
#define MUST_UNMAP_TO_UNLINK
#endif

/**
 * A consensus_cache_entry_t is a reference-counted handle to an
 * item in a consensus_cache_t.  It can be mmapped into RAM, or not,
@@ -406,23 +411,36 @@ int
consensus_cache_get_n_filenames_available(consensus_cache_t *cache)
{
  tor_assert(cache);
  int max = storage_dir_get_max_files(cache->dir);
  int max = cache->max_entries;
  int used = smartlist_len(storage_dir_list(cache->dir));
#ifdef MUST_UNMAP_TO_UNLINK
  if (used > max)
    return 0;
#else
  tor_assert_nonfatal(max >= used);
#endif
  return max - used;
}

/**
 * Delete every element of <b>cache</b> has been marked with
 * consensus_cache_entry_mark_for_removal. If <b>force</b> is false,
 * retain those entries which are not in use except by the cache.
 * retain those entries which are in use by something other than the cache.
 */
void
consensus_cache_delete_pending(consensus_cache_t *cache, int force)
{
  SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) {
    tor_assert_nonfatal(ent->in_cache == cache);
    if (! force) {
    int force_ent = force;
#ifdef MUST_UNMAP_TO_UNLINK
    /* We cannot delete anything with an active mmap on win32, so no
     * force-deletion. */
    if (ent->map) {
      force_ent = 0;
    }
#endif
    if (! force_ent) {
      if (ent->refcnt > 1 || BUG(ent->in_cache == NULL)) {
        /* Somebody is using this entry right now */
        continue;