… | |
… | |
80 | // all objects no longer referenced and empty are |
80 | // all objects no longer referenced and empty are |
81 | // eligible for destruction. |
81 | // eligible for destruction. |
82 | void |
82 | void |
83 | clean_obj_cache () |
83 | clean_obj_cache () |
84 | { |
84 | { |
85 | return; //D // killing neko-san gives me an unreferenced scalar |
85 | static int count; |
|
|
86 | |
|
|
87 | if (++count & 7) |
|
|
88 | return; |
|
|
89 | |
86 | int todo = 10; |
90 | int todo = 1000; |
87 | do |
91 | do |
88 | { |
92 | { |
89 | I32 klen; |
93 | I32 klen; |
90 | char *key; |
94 | char *key; |
91 | HE *he = hv_iternext (obj_cache); |
95 | HE *he = hv_iternext (obj_cache); |
92 | |
96 | |
93 | if (he) |
97 | if (he) |
94 | { |
98 | { |
95 | SV *sv = hv_iterval (obj_cache, he); |
99 | SV *sv = hv_iterval (obj_cache, he); |
96 | |
100 | |
97 | // emopty and unreferened? nuke it |
101 | // empty and unreferenced? nuke it |
98 | if (SvREFCNT (sv) == 1 && SvREFCNT (SvRV (sv)) == 1 && !HvFILL ((HV *)(SvRV (sv)))) |
102 | if (SvREFCNT (sv) == 1 && SvREFCNT (SvRV (sv)) == 1 && !HvFILL ((HV *)(SvRV (sv)))) |
99 | { |
103 | { |
100 | hv_delete (obj_cache, HeKEY (he), HeKLEN (he), G_DISCARD); |
104 | hv_delete (obj_cache, HeKEY (he), HeKLEN (he), G_DISCARD); |
101 | todo++; |
105 | todo++; |
102 | } |
106 | } |
… | |
… | |
130 | |
134 | |
131 | if (he) |
135 | if (he) |
132 | sv = *he; |
136 | sv = *he; |
133 | else |
137 | else |
134 | { |
138 | { |
135 | return sv; //D |
|
|
136 | sv = newSVptr (ptr, klass); |
139 | sv = newSVptr (ptr, klass); |
137 | hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0); |
140 | hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0); |
138 | } |
141 | } |
139 | |
142 | |
140 | return newSVsv (sv); |
143 | return newSVsv (sv); |
… | |
… | |
519 | |
522 | |
520 | va_end (args); |
523 | va_end (args); |
521 | |
524 | |
522 | if (context.event_code == EVENT_FREE_OB) |
525 | if (context.event_code == EVENT_FREE_OB) |
523 | { |
526 | { |
524 | SV *sv = hv_delete (obj_cache, (char *)&context.activator, sizeof (object *), 0); |
527 | SV **svp = hv_fetch (obj_cache, (char *)&context.activator, sizeof (void *), 0); |
525 | |
528 | |
526 | if (sv) |
529 | if (svp) |
527 | { |
|
|
528 | clearSVptr (sv); |
530 | clearSVptr (*svp); |
529 | SvREFCNT_dec (sv); |
|
|
530 | } |
|
|
531 | } |
531 | } |
532 | else |
532 | else |
533 | inject_event ("cf::inject_global_event", &context); |
533 | inject_event ("cf::inject_global_event", &context); |
534 | |
534 | |
535 | rv = context.returnvalue; |
535 | rv = context.returnvalue; |
… | |
… | |
1271 | |
1271 | |
1272 | object *cf_insert_ob_in_ob (object *ob, object *where) |
1272 | object *cf_insert_ob_in_ob (object *ob, object *where) |
1273 | |
1273 | |
1274 | object *get_nearest_player (object *ob) |
1274 | object *get_nearest_player (object *ob) |
1275 | ALIAS: nearest_player = 0 |
1275 | ALIAS: nearest_player = 0 |
|
|
1276 | PREINIT: |
|
|
1277 | extern object *get_nearest_player (object *); |
1276 | |
1278 | |
1277 | void rangevector (object *ob, object *other, int flags = 0) |
1279 | void rangevector (object *ob, object *other, int flags = 0) |
1278 | PROTOTYPE: $$;$ |
1280 | PROTOTYPE: $$;$ |
1279 | PPCODE: |
1281 | PPCODE: |
1280 | { |
1282 | { |