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.129 by root, Sun Jan 7 21:54:59 2007 UTC vs.
Revision 1.134 by root, Tue Jan 9 21:32:42 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
110attachable::refcnt_cnt () const
111{
112 return refcnt + (self ? SvREFCNT (self) : 0);
113}
114
115void
109void attachable::optimise () 116attachable::optimise ()
110{ 117{
111 if (self 118 if (self
112 && SvREFCNT (self) == 1 119 && SvREFCNT (self) == 1
113 && !HvTOTALKEYS (self)) 120 && !HvTOTALKEYS (self))
114 { 121 {
115 flags &= ~F_BORROWED;
116 refcnt_inc (); 122 refcnt_inc ();
117 SvREFCNT_dec ((SV *)self); 123 SvREFCNT_dec ((SV *)self);
118 } 124 }
119} 125}
120 126
121// check wether the object really is dead 127// check wether the object really is dead
122void 128void
123attachable::do_check () 129attachable::do_check ()
124{ 130{
125 if (refcnt > 0) 131 if (refcnt > 0 || refcnt_cnt () > 0)
126 return; 132 return;
127 133
128 optimise (); 134 destroy ();
129 135
130 if (self) 136 if (self)
131 { 137 {
132 if (refcnt + SvREFCNT (self) > 0) 138 hv_clear (self);
133 return; 139 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
134
135 assert (flags & F_BORROWED);
136
137 flags &= ~F_BORROWED;
138 refcnt_inc ();
139 SvREFCNT_dec (self); 140 SvREFCNT_dec (self);
140 self = 0; 141 self = 0;
141 } 142 }
142
143 if (refcnt > 0)
144 return;
145
146 destroy ();
147} 143}
148 144
149void 145void
150attachable::do_destroy () 146attachable::do_destroy ()
151{ 147{
165 161
166 flags |= F_DESTROYED; 162 flags |= F_DESTROYED;
167 do_destroy (); 163 do_destroy ();
168} 164}
169 165
166void
170void attachable::check_mortals () 167attachable::check_mortals ()
171{ 168{
172 for (int i = 0; i < mortals.size (); ) 169 for (int i = 0; i < mortals.size (); )
173 { 170 {
174 attachable *obj = mortals [i]; 171 attachable *obj = mortals [i];
175 172
219 216
220static int 217static int
221attachable_free (pTHX_ SV *sv, MAGIC *mg) 218attachable_free (pTHX_ SV *sv, MAGIC *mg)
222{ 219{
223 attachable *at = (attachable *)mg->mg_ptr; 220 attachable *at = (attachable *)mg->mg_ptr;
224 assert (!(at->flags & attachable::F_BORROWED));
225 at->self = 0; 221 at->self = 0;
226 // 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
227 //at->refcnt_chk (); 223 //at->refcnt_chk ();
228 return 0; 224 return 0;
229} 225}
240 { 236 {
241 obj->self = newHV (); 237 obj->self = newHV ();
242 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);
243 239
244 // borrow the refcnt from the object 240 // borrow the refcnt from the object
245 obj->flags |= attachable::F_BORROWED; 241 // it is important thta no refcnt_chk is being executed here
246 obj->refcnt_dec (); 242 obj->refcnt_dec ();
247 243
248 // now bless the object _once_ 244 // now bless the object _once_
249 return sv_bless (newRV_inc ((SV *)obj->self), stash); 245 return sv_bless (newRV_inc ((SV *)obj->self), stash);
250 } 246 }
822} 818}
823 819
824///////////////////////////////////////////////////////////////////////////// 820/////////////////////////////////////////////////////////////////////////////
825 821
826void 822void
827maptile::emergency_save () 823cfperl_emergency_save ()
828{ 824{
829 CALL_BEGIN (0); 825 CALL_BEGIN (0);
830 CALL_CALL ("cf::map::emergency_save", G_VOID); 826 CALL_CALL ("cf::emergency_save", G_VOID);
831 CALL_END; 827 CALL_END;
832} 828}
833 829
834maptile * 830maptile *
835maptile::find_sync (const char *path, maptile *origin) 831maptile::find_sync (const char *path, maptile *origin)
1608 } 1604 }
1609 OUTPUT: RETVAL 1605 OUTPUT: RETVAL
1610 1606
1611void abort () 1607void abort ()
1612 1608
1609void cleanup (const char *cause, bool make_core = false)
1610
1613void emergency_save () 1611void emergency_save ()
1614 1612
1615void _exit (int status = 0) 1613void _exit (int status = 0)
1616 1614
1617#if _POSIX_MEMLOCK 1615#if _POSIX_MEMLOCK
1707 PPCODE: 1705 PPCODE:
1708 EXTEND (SP, object::mortals.size ()); 1706 EXTEND (SP, object::mortals.size ());
1709 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i) 1707 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1710 PUSHs (to_sv (*i)); 1708 PUSHs (to_sv (*i));
1711 1709
1712object *first () 1710int objects_size ()
1713 CODE: 1711 CODE:
1714 RETVAL = object::first; 1712 RETVAL = objects.size ();
1713 OUTPUT: RETVAL
1714
1715object *objects (U32 index)
1716 CODE:
1717 RETVAL = index < objects.size () ? objects [index] : 0;
1718 OUTPUT: RETVAL
1719
1720int actives_size ()
1721 CODE:
1722 RETVAL = actives.size ();
1723 OUTPUT: RETVAL
1724
1725object *actives (U32 index)
1726 CODE:
1727 RETVAL = index < actives.size () ? actives [index] : 0;
1715 OUTPUT: RETVAL 1728 OUTPUT: RETVAL
1716 1729
1717# missing properties 1730# missing properties
1718 1731
1719object *head (object *op) 1732object *head (object *op)
1720 PROTOTYPE: $ 1733 PROTOTYPE: $
1721 CODE: 1734 CODE:
1722 RETVAL = op->head ? op->head : op; 1735 RETVAL = op->head_ ();
1723 OUTPUT: RETVAL 1736 OUTPUT: RETVAL
1724 1737
1725int is_head (object *op) 1738int is_head (object *op)
1726 PROTOTYPE: $ 1739 PROTOTYPE: $
1727 CODE: 1740 CODE:
1728 RETVAL = !op->head; 1741 RETVAL = op->head_ () == op;
1729 OUTPUT: RETVAL 1742 OUTPUT: RETVAL
1730 1743
1731void 1744void
1732inv (object *obj) 1745inv (object *obj)
1733 PROTOTYPE: $ 1746 PROTOTYPE: $
2045void 2058void
2046list () 2059list ()
2047 PPCODE: 2060 PPCODE:
2048 for_all_players (pl) 2061 for_all_players (pl)
2049 XPUSHs (sv_2mortal (to_sv (pl))); 2062 XPUSHs (sv_2mortal (to_sv (pl)));
2050
2051bool
2052peaceful (player *pl, bool new_setting = 0)
2053 PROTOTYPE: $;$
2054 CODE:
2055 RETVAL = pl->peaceful;
2056 if (items > 1)
2057 pl->peaceful = new_setting;
2058 OUTPUT:
2059 RETVAL
2060
2061living *
2062orig_stats (player *pl)
2063 CODE:
2064 RETVAL = &pl->orig_stats;
2065 OUTPUT: RETVAL
2066
2067living *
2068last_stats (player *pl)
2069 CODE:
2070 RETVAL = &pl->last_stats;
2071 OUTPUT: RETVAL
2072 2063
2073 2064
2074MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ 2065MODULE = cf PACKAGE = cf::map PREFIX = cf_map_
2075 2066
2076int invoke (maptile *map, int event, ...) 2067int invoke (maptile *map, int event, ...)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines