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

Comparing deliantra/server/server/cfperl.xs (file contents):
Revision 1.131 by root, Mon Jan 8 18:18:35 2007 UTC vs.
Revision 1.135 by root, Wed Jan 10 01:16:54 2007 UTC

101 101
102unordered_vector<attachable *> attachable::mortals; 102unordered_vector<attachable *> attachable::mortals;
103 103
104attachable::~attachable () 104attachable::~attachable ()
105{ 105{
106 assert (!(flags & F_BORROWED)); 106 assert (!self);
107} 107}
108 108
109int 109int
110attachable::refcnt_cnt () const 110attachable::refcnt_cnt () const
111{ 111{
117{ 117{
118 if (self 118 if (self
119 && SvREFCNT (self) == 1 119 && SvREFCNT (self) == 1
120 && !HvTOTALKEYS (self)) 120 && !HvTOTALKEYS (self))
121 { 121 {
122 flags &= ~F_BORROWED;
123 refcnt_inc (); 122 refcnt_inc ();
124 SvREFCNT_dec ((SV *)self); 123 SvREFCNT_dec ((SV *)self);
125 } 124 }
126} 125}
127 126
128// check wether the object really is dead 127// check wether the object really is dead
129void 128void
130attachable::do_check () 129attachable::do_check ()
131{ 130{
132 if (refcnt > 0) 131 if (refcnt > 0 || refcnt_cnt () > 0)
133 return; 132 return;
134 133
135 optimise (); 134 destroy ();
136 135
137 if (self) 136 if (self)
138 { 137 {
139 if (refcnt + SvREFCNT (self) > 0) 138 hv_clear (self);
140 return; 139 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
141
142 assert (flags & F_BORROWED);
143
144 flags &= ~F_BORROWED;
145 refcnt_inc ();
146 SvREFCNT_dec (self); 140 SvREFCNT_dec (self);
147 self = 0; 141 self = 0;
148 } 142 }
149
150 if (refcnt > 0)
151 return;
152
153 destroy ();
154} 143}
155 144
156void 145void
157attachable::do_destroy () 146attachable::do_destroy ()
158{ 147{
227 216
228static int 217static int
229attachable_free (pTHX_ SV *sv, MAGIC *mg) 218attachable_free (pTHX_ SV *sv, MAGIC *mg)
230{ 219{
231 attachable *at = (attachable *)mg->mg_ptr; 220 attachable *at = (attachable *)mg->mg_ptr;
232 assert (!(at->flags & attachable::F_BORROWED));
233 at->self = 0; 221 at->self = 0;
234 // next line makes sense, but most objects still have refcnt 0 by default 222 // next line makes sense, but most objects still have refcnt 0 by default
235 //at->refcnt_chk (); 223 //at->refcnt_chk ();
236 return 0; 224 return 0;
237} 225}
248 { 236 {
249 obj->self = newHV (); 237 obj->self = newHV ();
250 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0); 238 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0);
251 239
252 // borrow the refcnt from the object 240 // borrow the refcnt from the object
253 obj->flags |= attachable::F_BORROWED; 241 // it is important thta no refcnt_chk is being executed here
254 obj->refcnt_dec (); 242 obj->refcnt_dec ();
255 243
256 // now bless the object _once_ 244 // now bless the object _once_
257 return sv_bless (newRV_inc ((SV *)obj->self), stash); 245 return sv_bless (newRV_inc ((SV *)obj->self), stash);
258 } 246 }
830} 818}
831 819
832///////////////////////////////////////////////////////////////////////////// 820/////////////////////////////////////////////////////////////////////////////
833 821
834void 822void
835maptile::emergency_save () 823cfperl_emergency_save ()
836{ 824{
837 CALL_BEGIN (0); 825 CALL_BEGIN (0);
838 CALL_CALL ("cf::map::emergency_save", G_VOID); 826 CALL_CALL ("cf::emergency_save", G_VOID);
839 CALL_END; 827 CALL_END;
840} 828}
841 829
842maptile * 830maptile *
843maptile::find_sync (const char *path, maptile *origin) 831maptile::find_sync (const char *path, maptile *origin)
844{ 832{
845 CALL_BEGIN (2); 833 CALL_BEGIN (2);
846 CALL_ARG (path); 834 CALL_ARG (path);
847 CALL_ARG (origin); 835 CALL_ARG (origin);
848 CALL_CALL ("cf::map::find_sync", G_SCALAR); 836 CALL_CALL ("cf::map::find_sync", G_SCALAR);
837
838 maptile *retval;
839
840 if (count)
841 sv_to (POPs, retval);
842 else
843 retval = 0;
844
845 CALL_END;
846
847 return retval;
848}
849
850maptile *
851maptile::find_async (const char *path, maptile *origin)
852{
853 CALL_BEGIN (2);
854 CALL_ARG (path);
855 CALL_ARG (origin);
856 CALL_CALL ("cf::map::find_async", G_SCALAR);
849 857
850 maptile *retval; 858 maptile *retval;
851 859
852 if (count) 860 if (count)
853 sv_to (POPs, retval); 861 sv_to (POPs, retval);
1616 } 1624 }
1617 OUTPUT: RETVAL 1625 OUTPUT: RETVAL
1618 1626
1619void abort () 1627void abort ()
1620 1628
1629void cleanup (const char *cause, bool make_core = false)
1630
1621void emergency_save () 1631void emergency_save ()
1622 1632
1623void _exit (int status = 0) 1633void _exit (int status = 0)
1624 1634
1625#if _POSIX_MEMLOCK 1635#if _POSIX_MEMLOCK
1715 PPCODE: 1725 PPCODE:
1716 EXTEND (SP, object::mortals.size ()); 1726 EXTEND (SP, object::mortals.size ());
1717 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i) 1727 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1718 PUSHs (to_sv (*i)); 1728 PUSHs (to_sv (*i));
1719 1729
1720object *first () 1730int objects_size ()
1721 CODE: 1731 CODE:
1722 RETVAL = object::first; 1732 RETVAL = objects.size ();
1733 OUTPUT: RETVAL
1734
1735object *objects (U32 index)
1736 CODE:
1737 RETVAL = index < objects.size () ? objects [index] : 0;
1738 OUTPUT: RETVAL
1739
1740int actives_size ()
1741 CODE:
1742 RETVAL = actives.size ();
1743 OUTPUT: RETVAL
1744
1745object *actives (U32 index)
1746 CODE:
1747 RETVAL = index < actives.size () ? actives [index] : 0;
1723 OUTPUT: RETVAL 1748 OUTPUT: RETVAL
1724 1749
1725# missing properties 1750# missing properties
1726 1751
1727object *head (object *op) 1752object *head (object *op)
1728 PROTOTYPE: $ 1753 PROTOTYPE: $
1729 CODE: 1754 CODE:
1730 RETVAL = op->head ? op->head : op; 1755 RETVAL = op->head_ ();
1731 OUTPUT: RETVAL 1756 OUTPUT: RETVAL
1732 1757
1733int is_head (object *op) 1758int is_head (object *op)
1734 PROTOTYPE: $ 1759 PROTOTYPE: $
1735 CODE: 1760 CODE:
1736 RETVAL = !op->head; 1761 RETVAL = op->head_ () == op;
1737 OUTPUT: RETVAL 1762 OUTPUT: RETVAL
1738 1763
1739void 1764void
1740inv (object *obj) 1765inv (object *obj)
1741 PROTOTYPE: $ 1766 PROTOTYPE: $

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines