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.140 by root, Sat Jan 13 23:06:13 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 }
259 else 247 else
248 {
260 return newRV_inc ((SV *)obj->self); 249 SV *sv = newRV_inc ((SV *)obj->self);
250
251 if (Gv_AMG (stash)) // handle overload correctly, as the perl core does not
252 SvAMAGIC_on (sv);
253
254 return sv;
255 }
261} 256}
262 257
263static void 258static void
264clearSVptr (SV *sv) 259clearSVptr (SV *sv)
265{ 260{
318inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); } 313inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); }
319 314
320inline SV *to_sv (object & v) { return to_sv (&v); } 315inline SV *to_sv (object & v) { return to_sv (&v); }
321inline SV *to_sv (living & v) { return to_sv (&v); } 316inline SV *to_sv (living & v) { return to_sv (&v); }
322 317
323//TODO:
324inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 318inline SV *to_sv (New_Face * v) { return to_sv (v->name); }
325inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 319inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
326 320
327inline SV *to_sv (UUID v) 321inline SV *to_sv (UUID v)
328{ 322{
354inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); } 348inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); }
355inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); } 349inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); }
356inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); } 350inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); }
357inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); } 351inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); }
358 352
359inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO 353inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; }
360inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); } // TODO 354inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); }
361 355
362template<class T> 356template<class T>
363inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; } 357inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; }
364 358
365template<int N> 359template<int N>
501 if (!ext->cb) 495 if (!ext->cb)
502 ext->cb = newAV (); 496 ext->cb = newAV ();
503 497
504 return newRV_inc ((SV *)ext->cb); 498 return newRV_inc ((SV *)ext->cb);
505} 499}
506
507#if 0
508void attachable::clear ()
509{
510 if (self)
511 {
512 // disconnect Perl from C, to avoid crashes
513 sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext);
514
515 // clear the perl hash, might or might not be a good idea
516 hv_clear ((HV *)SvRV ((SV *)self));
517
518 SvREFCNT_dec (self);
519 self = 0;
520 }
521
522 if (cb)
523 {
524 SvREFCNT_dec (cb);
525 cb = 0;
526 }
527
528 attach = 0;
529}
530#endif
531 500
532///////////////////////////////////////////////////////////////////////////// 501/////////////////////////////////////////////////////////////////////////////
533 502
534extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 503extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
535{ 504{
830} 799}
831 800
832///////////////////////////////////////////////////////////////////////////// 801/////////////////////////////////////////////////////////////////////////////
833 802
834void 803void
835maptile::emergency_save () 804cfperl_emergency_save ()
836{ 805{
837 CALL_BEGIN (0); 806 CALL_BEGIN (0);
838 CALL_CALL ("cf::map::emergency_save", G_VOID); 807 CALL_CALL ("cf::emergency_save", G_VOID);
839 CALL_END; 808 CALL_END;
840} 809}
841 810
842maptile * 811maptile *
843maptile::find_sync (const char *path, maptile *origin) 812maptile::find_sync (const char *path, maptile *origin)
844{ 813{
845 CALL_BEGIN (2); 814 CALL_BEGIN (2);
846 CALL_ARG (path); 815 CALL_ARG (path);
847 CALL_ARG (origin); 816 CALL_ARG (origin);
848 CALL_CALL ("cf::map::find_sync", G_SCALAR); 817 CALL_CALL ("cf::map::find_sync", G_SCALAR);
818
819 maptile *retval;
820
821 if (count)
822 sv_to (POPs, retval);
823 else
824 retval = 0;
825
826 CALL_END;
827
828 return retval;
829}
830
831maptile *
832maptile::find_async (const char *path, maptile *origin)
833{
834 CALL_BEGIN (2);
835 CALL_ARG (path);
836 CALL_ARG (origin);
837 CALL_CALL ("cf::map::find_async", G_SCALAR);
849 838
850 maptile *retval; 839 maptile *retval;
851 840
852 if (count) 841 if (count)
853 sv_to (POPs, retval); 842 sv_to (POPs, retval);
1258 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1247 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1259 const_iv (FLAG_IS_WATER) 1248 const_iv (FLAG_IS_WATER)
1260 const_iv (FLAG_CONTENT_ON_GEN) 1249 const_iv (FLAG_CONTENT_ON_GEN)
1261 const_iv (FLAG_IS_A_TEMPLATE) 1250 const_iv (FLAG_IS_A_TEMPLATE)
1262 const_iv (FLAG_IS_BUILDABLE) 1251 const_iv (FLAG_IS_BUILDABLE)
1252 const_iv (FLAG_DESTROY_ON_DEATH)
1253 const_iv (FLAG_NO_SAVE)
1263 1254
1264 const_iv (NDI_BLACK) 1255 const_iv (NDI_BLACK)
1265 const_iv (NDI_WHITE) 1256 const_iv (NDI_WHITE)
1266 const_iv (NDI_NAVY) 1257 const_iv (NDI_NAVY)
1267 const_iv (NDI_RED) 1258 const_iv (NDI_RED)
1616 } 1607 }
1617 OUTPUT: RETVAL 1608 OUTPUT: RETVAL
1618 1609
1619void abort () 1610void abort ()
1620 1611
1612void cleanup (const char *cause, bool make_core = false)
1613
1621void emergency_save () 1614void emergency_save ()
1622 1615
1623void _exit (int status = 0) 1616void _exit (int status = 0)
1624 1617
1625#if _POSIX_MEMLOCK 1618#if _POSIX_MEMLOCK
1715 PPCODE: 1708 PPCODE:
1716 EXTEND (SP, object::mortals.size ()); 1709 EXTEND (SP, object::mortals.size ());
1717 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i) 1710 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1718 PUSHs (to_sv (*i)); 1711 PUSHs (to_sv (*i));
1719 1712
1720object *first () 1713int objects_size ()
1721 CODE: 1714 CODE:
1722 RETVAL = object::first; 1715 RETVAL = objects.size ();
1716 OUTPUT: RETVAL
1717
1718object *objects (U32 index)
1719 CODE:
1720 RETVAL = index < objects.size () ? objects [index] : 0;
1721 OUTPUT: RETVAL
1722
1723int actives_size ()
1724 CODE:
1725 RETVAL = actives.size ();
1726 OUTPUT: RETVAL
1727
1728object *actives (U32 index)
1729 CODE:
1730 RETVAL = index < actives.size () ? actives [index] : 0;
1723 OUTPUT: RETVAL 1731 OUTPUT: RETVAL
1724 1732
1725# missing properties 1733# missing properties
1726 1734
1727object *head (object *op) 1735object *head (object *op)
1728 PROTOTYPE: $ 1736 PROTOTYPE: $
1729 CODE: 1737 CODE:
1730 RETVAL = op->head ? op->head : op; 1738 RETVAL = op->head_ ();
1731 OUTPUT: RETVAL 1739 OUTPUT: RETVAL
1732 1740
1733int is_head (object *op) 1741int is_head (object *op)
1734 PROTOTYPE: $ 1742 PROTOTYPE: $
1735 CODE: 1743 CODE:
1736 RETVAL = !op->head; 1744 RETVAL = op->head_ () == op;
1737 OUTPUT: RETVAL 1745 OUTPUT: RETVAL
1738 1746
1739void 1747void
1740inv (object *obj) 1748inv (object *obj)
1741 PROTOTYPE: $ 1749 PROTOTYPE: $
2117 2125
2118object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny) 2126object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny)
2119 C_ARGS: str, map, nx, ny 2127 C_ARGS: str, map, nx, ny
2120 2128
2121void 2129void
2122cf_map_normalise (maptile *map, int x, int y) 2130get_map_flags (maptile *map, int x, int y)
2123 PPCODE: 2131 PPCODE:
2124{ 2132{
2125 maptile *nmap = 0; 2133 maptile *nmap = 0;
2126 I16 nx = 0, ny = 0; 2134 I16 nx = 0, ny = 0;
2127 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2135 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2189 CODE: 2197 CODE:
2190 RETVAL = get_name_of_region_for_map (m); 2198 RETVAL = get_name_of_region_for_map (m);
2191 OUTPUT: RETVAL 2199 OUTPUT: RETVAL
2192 2200
2193# worst xs function of my life 2201# worst xs function of my life
2194maptile * 2202bool
2195_create_random_map (\ 2203_create_random_map (\
2196 char *path,\ 2204 maptile *self,\
2197 char *wallstyle,\ 2205 char *wallstyle,\
2198 char *wall_name,\ 2206 char *wall_name,\
2199 char *floorstyle,\ 2207 char *floorstyle,\
2200 char *monsterstyle,\ 2208 char *monsterstyle,\
2201 char *treasurestyle,\ 2209 char *treasurestyle,\
2226 int random_seed,\ 2234 int random_seed,\
2227 val64 total_map_hp,\ 2235 val64 total_map_hp,\
2228 int map_layout_style,\ 2236 int map_layout_style,\
2229 int treasureoptions,\ 2237 int treasureoptions,\
2230 int symmetry_used,\ 2238 int symmetry_used,\
2231 region *region\ 2239 region *region,\
2240 char *custom\
2232) 2241)
2233 CODE: 2242 CODE:
2234{ 2243{
2235 random_map_params rmp; 2244 random_map_params rmp;
2236 2245
2268 rmp.total_map_hp = total_map_hp; 2277 rmp.total_map_hp = total_map_hp;
2269 rmp.map_layout_style = map_layout_style; 2278 rmp.map_layout_style = map_layout_style;
2270 rmp.treasureoptions = treasureoptions; 2279 rmp.treasureoptions = treasureoptions;
2271 rmp.symmetry_used = symmetry_used; 2280 rmp.symmetry_used = symmetry_used;
2272 rmp.region = region; 2281 rmp.region = region;
2282 rmp.custom = custom;
2273 2283
2274 RETVAL = generate_random_map (path, &rmp); 2284 RETVAL = self->generate_random_map (&rmp);
2275} 2285}
2276 OUTPUT: 2286 OUTPUT:
2277 RETVAL 2287 RETVAL
2278 2288
2279MODULE = cf PACKAGE = cf::arch 2289MODULE = cf PACKAGE = cf::arch

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines