# `YSI_NO_HEAP_MALLOC` In almost all cases of issues, the solution is to define `YSI_NO_HEAP_MALLOC`. So why is this not the default? Simply because many people complained about the alternative. With `YSI_NO_HEAP_MALLOC` your AMX is much larger because the allocation pool is embedded in the file. But if you are having problems that's just the price you need to pay. # Issues ## I keep running out of memory. First, ensure you are `free`ing the memory when you are finished with it. Failure to do this will result in a "memory leak". If you are sure you are doing that, you might need a bigger pool of memory for y_malloc to use. This is done with `MALLOC_MEMORY`: ```pawn #define MALLOC_MEMORY (32768) #include ``` ## My mode just stops working after several restarts. This is a known issue with the heap allocation version of y_malloc. To fix it, use the non-heap version by doing: ```pawn #define YSI_NO_HEAP_MALLOC #include ``` This will make your mode larger (because the allocation pool is now included in the mode), but more stable. # Errors ## `error 017: undefined symbol "_is_now_DYNAMIC_MEMORY_"` This will occur on: ```pawn #pragma dynamic 65536 ``` The error tries to explain the problem. y_malloc can allocate memory from the heap or from global memory. If you are not using `YSI_NO_HEAP_MALLOC` it will use the heap (obviously), aka. dynamic memory. Because of this, it needs to control how much dynamic memory there is. Thus, instead of using `#pragma dynamic`, use `DYNAMIC_MEMORY`: ```pawn #define DYNAMIC_MEMORY (65536) #include ``` ## `warning 203: symbol is never used: "dynamic_is_now_DYNAMIC_MEMORY_"` This happens when you have a variable or function called `dynamic` that isn't used. Because of the way y_malloc overrides `#pragma dynamic`, ALL instances of `dynamic` are replaced. So this: ```pawn MyFunc(dynamic) { } ``` Becomes: ```pawn MyFunc(dynamic_is_now_DYNAMIC_MEMORY_) { } ``` In most cases this ins't actually a problem - the variable declaration will be replaced, but so will all the uses, so they will still refer to the correct variable. Note that this only happens without `YSI_NO_HEAP_MALLOC`. ## `error 017: undefined symbol "dynamic_is_now_DYNAMIC_MEMORY_"` This is similar to the last warning, but when not all instances of `dynamic` have been replaced. This only happens when some come before including y_malloc and some come after: ```pawn dynamic() // Not replaced. { printf("hi"); } #include main() { dynamic(); // Replaced. } ``` To fix, use `YSI_NO_HEAP_MALLOC` or move the offending function: ```pawn #include dynamic() // Not replaced. { printf("hi"); } main() { dynamic(); // Replaced. } ``` ## `*** YSI Error: y_malloc with JIT requires "#define YSI_NO_HEAP_MALLOC"` Full message: ``` *** YSI Error: y_malloc with JIT requires "#define YSI_NO_HEAP_MALLOC" *** YSI Warning: JIT disabled [jit] Compilation was disabled ``` The heap allocation method relies on a small bug in the PAWN VM (virtual machine). This bug doesn't exist in the JIT VM, so that method can't be used with the JIT plugin. If you compile y_malloc for heap allocation and try use the JIT it can't work, and will fall back on the original VM. To use JIT, compile with `YSI_NO_HEAP_MALLOC`: ```pawn #define YSI_NO_HEAP_MALLOC #include ```