static void test_for_size(size_t size) { struct ewah_bitmap *a = generate_bitmap(size); struct ewah_bitmap *b = generate_bitmap(size); struct ewah_bitmap *result = ewah_new(); size_t i; struct { const char *name; void (*generate)(struct ewah_bitmap *, struct ewah_bitmap *, struct ewah_bitmap *); size_t (*check)(size_t, size_t); } tests[] = { {"or", &ewah_or, &op_or}, {"xor", &ewah_xor, &op_xor}, {"and", &ewah_and, &op_and}, {"and-not", &ewah_and_not, &op_andnot} }; for (i = 0; i < sizeof(tests)/sizeof(tests[0]); ++i) { fprintf(stderr, "'%s' in %zu bits... ", tests[i].name, size); tests[i].generate(a, b, result); if (verify_operation(a, b, result, tests[i].check)) fprintf(stderr, "OK\n"); ewah_clear(result); } ewah_free(a); ewah_free(b); ewah_free(result); }
void write_fsmonitor_extension(struct strbuf *sb, struct index_state *istate) { uint32_t hdr_version; uint64_t tm; uint32_t ewah_start; uint32_t ewah_size = 0; int fixup = 0; put_be32(&hdr_version, INDEX_EXTENSION_VERSION); strbuf_add(sb, &hdr_version, sizeof(uint32_t)); put_be64(&tm, istate->fsmonitor_last_update); strbuf_add(sb, &tm, sizeof(uint64_t)); fixup = sb->len; strbuf_add(sb, &ewah_size, sizeof(uint32_t)); /* we'll fix this up later */ ewah_start = sb->len; ewah_serialize_strbuf(istate->fsmonitor_dirty, sb); ewah_free(istate->fsmonitor_dirty); istate->fsmonitor_dirty = NULL; /* fix up size field */ put_be32(&ewah_size, sb->len - ewah_start); memcpy(sb->buf + fixup, &ewah_size, sizeof(uint32_t)); trace_printf_key(&trace_fsmonitor, "write fsmonitor extension successful"); }
int read_fsmonitor_extension(struct index_state *istate, const void *data, unsigned long sz) { const char *index = data; uint32_t hdr_version; uint32_t ewah_size; struct ewah_bitmap *fsmonitor_dirty; int ret; if (sz < sizeof(uint32_t) + sizeof(uint64_t) + sizeof(uint32_t)) return error("corrupt fsmonitor extension (too short)"); hdr_version = get_be32(index); index += sizeof(uint32_t); if (hdr_version != INDEX_EXTENSION_VERSION) return error("bad fsmonitor version %d", hdr_version); istate->fsmonitor_last_update = get_be64(index); index += sizeof(uint64_t); ewah_size = get_be32(index); index += sizeof(uint32_t); fsmonitor_dirty = ewah_new(); ret = ewah_read_mmap(fsmonitor_dirty, index, ewah_size); if (ret != ewah_size) { ewah_free(fsmonitor_dirty); return error("failed to parse ewah bitmap reading fsmonitor index extension"); } istate->fsmonitor_dirty = fsmonitor_dirty; trace_printf_key(&trace_fsmonitor, "read fsmonitor extension successful"); return 0; }
void ewah_pool_free(struct ewah_bitmap *self) { if (self == NULL) return; if (bitmap_pool_size == BITMAP_POOL_MAX || self->alloc_size == 0) { ewah_free(self); return; } ewah_clear(self); bitmap_pool[bitmap_pool_size++] = self; }
void tweak_fsmonitor(struct index_state *istate) { int i; int fsmonitor_enabled = git_config_get_fsmonitor(); if (istate->fsmonitor_dirty) { if (fsmonitor_enabled) { /* Mark all entries valid */ for (i = 0; i < istate->cache_nr; i++) { istate->cache[i]->ce_flags |= CE_FSMONITOR_VALID; } /* Mark all previously saved entries as dirty */ ewah_each_bit(istate->fsmonitor_dirty, fsmonitor_ewah_callback, istate); /* Now mark the untracked cache for fsmonitor usage */ if (istate->untracked) istate->untracked->use_fsmonitor = 1; } ewah_free(istate->fsmonitor_dirty); istate->fsmonitor_dirty = NULL; } switch (fsmonitor_enabled) { case -1: /* keep: do nothing */ break; case 0: /* false */ remove_fsmonitor(istate); break; case 1: /* true */ add_fsmonitor(istate); break; default: /* unknown value: do nothing */ break; } }