… | |
… | |
169 | { |
169 | { |
170 | SvREFCNT_dec (cb); |
170 | SvREFCNT_dec (cb); |
171 | cb = 0; |
171 | cb = 0; |
172 | } |
172 | } |
173 | |
173 | |
174 | if (self) |
|
|
175 | sever_self (); |
|
|
176 | |
|
|
177 | mortals.push_back (this); |
174 | mortals.push_back (this); |
178 | } |
175 | } |
179 | |
176 | |
180 | void |
177 | void |
181 | attachable::destroy () |
178 | attachable::destroy () |
… | |
… | |
197 | if (i >= mortals.size ()) |
194 | if (i >= mortals.size ()) |
198 | { |
195 | { |
199 | i = 0; |
196 | i = 0; |
200 | |
197 | |
201 | if (mortals.size () > 1000) |
198 | if (mortals.size () > 1000) |
202 | fprintf (stderr, "mortal queue size (%d) exceeds 1000.\n", (int)mortals.size ()); |
199 | LOG (llevInfo, "mortal queue size (%d) exceeds 1000.\n", (int)mortals.size ()); |
203 | |
200 | |
204 | break; |
201 | break; |
205 | } |
202 | } |
206 | |
203 | |
207 | attachable *obj = mortals [i]; |
204 | attachable *obj = mortals [i]; |
208 | |
205 | |
209 | obj->refcnt_chk (); // unborrow from perl, if necessary |
206 | #if 0 |
|
|
207 | if (obj->self)//D make this an assert later |
|
|
208 | { |
|
|
209 | LOG (llevError, "check_mortals: object '%s' still has self\n", typeid (obj).name ()); |
|
|
210 | obj->sever_self (); |
|
|
211 | } |
|
|
212 | #endif |
210 | |
213 | |
211 | if (obj->refcnt || obj->self) |
214 | if (obj->refcnt_cnt ()) |
212 | { |
215 | { |
213 | ++i; // further delay freeing |
216 | ++i; // further delay freeing |
214 | |
217 | |
215 | if (!(i & 0x3ff)) |
218 | if (!(i & 0x3ff)) |
216 | break; |
219 | break; |
217 | } |
220 | } |
218 | else |
221 | else |
219 | { |
222 | { |
220 | mortals.erase (i); |
223 | mortals.erase (i); |
|
|
224 | obj->sever_self (); |
221 | delete obj; |
225 | delete obj; |
222 | } |
226 | } |
223 | } |
227 | } |
224 | } |
228 | } |
225 | |
229 | |