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.132 by root, Mon Jan 8 20:59:15 2007 UTC vs.
Revision 1.146 by root, Fri Jan 19 22:24:10 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 if (flags & F_BORROWED)
143 {
144 flags &= ~F_BORROWED;
145 refcnt_inc ();
146 SvREFCNT_dec (self); 140 SvREFCNT_dec (self);
147 } 141 self = 0;
148
149 if (self)
150 if (refcnt + SvREFCNT (self) > 0)
151 return;
152 } 142 }
153
154 if (refcnt > 0)
155 return;
156
157 destroy ();
158} 143}
159 144
160void 145void
161attachable::do_destroy () 146attachable::do_destroy ()
162{ 147{
231 216
232static int 217static int
233attachable_free (pTHX_ SV *sv, MAGIC *mg) 218attachable_free (pTHX_ SV *sv, MAGIC *mg)
234{ 219{
235 attachable *at = (attachable *)mg->mg_ptr; 220 attachable *at = (attachable *)mg->mg_ptr;
236 assert (!(at->flags & attachable::F_BORROWED));
237 at->self = 0; 221 at->self = 0;
238 // 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
239 //at->refcnt_chk (); 223 //at->refcnt_chk ();
240 return 0; 224 return 0;
241} 225}
252 { 236 {
253 obj->self = newHV (); 237 obj->self = newHV ();
254 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);
255 239
256 // borrow the refcnt from the object 240 // borrow the refcnt from the object
257 obj->flags |= attachable::F_BORROWED; 241 // it is important thta no refcnt_chk is being executed here
258 obj->refcnt_dec (); 242 obj->refcnt_dec ();
259 243
260 // now bless the object _once_ 244 // now bless the object _once_
261 return sv_bless (newRV_inc ((SV *)obj->self), stash); 245 return sv_bless (newRV_inc ((SV *)obj->self), stash);
262 } 246 }
263 else 247 else
248 {
264 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 }
265} 256}
266 257
267static void 258static void
268clearSVptr (SV *sv) 259clearSVptr (SV *sv)
269{ 260{
322inline 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); }
323 314
324inline SV *to_sv (object & v) { return to_sv (&v); } 315inline SV *to_sv (object & v) { return to_sv (&v); }
325inline SV *to_sv (living & v) { return to_sv (&v); } 316inline SV *to_sv (living & v) { return to_sv (&v); }
326 317
327//TODO:
328inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 318inline SV *to_sv (facetile * v) { return to_sv (v->name); }
329inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 319inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
330 320
331inline SV *to_sv (UUID v) 321inline SV *to_sv (UUID v)
332{ 322{
333 char buf[128]; 323 char buf[128];
358inline 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"); }
359inline 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"); }
360inline 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"); }
361inline 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"); }
362 352
363inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO 353inline void sv_to (SV *sv, facetile * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; }
364inline 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)); }
365 355
366template<class T> 356template<class T>
367inline 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; }
368 358
369template<int N> 359template<int N>
505 if (!ext->cb) 495 if (!ext->cb)
506 ext->cb = newAV (); 496 ext->cb = newAV ();
507 497
508 return newRV_inc ((SV *)ext->cb); 498 return newRV_inc ((SV *)ext->cb);
509} 499}
510
511#if 0
512void attachable::clear ()
513{
514 if (self)
515 {
516 // disconnect Perl from C, to avoid crashes
517 sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext);
518
519 // clear the perl hash, might or might not be a good idea
520 hv_clear ((HV *)SvRV ((SV *)self));
521
522 SvREFCNT_dec (self);
523 self = 0;
524 }
525
526 if (cb)
527 {
528 SvREFCNT_dec (cb);
529 cb = 0;
530 }
531
532 attach = 0;
533}
534#endif
535 500
536///////////////////////////////////////////////////////////////////////////// 501/////////////////////////////////////////////////////////////////////////////
537 502
538extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 503extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
539{ 504{
834} 799}
835 800
836///////////////////////////////////////////////////////////////////////////// 801/////////////////////////////////////////////////////////////////////////////
837 802
838void 803void
839maptile::emergency_save () 804cfperl_emergency_save ()
840{ 805{
841 CALL_BEGIN (0); 806 CALL_BEGIN (0);
842 CALL_CALL ("cf::map::emergency_save", G_VOID); 807 CALL_CALL ("cf::emergency_save", G_VOID);
843 CALL_END; 808 CALL_END;
844} 809}
845 810
846maptile * 811maptile *
847maptile::find_sync (const char *path, maptile *origin) 812maptile::find_sync (const char *path, maptile *origin)
848{ 813{
849 CALL_BEGIN (2); 814 CALL_BEGIN (2);
850 CALL_ARG (path); 815 CALL_ARG (path);
851 CALL_ARG (origin); 816 CALL_ARG (origin);
852 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);
853 838
854 maptile *retval; 839 maptile *retval;
855 840
856 if (count) 841 if (count)
857 sv_to (POPs, retval); 842 sv_to (POPs, retval);
1262 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1247 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1263 const_iv (FLAG_IS_WATER) 1248 const_iv (FLAG_IS_WATER)
1264 const_iv (FLAG_CONTENT_ON_GEN) 1249 const_iv (FLAG_CONTENT_ON_GEN)
1265 const_iv (FLAG_IS_A_TEMPLATE) 1250 const_iv (FLAG_IS_A_TEMPLATE)
1266 const_iv (FLAG_IS_BUILDABLE) 1251 const_iv (FLAG_IS_BUILDABLE)
1252 const_iv (FLAG_DESTROY_ON_DEATH)
1253 const_iv (FLAG_NO_SAVE)
1267 1254
1268 const_iv (NDI_BLACK) 1255 const_iv (NDI_BLACK)
1269 const_iv (NDI_WHITE) 1256 const_iv (NDI_WHITE)
1270 const_iv (NDI_NAVY) 1257 const_iv (NDI_NAVY)
1271 const_iv (NDI_RED) 1258 const_iv (NDI_RED)
1565 1552
1566NV floor (NV x) 1553NV floor (NV x)
1567 1554
1568NV ceil (NV x) 1555NV ceil (NV x)
1569 1556
1557NV rndm (...)
1558 CODE:
1559 switch (items)
1560 {
1561 case 0: RETVAL = rndm (); break;
1562 case 1: RETVAL = rndm (SvUV (ST (0))); break;
1563 case 2: RETVAL = rndm (SvIV (ST (0)), SvIV (ST (1))); break;
1564 default: croak ("cf::rndm requires none, one or two parameters."); break;
1565 }
1566 OUTPUT:
1567 RETVAL
1568
1570void server_tick () 1569void server_tick ()
1571 CODE: 1570 CODE:
1572 runtime = SvNVx (sv_runtime); 1571 runtime = SvNVx (sv_runtime);
1573 server_tick (); 1572 server_tick ();
1574 1573
1620 } 1619 }
1621 OUTPUT: RETVAL 1620 OUTPUT: RETVAL
1622 1621
1623void abort () 1622void abort ()
1624 1623
1624void fork_abort (char *cause = "cf::fork_abort")
1625
1626void cleanup (const char *cause, bool make_core = false)
1627
1625void emergency_save () 1628void emergency_save ()
1626 1629
1627void _exit (int status = 0) 1630void _exit (int status = 0)
1628 1631
1629#if _POSIX_MEMLOCK 1632#if _POSIX_MEMLOCK
1719 PPCODE: 1722 PPCODE:
1720 EXTEND (SP, object::mortals.size ()); 1723 EXTEND (SP, object::mortals.size ());
1721 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i) 1724 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1722 PUSHs (to_sv (*i)); 1725 PUSHs (to_sv (*i));
1723 1726
1724object *first () 1727int objects_size ()
1725 CODE: 1728 CODE:
1726 RETVAL = object::first; 1729 RETVAL = objects.size ();
1730 OUTPUT: RETVAL
1731
1732object *objects (U32 index)
1733 CODE:
1734 RETVAL = index < objects.size () ? objects [index] : 0;
1735 OUTPUT: RETVAL
1736
1737int actives_size ()
1738 CODE:
1739 RETVAL = actives.size ();
1740 OUTPUT: RETVAL
1741
1742object *actives (U32 index)
1743 CODE:
1744 RETVAL = index < actives.size () ? actives [index] : 0;
1727 OUTPUT: RETVAL 1745 OUTPUT: RETVAL
1728 1746
1729# missing properties 1747# missing properties
1730 1748
1731object *head (object *op) 1749object *head (object *op)
1732 PROTOTYPE: $ 1750 PROTOTYPE: $
1733 CODE: 1751 CODE:
1734 RETVAL = op->head ? op->head : op; 1752 RETVAL = op->head_ ();
1735 OUTPUT: RETVAL 1753 OUTPUT: RETVAL
1736 1754
1737int is_head (object *op) 1755int is_head (object *op)
1738 PROTOTYPE: $ 1756 PROTOTYPE: $
1739 CODE: 1757 CODE:
1740 RETVAL = !op->head; 1758 RETVAL = op->head_ () == op;
1741 OUTPUT: RETVAL 1759 OUTPUT: RETVAL
1742 1760
1743void 1761void
1744inv (object *obj) 1762inv (object *obj)
1745 PROTOTYPE: $ 1763 PROTOTYPE: $
1836 1854
1837void drop (object *who, object *op) 1855void drop (object *who, object *op)
1838 1856
1839void pick_up (object *who, object *op) 1857void pick_up (object *who, object *op)
1840 1858
1841object *cf_object_insert_object (object *op, object *container)
1842
1843object *cf_object_insert_in_ob (object *ob, object *where)
1844
1845int cf_object_teleport (object *op, maptile *map, int x, int y) 1859int cf_object_teleport (object *op, maptile *map, int x, int y)
1846 1860
1847void update_object (object *op, int action) 1861void update_object (object *op, int action)
1848 1862
1849object *cf_create_object_by_name (const char *name) 1863object *cf_create_object_by_name (const char *name)
1967 1981
1968void esrv_update_item (object *op, int what, object *item) 1982void esrv_update_item (object *op, int what, object *item)
1969 C_ARGS: what, op, item 1983 C_ARGS: what, op, item
1970 1984
1971void clear_los (object *op) 1985void clear_los (object *op)
1972
1973int command_teleport (object *op, char *params)
1974 1986
1975int command_summon (object *op, char *params) 1987int command_summon (object *op, char *params)
1976 1988
1977int command_arrest (object *op, char *params) 1989int command_arrest (object *op, char *params)
1978 1990
2121 2133
2122object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny) 2134object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny)
2123 C_ARGS: str, map, nx, ny 2135 C_ARGS: str, map, nx, ny
2124 2136
2125void 2137void
2126cf_map_normalise (maptile *map, int x, int y) 2138get_map_flags (maptile *map, int x, int y)
2127 PPCODE: 2139 PPCODE:
2128{ 2140{
2129 maptile *nmap = 0; 2141 maptile *nmap = 0;
2130 I16 nx = 0, ny = 0; 2142 I16 nx = 0, ny = 0;
2131 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2143 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2193 CODE: 2205 CODE:
2194 RETVAL = get_name_of_region_for_map (m); 2206 RETVAL = get_name_of_region_for_map (m);
2195 OUTPUT: RETVAL 2207 OUTPUT: RETVAL
2196 2208
2197# worst xs function of my life 2209# worst xs function of my life
2198maptile * 2210bool
2199_create_random_map (\ 2211_create_random_map (\
2200 char *path,\ 2212 maptile *self,\
2201 char *wallstyle,\ 2213 char *wallstyle,\
2202 char *wall_name,\ 2214 char *wall_name,\
2203 char *floorstyle,\ 2215 char *floorstyle,\
2204 char *monsterstyle,\ 2216 char *monsterstyle,\
2205 char *treasurestyle,\ 2217 char *treasurestyle,\
2209 char *origin_map,\ 2221 char *origin_map,\
2210 char *final_map,\ 2222 char *final_map,\
2211 char *exitstyle,\ 2223 char *exitstyle,\
2212 char *this_map,\ 2224 char *this_map,\
2213 char *exit_on_final_map,\ 2225 char *exit_on_final_map,\
2214 int Xsize,\ 2226 int xsize,\
2215 int Ysize,\ 2227 int ysize,\
2216 int expand2x,\ 2228 int expand2x,\
2217 int layoutoptions1,\ 2229 int layoutoptions1,\
2218 int layoutoptions2,\ 2230 int layoutoptions2,\
2219 int layoutoptions3,\ 2231 int layoutoptions3,\
2220 int symmetry,\ 2232 int symmetry,\
2225 int dungeon_depth,\ 2237 int dungeon_depth,\
2226 int decoroptions,\ 2238 int decoroptions,\
2227 int orientation,\ 2239 int orientation,\
2228 int origin_y,\ 2240 int origin_y,\
2229 int origin_x,\ 2241 int origin_x,\
2230 int random_seed,\ 2242 U32 random_seed,\
2231 val64 total_map_hp,\ 2243 val64 total_map_hp,\
2232 int map_layout_style,\ 2244 int map_layout_style,\
2233 int treasureoptions,\ 2245 int treasureoptions,\
2234 int symmetry_used,\ 2246 int symmetry_used,\
2235 region *region\ 2247 region *region,\
2248 char *custom\
2236) 2249)
2237 CODE: 2250 CODE:
2238{ 2251{
2239 random_map_params rmp; 2252 random_map_params rmp;
2240 2253
2250 assign (rmp.exit_on_final_map, exit_on_final_map); 2263 assign (rmp.exit_on_final_map, exit_on_final_map);
2251 2264
2252 rmp.origin_map = origin_map; 2265 rmp.origin_map = origin_map;
2253 rmp.final_map = final_map; 2266 rmp.final_map = final_map;
2254 rmp.this_map = this_map; 2267 rmp.this_map = this_map;
2255 rmp.Xsize = Xsize; 2268 rmp.xsize = xsize;
2256 rmp.Ysize = Ysize; 2269 rmp.ysize = ysize;
2257 rmp.expand2x = expand2x; 2270 rmp.expand2x = expand2x;
2258 rmp.layoutoptions1 = layoutoptions1; 2271 rmp.layoutoptions1 = layoutoptions1;
2259 rmp.layoutoptions2 = layoutoptions2; 2272 rmp.layoutoptions2 = layoutoptions2;
2260 rmp.layoutoptions3 = layoutoptions3; 2273 rmp.layoutoptions3 = layoutoptions3;
2261 rmp.symmetry = symmetry; 2274 rmp.symmetry = symmetry;
2272 rmp.total_map_hp = total_map_hp; 2285 rmp.total_map_hp = total_map_hp;
2273 rmp.map_layout_style = map_layout_style; 2286 rmp.map_layout_style = map_layout_style;
2274 rmp.treasureoptions = treasureoptions; 2287 rmp.treasureoptions = treasureoptions;
2275 rmp.symmetry_used = symmetry_used; 2288 rmp.symmetry_used = symmetry_used;
2276 rmp.region = region; 2289 rmp.region = region;
2290 rmp.custom = custom;
2277 2291
2278 RETVAL = generate_random_map (path, &rmp); 2292 RETVAL = self->generate_random_map (&rmp);
2279} 2293}
2280 OUTPUT: 2294 OUTPUT:
2281 RETVAL 2295 RETVAL
2282 2296
2283MODULE = cf PACKAGE = cf::arch 2297MODULE = cf PACKAGE = cf::arch

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines