static int lrelease(lua_State *L) { struct cell_ud * cud = lua_touserdata(L,1); cell_release(cud->c); cud->c = NULL; return 0; }
static void INTEGER32_destroy (uclptr_t int_exemplair) { if (sizeof(int32_t) != sizeof(uclptr_t)) /* определяется на этапе компиляции */ { cell_release (int_exemplair); }; }
void dechunk (uclptr_t starting_chunk) { uclptr_t chunk, next; for (chunk = starting_chunk; !IS_NIL(chunk); chunk = next) { next = _CAR(chunk); cell_release(chunk); } }
static void STRING_destroy (uclptr_t string_exemplair) { //char* str = *(char**)&uclmem[string_exemplair]; char *str = STRING_data(string_exemplair); free(str); if (sizeof(char*) <= sizeof(cell_t)) { cell_release(string_exemplair); } else { dechunk (string_exemplair); } }
static void VECTOR_destroy (uclptr_t vector_exemplair) { ucl_vector_t *vector = VECTOR_data(vector_exemplair); uint32_t i; for (i=0; i < vector->length; i++) { uclptr_t index = vector->ptr[i]; if (index != NIL) delete_this(index); } free(vector->ptr); free(vector); if (sizeof(uclptr_t*) <= sizeof(cell_t)) { cell_release(vector_exemplair); } else { dechunk (vector_exemplair); } }
int cell_dispatch_message(struct cell *c) { cell_lock(c); if (c->quit) { cell_destroy(c); return CELL_QUIT; } struct message m; int empty = mq_pop(&c->mq, &m); if (empty || c->L == NULL) { cell_unlock(c); return CELL_EMPTY; } cell_grab(c); cell_unlock(c); lua_pushvalue(c->L, 1); // dup callback lua_pushinteger(c->L, m.port); lua_pushlightuserdata(c->L, m.buffer); lua_call(c->L, 2, 0); cell_release(c); return CELL_MESSAGE; }