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.154 by root, Fri Jan 26 21:44:11 2007 UTC vs.
Revision 1.160 by elmex, Wed Jan 31 14:11:02 2007 UTC

112{ 112{
113 return refcnt + (self ? SvREFCNT (self) - 1 : 0); 113 return refcnt + (self ? SvREFCNT (self) - 1 : 0);
114} 114}
115 115
116void 116void
117attachable::sever_self ()
118{
119 if (HV *self = this->self)
120 {
121 // keep a refcount because sv_unmagic might call attachable_free,
122 // which might clear self, causing sv_unmagic to crash on a now
123 // invalid object.
124 SvREFCNT_inc (self);
125 hv_clear (self);
126 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
127 SvREFCNT_dec (self);
128
129 // self *must* be null now because thats sv_unmagic's job.
130 assert (!this->self);
131 }
132}
133
134void
117attachable::optimise () 135attachable::optimise ()
118{ 136{
119 if (self 137 if (self
120 && SvREFCNT (self) == 1 138 && SvREFCNT (self) == 1
121 && !HvTOTALKEYS (self)) 139 && !HvTOTALKEYS (self))
122 { 140 sever_self ();
123 SV *self = (SV *)this->self;
124
125 SvREFCNT_inc (self);
126 sv_unmagic (self, PERL_MAGIC_ext);
127 SvREFCNT_dec (self);
128 assert (!this->self);
129 }
130} 141}
131 142
132// check wether the object really is dead 143// check wether the object really is dead
133void 144void
134attachable::do_check () 145attachable::do_check ()
149 SvREFCNT_dec (cb); 160 SvREFCNT_dec (cb);
150 cb = 0; 161 cb = 0;
151 } 162 }
152 163
153 if (self) 164 if (self)
154 { 165 sever_self ();
155 hv_clear (self);
156
157 SV *self = (SV *)this->self;
158 SvREFCNT_inc (self);
159 sv_unmagic (self, PERL_MAGIC_ext);
160 SvREFCNT_dec (self);
161 // self is now 0
162 assert (!this->self);//D//TODO remove soon
163 }
164 166
165 mortals.push_back (this); 167 mortals.push_back (this);
166} 168}
167 169
168void 170void
345inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 347inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
346 348
347inline SV *to_sv (UUID v) 349inline SV *to_sv (UUID v)
348{ 350{
349 char buf[128]; 351 char buf[128];
350 snprintf (buf, 128, "<1,%" PRIx64 ">", v.seq); 352 snprintf (buf, 128, "<1.%" PRIx64 ">", v.seq);
351 return newSVpv (buf, 0); 353 return newSVpv (buf, 0);
352} 354}
353 355
354inline void sv_to (SV *sv, shstr &v) { v = SvOK (sv) ? SvPV_nolen (sv) : 0; } 356inline void sv_to (SV *sv, shstr &v) { v = SvOK (sv) ? SvPV_nolen (sv) : 0; }
355inline void sv_to (SV *sv, char * &v) { free (v); v = SvOK (sv) ? strdup (SvPV_nolen (sv)) : 0; } 357inline void sv_to (SV *sv, char * &v) { free (v); v = SvOK (sv) ? strdup (SvPV_nolen (sv)) : 0; }
1647 1649
1648void cleanup (const char *cause, bool make_core = false) 1650void cleanup (const char *cause, bool make_core = false)
1649 1651
1650void emergency_save () 1652void emergency_save ()
1651 1653
1654void _exit (int status = EXIT_SUCCESS)
1655
1652UV sv_2watcher (SV *w) 1656UV sv_2watcher (SV *w)
1653 CODE: 1657 CODE:
1654 RETVAL = (UV)GEventAPI->sv_2watcher (w); 1658 RETVAL = (UV)GEventAPI->sv_2watcher (w);
1655 OUTPUT: 1659 OUTPUT:
1656 RETVAL 1660 RETVAL
1657
1658void _exit (int status = 0)
1659 1661
1660#if _POSIX_MEMLOCK 1662#if _POSIX_MEMLOCK
1661 1663
1662int mlockall (int flags = MCL_CURRENT | MCL_FUTURE) 1664int mlockall (int flags = MCL_CURRENT | MCL_FUTURE)
1663 1665
1802 1804
1803void 1805void
1804set_animation (object *op, int idx) 1806set_animation (object *op, int idx)
1805 CODE: 1807 CODE:
1806 SET_ANIMATION (op, idx); 1808 SET_ANIMATION (op, idx);
1809
1810int
1811num_animations (object *op)
1812 CODE:
1813 RETVAL = NUM_ANIMATIONS (op);
1814 OUTPUT: RETVAL
1807 1815
1808object *find_best_object_match (object *op, const char *match) 1816object *find_best_object_match (object *op, const char *match)
1809 1817
1810object *find_marked_object (object *op) 1818object *find_marked_object (object *op)
1811 1819
2139 EXTEND (SP, THIS->players); 2147 EXTEND (SP, THIS->players);
2140 for_all_players (pl) 2148 for_all_players (pl)
2141 if (pl->ob && pl->ob->map == THIS) 2149 if (pl->ob && pl->ob->map == THIS)
2142 PUSHs (sv_2mortal (to_sv (pl->ob))); 2150 PUSHs (sv_2mortal (to_sv (pl->ob)));
2143 } 2151 }
2152
2153void
2154maptile::set_regiondata (SV *data, SV *plt)
2155 CODE:
2156{
2157 if (!SvROK (plt) || SvTYPE (SvRV (plt)) != SVt_PVAV)
2158 croak ("maptile::set_regiondata needs arrayref as plt arg");
2159
2160 AV *av = (AV *)SvRV (plt);
2161
2162 region **regionmap = (region **)malloc ((av_len (av) + 1) * sizeof (region *));
2163
2164 for (int i = av_len (av) + 1; i--; )
2165 regionmap [i] = region::find (SvPVutf8_nolen (*av_fetch (av, i, 1)));
2166
2167 THIS->regions = salloc<uint8_t> (THIS->size (), (uint8_t *)SvPVbyte_nolen (data));
2168 THIS->regionmap = regionmap;
2169}
2144 2170
2145void play_sound_map (maptile *map, int x, int y, int sound_num) 2171void play_sound_map (maptile *map, int x, int y, int sound_num)
2146 2172
2147int out_of_map (maptile *map, int x, int y) 2173int out_of_map (maptile *map, int x, int y)
2148 2174
2229 OUTPUT: RETVAL 2255 OUTPUT: RETVAL
2230 2256
2231void fix_walls (maptile *map, int x, int y) 2257void fix_walls (maptile *map, int x, int y)
2232 2258
2233void fix_walls_around (maptile *map, int x, int y) 2259void fix_walls_around (maptile *map, int x, int y)
2234
2235const char *
2236region_name (maptile *m)
2237 CODE:
2238 RETVAL = get_name_of_region_for_map (m);
2239 OUTPUT: RETVAL
2240 2260
2241# worst xs function of my life 2261# worst xs function of my life
2242bool 2262bool
2243_create_random_map (\ 2263_create_random_map (\
2244 maptile *self,\ 2264 maptile *self,\
2361 OUTPUT: RETVAL 2381 OUTPUT: RETVAL
2362 2382
2363region *find (char *name) 2383region *find (char *name)
2364 PROTOTYPE: $ 2384 PROTOTYPE: $
2365 CODE: 2385 CODE:
2366 RETVAL = get_region_by_name (name); 2386 RETVAL = region::find (name);
2367 OUTPUT: RETVAL 2387 OUTPUT: RETVAL
2368 2388
2369INCLUDE: $PERL genacc region ../include/map.h | 2389INCLUDE: $PERL genacc region ../include/map.h |
2370 2390
2371MODULE = cf PACKAGE = cf::living 2391MODULE = cf PACKAGE = cf::living

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines