/* * void= mt.__gc( proxy_ud ) * * End of life for a proxy object; reduce the deep reference count and clean * it up if reaches 0. */ static int deep_userdata_gc( lua_State *L ) { DEEP_PRELUDE **proxy= (DEEP_PRELUDE**)lua_touserdata( L, 1 ); DEEP_PRELUDE *p= *proxy; int v; *proxy= 0; // make sure we don't use it any more MUTEX_LOCK( &deep_lock ); v= --(p->refcount); MUTEX_UNLOCK( &deep_lock ); if (v==0) { int pushed; // Call 'idfunc( "delete", deep_ptr )' to make deep cleanup // lua_CFunction idfunc= get_idfunc(L,1); ASSERT_L(idfunc); lua_settop(L,0); // clean stack so we can call 'idfunc' directly // void= idfunc( "delete", lightuserdata ) // lua_pushliteral( L, "delete" ); lua_pushlightuserdata( L, p->deep ); pushed= idfunc(L); if (pushed) luaL_error( L, "Bad idfunc on \"delete\": returned something" ); DEEP_FREE( (void*)p ); } return 0; }
void free_deep_prelude( lua_State* L, DEEP_PRELUDE* prelude_) { // Call 'idfunc( "delete", deep_ptr )' to make deep cleanup lua_pushlightuserdata( L, prelude_->deep); ASSERT_L( prelude_->idfunc); prelude_->idfunc( L, eDO_delete); DEEP_FREE( (void*) prelude_); }