ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/plugins/cfperl/cfperl.xs
(Generate patch)

Comparing deliantra/server/plugins/cfperl/cfperl.xs (file contents):
Revision 1.16 by root, Wed Feb 8 04:32:19 2006 UTC vs.
Revision 1.20 by root, Thu Feb 9 01:15:25 2006 UTC

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.
82void 82void
83clean_obj_cache () 83clean_obj_cache ()
84{ 84{
85 return; // 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 }
108} 112}
109 113
110static SV * 114static SV *
111newSVptr (void *ptr, const char *klass) 115newSVptr (void *ptr, const char *klass)
112{ 116{
117 SV *sv;
118
113 if (!ptr) 119 if (!ptr)
114 return &PL_sv_undef; 120 return &PL_sv_undef;
115 121
116 HV *hv = newHV (); 122 sv = newSV (0);
117 sv_magic ((SV *)hv, 0, PERL_MAGIC_ext, (char *)ptr, 0); 123 sv_magic (sv, 0, PERL_MAGIC_ext, (char *)ptr, 0);
118 return sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1)); 124 return sv_bless (newRV_noinc (sv), gv_stashpv (klass, 1));
119} 125}
120 126
121static SV * 127static SV *
122newSVptr_cached (void *ptr, const char *klass) 128newSVptr_cached (void *ptr, const char *klass)
123{ 129{
130 136
131 if (he) 137 if (he)
132 sv = *he; 138 sv = *he;
133 else 139 else
134 { 140 {
135 sv = newSVptr (ptr, klass); 141 HV *hv = newHV ();
142 sv_magic ((SV *)hv, 0, PERL_MAGIC_ext, (char *)ptr, 0);
143 sv = sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1));
136 hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0); 144 hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0);
137 } 145 }
138 146
139 return newSVsv (sv); 147 return newSVsv (sv);
140} 148}
518 526
519 va_end (args); 527 va_end (args);
520 528
521 if (context.event_code == EVENT_FREE_OB) 529 if (context.event_code == EVENT_FREE_OB)
522 { 530 {
523 SV *sv = hv_delete (obj_cache, (char *)&context.activator, sizeof (object *), 0); 531 SV *sv = hv_delete (obj_cache, (char *)&context.activator, sizeof (void *), 0);
524 532
525 if (sv) 533 if (sv)
526 {
527 clearSVptr (sv); 534 clearSVptr (sv);
528 SvREFCNT_dec (sv);
529 }
530 } 535 }
531 else 536 else
532 inject_event ("cf::inject_global_event", &context); 537 inject_event ("cf::inject_global_event", &context);
533 538
534 rv = context.returnvalue; 539 rv = context.returnvalue;
1175int cf_object_get_flag (object *op, int flag) 1180int cf_object_get_flag (object *op, int flag)
1176 ALIAS: flag = 0 1181 ALIAS: flag = 0
1177 1182
1178void cf_object_set_flag (object *op, int flag, int value) 1183void cf_object_set_flag (object *op, int flag, int value)
1179 1184
1180void cf_object_move (object *op, int dir, object *originator) 1185void cf_object_move (object *op, int dir, object *originator = op)
1181 1186
1182void cf_object_apply (object *op, object *author, int flags = 0) 1187void cf_object_apply (object *op, object *author, int flags = 0)
1183 1188
1184void cf_object_apply_below (object *op) 1189void cf_object_apply_below (object *op)
1185 1190
1270 1275
1271object *cf_insert_ob_in_ob (object *ob, object *where) 1276object *cf_insert_ob_in_ob (object *ob, object *where)
1272 1277
1273object *get_nearest_player (object *ob) 1278object *get_nearest_player (object *ob)
1274 ALIAS: nearest_player = 0 1279 ALIAS: nearest_player = 0
1280 PREINIT:
1281 extern object *get_nearest_player (object *);
1275 1282
1276void rangevector (object *ob, object *other, int flags = 0) 1283void rangevector (object *ob, object *other, int flags = 0)
1277 PROTOTYPE: $$;$ 1284 PROTOTYPE: $$;$
1278 PPCODE: 1285 PPCODE:
1279{ 1286{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines