--- deliantra/server/plugins/cfperl/cfperl.xs 2006/02/08 05:22:41 1.17 +++ deliantra/server/plugins/cfperl/cfperl.xs 2006/02/08 06:15:13 1.18 @@ -82,8 +82,12 @@ void clean_obj_cache () { - return; //D // killing neko-san gives me an unreferenced scalar - int todo = 10; + static int count; + + if (++count & 7) + return; + + int todo = 1000; do { I32 klen; @@ -94,7 +98,7 @@ { SV *sv = hv_iterval (obj_cache, he); - // emopty and unreferened? nuke it + // empty and unreferenced? nuke it if (SvREFCNT (sv) == 1 && SvREFCNT (SvRV (sv)) == 1 && !HvFILL ((HV *)(SvRV (sv)))) { hv_delete (obj_cache, HeKEY (he), HeKLEN (he), G_DISCARD); @@ -132,7 +136,6 @@ sv = *he; else { - return sv; //D sv = newSVptr (ptr, klass); hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0); } @@ -521,13 +524,10 @@ if (context.event_code == EVENT_FREE_OB) { - SV *sv = hv_delete (obj_cache, (char *)&context.activator, sizeof (object *), 0); + SV **svp = hv_fetch (obj_cache, (char *)&context.activator, sizeof (void *), 0); - if (sv) - { - clearSVptr (sv); - SvREFCNT_dec (sv); - } + if (svp) + clearSVptr (*svp); } else inject_event ("cf::inject_global_event", &context); @@ -1273,6 +1273,8 @@ object *get_nearest_player (object *ob) ALIAS: nearest_player = 0 + PREINIT: + extern object *get_nearest_player (object *); void rangevector (object *ob, object *other, int flags = 0) PROTOTYPE: $$;$