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.134 by root, Tue Jan 9 21:32:42 2007 UTC vs.
Revision 1.150 by root, Tue Jan 23 01:05:18 2007 UTC

164} 164}
165 165
166void 166void
167attachable::check_mortals () 167attachable::check_mortals ()
168{ 168{
169 for (int i = 0; i < mortals.size (); ) 169 static int i = 0;
170
171 for (;;)
170 { 172 {
173 if (i >= mortals.size ())
174 {
175 i = 0;
176
177 if (mortals.size () > 1000)
178 fprintf (stderr, "mortal queue size (%d) exceeds 1000.\n", mortals.size ());
179
180 break;
181 }
182
171 attachable *obj = mortals [i]; 183 attachable *obj = mortals [i];
172 184
173 obj->refcnt_chk (); // unborrow from perl, if necessary 185 obj->refcnt_chk (); // unborrow from perl, if necessary
174 186
175 if (obj->refcnt || obj->self) 187 if (obj->refcnt > 0 || obj->self)
176 { 188 {
177#if 0 189//printf ("%p rc %d\n", obj, obj->refcnt_cnt ());//D
178 if (mortals.size() > 5)fprintf (stderr, "%d delaying %d:%p:%s %d (self %p:%d)\n", time(0),i, obj, typeid (*obj).name (),
179 obj->refcnt, obj->self, obj->self ? SvREFCNT(obj->self): - 1);//D
180#endif
181
182 ++i; // further delay freeing 190 ++i; // further delay freeing
191
192 if (!(i & 0x3ff))
193 break;
183 }//D 194 }
184 else 195 else
185 { 196 {
186 //Dfprintf (stderr, "deleteing %d:%p:%s\n", i, obj,typeid (*obj).name ());//D
187 mortals.erase (i); 197 mortals.erase (i);
188 delete obj; 198 delete obj;
189 } 199 }
190 } 200 }
191} 201}
243 253
244 // now bless the object _once_ 254 // now bless the object _once_
245 return sv_bless (newRV_inc ((SV *)obj->self), stash); 255 return sv_bless (newRV_inc ((SV *)obj->self), stash);
246 } 256 }
247 else 257 else
258 {
248 return newRV_inc ((SV *)obj->self); 259 SV *sv = newRV_inc ((SV *)obj->self);
260
261 if (Gv_AMG (stash)) // handle overload correctly, as the perl core does not
262 SvAMAGIC_on (sv);
263
264 return sv;
265 }
249} 266}
250 267
251static void 268static void
252clearSVptr (SV *sv) 269clearSVptr (SV *sv)
253{ 270{
306inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); } 323inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); }
307 324
308inline SV *to_sv (object & v) { return to_sv (&v); } 325inline SV *to_sv (object & v) { return to_sv (&v); }
309inline SV *to_sv (living & v) { return to_sv (&v); } 326inline SV *to_sv (living & v) { return to_sv (&v); }
310 327
311//TODO:
312inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 328inline SV *to_sv (facetile * v) { return to_sv (v->name); }
313inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 329inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
314 330
315inline SV *to_sv (UUID v) 331inline SV *to_sv (UUID v)
316{ 332{
317 char buf[128]; 333 char buf[128];
342inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); } 358inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); }
343inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); } 359inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); }
344inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); } 360inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); }
345inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); } 361inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); }
346 362
347inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO 363inline void sv_to (SV *sv, facetile * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; }
348inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); } // TODO 364inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); }
349 365
350template<class T> 366template<class T>
351inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; } 367inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; }
352 368
353template<int N> 369template<int N>
489 if (!ext->cb) 505 if (!ext->cb)
490 ext->cb = newAV (); 506 ext->cb = newAV ();
491 507
492 return newRV_inc ((SV *)ext->cb); 508 return newRV_inc ((SV *)ext->cb);
493} 509}
494
495#if 0
496void attachable::clear ()
497{
498 if (self)
499 {
500 // disconnect Perl from C, to avoid crashes
501 sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext);
502
503 // clear the perl hash, might or might not be a good idea
504 hv_clear ((HV *)SvRV ((SV *)self));
505
506 SvREFCNT_dec (self);
507 self = 0;
508 }
509
510 if (cb)
511 {
512 SvREFCNT_dec (cb);
513 cb = 0;
514 }
515
516 attach = 0;
517}
518#endif
519 510
520///////////////////////////////////////////////////////////////////////////// 511/////////////////////////////////////////////////////////////////////////////
521 512
522extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 513extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
523{ 514{
845 CALL_END; 836 CALL_END;
846 837
847 return retval; 838 return retval;
848} 839}
849 840
841maptile *
842maptile::find_async (const char *path, maptile *origin)
843{
844 CALL_BEGIN (2);
845 CALL_ARG (path);
846 CALL_ARG (origin);
847 CALL_CALL ("cf::map::find_async", G_SCALAR);
848
849 maptile *retval;
850
851 if (count)
852 sv_to (POPs, retval);
853 else
854 retval = 0;
855
856 CALL_END;
857
858 return retval;
859}
860
850void 861void
851maptile::do_load_sync () 862maptile::do_load_sync ()
852{ 863{
853 CALL_BEGIN (1); 864 CALL_BEGIN (1);
854 CALL_ARG (this); 865 CALL_ARG (this);
894void 905void
895iw::alloc () 906iw::alloc ()
896{ 907{
897 pe = GEventAPI->new_idle (0, 0); 908 pe = GEventAPI->new_idle (0, 0);
898 909
910 WaREENTRANT_off (pe);
899 pe->base.callback = (void *)iw_dispatch; 911 pe->base.callback = (void *)iw_dispatch;
900 pe->base.ext_data = (void *)this; 912 pe->base.ext_data = (void *)this;
901} 913}
902 914
903static void iow_dispatch (pe_event *ev) 915static void iow_dispatch (pe_event *ev)
909void 921void
910iow::alloc () 922iow::alloc ()
911{ 923{
912 pe = GEventAPI->new_io (0, 0); 924 pe = GEventAPI->new_io (0, 0);
913 925
926 WaREENTRANT_off (pe);
914 pe->base.callback = (void *)iow_dispatch; 927 pe->base.callback = (void *)iow_dispatch;
915 pe->base.ext_data = (void *)this; 928 pe->base.ext_data = (void *)this;
916 929
917 pe->fd = -1; 930 pe->fd = -1;
918 pe->poll = 0; 931 pe->poll = 0;
1246 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1259 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1247 const_iv (FLAG_IS_WATER) 1260 const_iv (FLAG_IS_WATER)
1248 const_iv (FLAG_CONTENT_ON_GEN) 1261 const_iv (FLAG_CONTENT_ON_GEN)
1249 const_iv (FLAG_IS_A_TEMPLATE) 1262 const_iv (FLAG_IS_A_TEMPLATE)
1250 const_iv (FLAG_IS_BUILDABLE) 1263 const_iv (FLAG_IS_BUILDABLE)
1264 const_iv (FLAG_DESTROY_ON_DEATH)
1265 const_iv (FLAG_NO_MAP_SAVE)
1251 1266
1252 const_iv (NDI_BLACK) 1267 const_iv (NDI_BLACK)
1253 const_iv (NDI_WHITE) 1268 const_iv (NDI_WHITE)
1254 const_iv (NDI_NAVY) 1269 const_iv (NDI_NAVY)
1255 const_iv (NDI_RED) 1270 const_iv (NDI_RED)
1440 const_iv (ATNR_BLIND) 1455 const_iv (ATNR_BLIND)
1441 const_iv (ATNR_INTERNAL) 1456 const_iv (ATNR_INTERNAL)
1442 const_iv (ATNR_LIFE_STEALING) 1457 const_iv (ATNR_LIFE_STEALING)
1443 const_iv (ATNR_DISEASE) 1458 const_iv (ATNR_DISEASE)
1444 1459
1445 const_iv (MAP_FLUSH)
1446 const_iv (MAP_PLAYER_UNIQUE)
1447 const_iv (MAP_BLOCK)
1448 const_iv (MAP_STYLE)
1449 const_iv (MAP_OVERLAY)
1450
1451 const_iv (MAP_IN_MEMORY) 1460 const_iv (MAP_IN_MEMORY)
1452 const_iv (MAP_SWAPPED) 1461 const_iv (MAP_SWAPPED)
1453 const_iv (MAP_LOADING) 1462 const_iv (MAP_LOADING)
1454 const_iv (MAP_SAVING) 1463 const_iv (MAP_SAVING)
1455 1464
1548} 1557}
1549 1558
1550NV floor (NV x) 1559NV floor (NV x)
1551 1560
1552NV ceil (NV x) 1561NV ceil (NV x)
1562
1563NV rndm (...)
1564 CODE:
1565 switch (items)
1566 {
1567 case 0: RETVAL = rndm (); break;
1568 case 1: RETVAL = rndm (SvUV (ST (0))); break;
1569 case 2: RETVAL = rndm (SvIV (ST (0)), SvIV (ST (1))); break;
1570 default: croak ("cf::rndm requires none, one or two parameters."); break;
1571 }
1572 OUTPUT:
1573 RETVAL
1553 1574
1554void server_tick () 1575void server_tick ()
1555 CODE: 1576 CODE:
1556 runtime = SvNVx (sv_runtime); 1577 runtime = SvNVx (sv_runtime);
1557 server_tick (); 1578 server_tick ();
1604 } 1625 }
1605 OUTPUT: RETVAL 1626 OUTPUT: RETVAL
1606 1627
1607void abort () 1628void abort ()
1608 1629
1630void fork_abort (char *cause = "cf::fork_abort")
1631
1609void cleanup (const char *cause, bool make_core = false) 1632void cleanup (const char *cause, bool make_core = false)
1610 1633
1611void emergency_save () 1634void emergency_save ()
1635
1636UV sv_2watcher (SV *w)
1637 CODE:
1638 RETVAL = (UV)GEventAPI->sv_2watcher (w);
1639 OUTPUT:
1640 RETVAL
1612 1641
1613void _exit (int status = 0) 1642void _exit (int status = 0)
1614 1643
1615#if _POSIX_MEMLOCK 1644#if _POSIX_MEMLOCK
1616 1645
1837 1866
1838void drop (object *who, object *op) 1867void drop (object *who, object *op)
1839 1868
1840void pick_up (object *who, object *op) 1869void pick_up (object *who, object *op)
1841 1870
1842object *cf_object_insert_object (object *op, object *container)
1843
1844object *cf_object_insert_in_ob (object *ob, object *where)
1845
1846int cf_object_teleport (object *op, maptile *map, int x, int y) 1871int cf_object_teleport (object *op, maptile *map, int x, int y)
1847 1872
1848void update_object (object *op, int action) 1873void update_object (object *op, int action)
1849 1874
1850object *cf_create_object_by_name (const char *name) 1875object *cf_create_object_by_name (const char *name)
1968 1993
1969void esrv_update_item (object *op, int what, object *item) 1994void esrv_update_item (object *op, int what, object *item)
1970 C_ARGS: what, op, item 1995 C_ARGS: what, op, item
1971 1996
1972void clear_los (object *op) 1997void clear_los (object *op)
1973
1974int command_teleport (object *op, char *params)
1975 1998
1976int command_summon (object *op, char *params) 1999int command_summon (object *op, char *params)
1977 2000
1978int command_arrest (object *op, char *params) 2001int command_arrest (object *op, char *params)
1979 2002
2122 2145
2123object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny) 2146object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny)
2124 C_ARGS: str, map, nx, ny 2147 C_ARGS: str, map, nx, ny
2125 2148
2126void 2149void
2127cf_map_normalise (maptile *map, int x, int y) 2150get_map_flags (maptile *map, int x, int y)
2128 PPCODE: 2151 PPCODE:
2129{ 2152{
2130 maptile *nmap = 0; 2153 maptile *nmap = 0;
2131 I16 nx = 0, ny = 0; 2154 I16 nx = 0, ny = 0;
2132 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2155 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2194 CODE: 2217 CODE:
2195 RETVAL = get_name_of_region_for_map (m); 2218 RETVAL = get_name_of_region_for_map (m);
2196 OUTPUT: RETVAL 2219 OUTPUT: RETVAL
2197 2220
2198# worst xs function of my life 2221# worst xs function of my life
2199maptile * 2222bool
2200_create_random_map (\ 2223_create_random_map (\
2201 char *path,\ 2224 maptile *self,\
2202 char *wallstyle,\ 2225 char *wallstyle,\
2203 char *wall_name,\ 2226 char *wall_name,\
2204 char *floorstyle,\ 2227 char *floorstyle,\
2205 char *monsterstyle,\ 2228 char *monsterstyle,\
2206 char *treasurestyle,\ 2229 char *treasurestyle,\
2210 char *origin_map,\ 2233 char *origin_map,\
2211 char *final_map,\ 2234 char *final_map,\
2212 char *exitstyle,\ 2235 char *exitstyle,\
2213 char *this_map,\ 2236 char *this_map,\
2214 char *exit_on_final_map,\ 2237 char *exit_on_final_map,\
2215 int Xsize,\ 2238 int xsize,\
2216 int Ysize,\ 2239 int ysize,\
2217 int expand2x,\ 2240 int expand2x,\
2218 int layoutoptions1,\ 2241 int layoutoptions1,\
2219 int layoutoptions2,\ 2242 int layoutoptions2,\
2220 int layoutoptions3,\ 2243 int layoutoptions3,\
2221 int symmetry,\ 2244 int symmetry,\
2226 int dungeon_depth,\ 2249 int dungeon_depth,\
2227 int decoroptions,\ 2250 int decoroptions,\
2228 int orientation,\ 2251 int orientation,\
2229 int origin_y,\ 2252 int origin_y,\
2230 int origin_x,\ 2253 int origin_x,\
2231 int random_seed,\ 2254 U32 random_seed,\
2232 val64 total_map_hp,\ 2255 val64 total_map_hp,\
2233 int map_layout_style,\ 2256 int map_layout_style,\
2234 int treasureoptions,\ 2257 int treasureoptions,\
2235 int symmetry_used,\ 2258 int symmetry_used,\
2236 region *region\ 2259 region *region,\
2260 char *custom\
2237) 2261)
2238 CODE: 2262 CODE:
2239{ 2263{
2240 random_map_params rmp; 2264 random_map_params rmp;
2241 2265
2251 assign (rmp.exit_on_final_map, exit_on_final_map); 2275 assign (rmp.exit_on_final_map, exit_on_final_map);
2252 2276
2253 rmp.origin_map = origin_map; 2277 rmp.origin_map = origin_map;
2254 rmp.final_map = final_map; 2278 rmp.final_map = final_map;
2255 rmp.this_map = this_map; 2279 rmp.this_map = this_map;
2256 rmp.Xsize = Xsize; 2280 rmp.xsize = xsize;
2257 rmp.Ysize = Ysize; 2281 rmp.ysize = ysize;
2258 rmp.expand2x = expand2x; 2282 rmp.expand2x = expand2x;
2259 rmp.layoutoptions1 = layoutoptions1; 2283 rmp.layoutoptions1 = layoutoptions1;
2260 rmp.layoutoptions2 = layoutoptions2; 2284 rmp.layoutoptions2 = layoutoptions2;
2261 rmp.layoutoptions3 = layoutoptions3; 2285 rmp.layoutoptions3 = layoutoptions3;
2262 rmp.symmetry = symmetry; 2286 rmp.symmetry = symmetry;
2273 rmp.total_map_hp = total_map_hp; 2297 rmp.total_map_hp = total_map_hp;
2274 rmp.map_layout_style = map_layout_style; 2298 rmp.map_layout_style = map_layout_style;
2275 rmp.treasureoptions = treasureoptions; 2299 rmp.treasureoptions = treasureoptions;
2276 rmp.symmetry_used = symmetry_used; 2300 rmp.symmetry_used = symmetry_used;
2277 rmp.region = region; 2301 rmp.region = region;
2302 rmp.custom = custom;
2278 2303
2279 RETVAL = generate_random_map (path, &rmp); 2304 RETVAL = self->generate_random_map (&rmp);
2280} 2305}
2281 OUTPUT: 2306 OUTPUT:
2282 RETVAL 2307 RETVAL
2283 2308
2284MODULE = cf PACKAGE = cf::arch 2309MODULE = cf PACKAGE = cf::arch

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines