2020-10-28 05:16:30 +00:00
|
|
|
#ifndef CMEME_C
|
|
|
|
#define CMEME_C // meme lol
|
|
|
|
|
|
|
|
#include "cosmo.h"
|
|
|
|
|
|
|
|
#include "cstate.h"
|
|
|
|
|
2020-11-12 23:02:12 +00:00
|
|
|
//#define GC_STRESS
|
2020-10-28 05:16:30 +00:00
|
|
|
//#define GC_DEBUG
|
|
|
|
// arrays will grow by a factor of 2
|
|
|
|
#define GROW_FACTOR 2
|
|
|
|
#define HEAP_GROW_FACTOR 2
|
|
|
|
#define ARRAY_START 8
|
|
|
|
|
|
|
|
#define cosmoM_freearray(state, type, buf, capacity) \
|
|
|
|
cosmoM_reallocate(state, buf, sizeof(type) *capacity, 0)
|
|
|
|
|
|
|
|
#define cosmoM_growarray(state, type, buf, count, capacity) \
|
|
|
|
if (count >= capacity || buf == NULL) { \
|
|
|
|
int old = capacity; \
|
2020-11-26 05:34:02 +00:00
|
|
|
capacity = old * GROW_FACTOR; \
|
2020-10-28 05:16:30 +00:00
|
|
|
buf = (type*)cosmoM_reallocate(state, buf, sizeof(type) *old, sizeof(type) *capacity); \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define cosmoM_free(state, type, x) \
|
|
|
|
cosmoM_reallocate(state, x, sizeof(type), 0)
|
|
|
|
|
|
|
|
#define cosmoM_isFrozen(state) \
|
|
|
|
state->freezeGC > 0
|
|
|
|
|
2020-11-03 04:32:39 +00:00
|
|
|
// if debugging, print the locations of when the state is frozen/unfrozen
|
|
|
|
#ifdef GC_DEBUG
|
|
|
|
#define cosmoM_freezeGC(state) \
|
|
|
|
state->freezeGC++; \
|
|
|
|
printf("freezing state at %s:%d [%d]\n", __FILE__, __LINE__, state->freezeGC)
|
|
|
|
|
|
|
|
#define cosmoM_unfreezeGC(state) \
|
|
|
|
state->freezeGC--; \
|
2020-11-19 20:41:21 +00:00
|
|
|
printf("unfreezing state at %s:%d [%d]\n", __FILE__, __LINE__, state->freezeGC); \
|
|
|
|
cosmoM_checkGarbage(state, 0)
|
2020-11-03 04:32:39 +00:00
|
|
|
#else
|
2020-10-28 05:16:30 +00:00
|
|
|
#define cosmoM_freezeGC(state) \
|
|
|
|
state->freezeGC++
|
|
|
|
|
2020-11-20 20:50:43 +00:00
|
|
|
#define cosmoM_unfreezeGC(state) \
|
2020-11-19 20:41:21 +00:00
|
|
|
state->freezeGC--; \
|
|
|
|
cosmoM_checkGarbage(state, 0)
|
|
|
|
|
2020-11-03 04:32:39 +00:00
|
|
|
#endif
|
2020-10-28 05:16:30 +00:00
|
|
|
|
2020-11-17 09:10:55 +00:00
|
|
|
COSMO_API void *cosmoM_reallocate(CState *state, void *buf, size_t oldSize, size_t newSize);
|
2020-11-17 20:32:20 +00:00
|
|
|
COSMO_API bool cosmoM_checkGarbage(CState *state, size_t needed); // returns true if GC event was triggered
|
2020-11-17 09:10:55 +00:00
|
|
|
COSMO_API void cosmoM_collectGarbage(CState *state);
|
|
|
|
COSMO_API void cosmoM_updateThreshhold(CState *state);
|
2020-10-28 05:16:30 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
wrapper for cosmoM_reallocate so we can track our memory usage (it's also safer :P)
|
|
|
|
*/
|
|
|
|
static inline void *cosmoM_xmalloc(CState *state, size_t sz) {
|
|
|
|
return cosmoM_reallocate(state, NULL, 0, sz);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|