void write_str(const std::string &v) { size_t l = v.length(); write_size_t(l); _write(v.data(), l); }
static void state_manager_push_do(state_manager_t *state) { #if STRICT_BUF_SIZE memcpy(state->nextblock, state->debugblock, state->debugsize); #endif static struct retro_perf_counter gen_deltas = {0}; uint8_t *swap = NULL; if (state->thisblock_valid) { const uint8_t *oldb, *newb; uint8_t *compressed; size_t headpos, tailpos, remaining; if (state->capacity < sizeof(size_t) + state->maxcompsize) return; recheckcapacity:; headpos = state->head - state->data; tailpos = state->tail - state->data; remaining = (tailpos + state->capacity - sizeof(size_t) - headpos - 1) % state->capacity + 1; if (remaining <= state->maxcompsize) { state->tail = state->data + read_size_t(state->tail); state->entries--; goto recheckcapacity; } performance_counter_init(&gen_deltas, "gen_deltas"); performance_counter_start(&gen_deltas); oldb = state->thisblock; newb = state->nextblock; compressed = state->head + sizeof(size_t); compressed += state_manager_raw_compress(oldb, newb, state->blocksize, compressed); if (compressed - state->data + state->maxcompsize > state->capacity) { compressed = state->data; if (state->tail == state->data + sizeof(size_t)) state->tail = state->data + read_size_t(state->tail); } write_size_t(compressed, state->head-state->data); compressed += sizeof(size_t); write_size_t(state->head, compressed-state->data); state->head = compressed; performance_counter_stop(&gen_deltas); } else state->thisblock_valid = true; swap = state->thisblock; state->thisblock = state->nextblock; state->nextblock = swap; state->entries++; }