Example #1
0
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
  lua_State *L = (lua_State *)ud;
  int mode = L == NULL ? 0 : G(L)->egcmode;
  void *nptr;

  if (nsize == 0) {
    c_free(ptr);
    return NULL;
  }
  if (L != NULL && (mode & EGC_ALWAYS)) /* always collect memory if requested */
    luaC_fullgc(L);
  if(nsize > osize && L != NULL) {
#if defined(LUA_STRESS_EMERGENCY_GC)
    luaC_fullgc(L);
#endif
    if(G(L)->memlimit > 0 && (mode & EGC_ON_MEM_LIMIT) && l_check_memlimit(L, nsize - osize))
      return NULL;
  }
  nptr = (void *)c_realloc(ptr, nsize);
  if (nptr == NULL && L != NULL && (mode & EGC_ON_ALLOC_FAILURE)) {
    luaC_fullgc(L); /* emergency full collection. */
    nptr = (void *)c_realloc(ptr, nsize); /* try allocation again */
  }
  return nptr;
}
Example #2
0
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
  lua_State *L = (lua_State *)ud;
  void *nptr;
  if (nsize == 0) {
    free(ptr);
    return NULL;
  }
  if(nsize > osize && L != NULL) {
    if(G(L)->memlimit > 0 && l_check_memlimit(L, nsize - osize))
      return NULL;
  }
  nptr = realloc(ptr, nsize);
  if (nptr == NULL && L != NULL) {
    luaC_fullgc(L); /* emergency full collection. */
    nptr = realloc(ptr, nsize); /* try allocation again */
  }
  return nptr;
}