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.123 by root, Sun Dec 31 22:23:12 2006 UTC vs.
Revision 1.131 by root, Mon Jan 8 18:18:35 2007 UTC

32#include <sproto.h> 32#include <sproto.h>
33 33
34#include "cfperl.h" 34#include "cfperl.h"
35#include "shstr.h" 35#include "shstr.h"
36 36
37#include <unistd.h>
38#if _POSIX_MEMLOCK
39# include <sys/mman.h>
40#endif
41
37#include <EXTERN.h> 42#include <EXTERN.h>
38#include <perl.h> 43#include <perl.h>
39#include <XSUB.h> 44#include <XSUB.h>
40 45
41#include "CoroAPI.h" 46#include "CoroAPI.h"
94 99
95////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 100//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
96 101
97unordered_vector<attachable *> attachable::mortals; 102unordered_vector<attachable *> attachable::mortals;
98 103
99#if 0
100attachable *attachable::rc_first;
101
102attachable::attachable ()
103{
104 refcnt = 0;
105 rc_next = rc_first;
106 rc_first = this;
107}
108#endif
109
110attachable::~attachable () 104attachable::~attachable ()
111{ 105{
112 assert (!(flags & F_BORROWED));//D//TODO//remove when stable 106 assert (!(flags & F_BORROWED));
113#if 0 107}
114 assert (!rc_next); 108
115 assert (!refcnt); 109int
116#endif 110attachable::refcnt_cnt () const
111{
112 return refcnt + (self ? SvREFCNT (self) : 0);
113}
114
115void
116attachable::optimise ()
117{
118 if (self
119 && SvREFCNT (self) == 1
120 && !HvTOTALKEYS (self))
121 {
122 flags &= ~F_BORROWED;
123 refcnt_inc ();
124 SvREFCNT_dec ((SV *)self);
125 }
117} 126}
118 127
119// check wether the object really is dead 128// check wether the object really is dead
120void 129void
121attachable::do_check () 130attachable::do_check ()
122{ 131{
123 if (refcnt > 0) 132 if (refcnt > 0)
124 return; 133 return;
125 134
126 // try to unborrow the refcnt from perl 135 optimise ();
127 if (flags & F_BORROWED) 136
137 if (self)
128 { 138 {
129 assert (self);//D//TODO//remove when stable 139 if (refcnt + SvREFCNT (self) > 0)
140 return;
141
142 assert (flags & F_BORROWED);
143
130 flags &= ~F_BORROWED; 144 flags &= ~F_BORROWED;
131 refcnt_inc (); 145 refcnt_inc ();
132 SvREFCNT_dec (self); 146 SvREFCNT_dec (self);
147 self = 0;
133 } 148 }
134 149
135 if (refcnt > 0 || self) 150 if (refcnt > 0)
136 return; 151 return;
137 152
138 destroy (); 153 destroy ();
139} 154}
140 155
141void 156void
142attachable::do_destroy () 157attachable::do_destroy ()
143{ 158{
144 invoke (EVENT_ATTACHABLE_DESTROY, DT_END); 159 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
145 160
146 //TODO: call generic destroy callback 161 if (self)
162 hv_clear (self);
163
147 mortals.push_back (this); 164 mortals.push_back (this);
148} 165}
149 166
150void 167void
151attachable::destroy () 168attachable::destroy ()
155 172
156 flags |= F_DESTROYED; 173 flags |= F_DESTROYED;
157 do_destroy (); 174 do_destroy ();
158} 175}
159 176
177void
160void attachable::check_mortals () 178attachable::check_mortals ()
161{ 179{
162 for (int i = 0; i < mortals.size (); ) 180 for (int i = 0; i < mortals.size (); )
163 { 181 {
164 attachable *obj = mortals [i]; 182 attachable *obj = mortals [i];
165 183
209 227
210static int 228static int
211attachable_free (pTHX_ SV *sv, MAGIC *mg) 229attachable_free (pTHX_ SV *sv, MAGIC *mg)
212{ 230{
213 attachable *at = (attachable *)mg->mg_ptr; 231 attachable *at = (attachable *)mg->mg_ptr;
214 assert (!(at->flags & attachable::F_BORROWED));//D//TODO//remove when stable 232 assert (!(at->flags & attachable::F_BORROWED));
215 at->self = 0; 233 at->self = 0;
216 // next line makes sense, but most objects still have refcnt 0 by default 234 // next line makes sense, but most objects still have refcnt 0 by default
217 //at->refcnt_chk (); 235 //at->refcnt_chk ();
218 return 0; 236 return 0;
219} 237}
232 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0); 250 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0);
233 251
234 // borrow the refcnt from the object 252 // borrow the refcnt from the object
235 obj->flags |= attachable::F_BORROWED; 253 obj->flags |= attachable::F_BORROWED;
236 obj->refcnt_dec (); 254 obj->refcnt_dec ();
255
256 // now bless the object _once_
257 return sv_bless (newRV_inc ((SV *)obj->self), stash);
237 } 258 }
238 259 else
239 return sv_bless (newRV_inc ((SV *)obj->self), stash); 260 return newRV_inc ((SV *)obj->self);
240} 261}
241 262
242static void 263static void
243clearSVptr (SV *sv) 264clearSVptr (SV *sv)
244{ 265{
328inline void sv_to (SV *sv, client * &v) { v = (client *)(attachable *)SvPTR_ornull (sv, "cf::client"); } 349inline void sv_to (SV *sv, client * &v) { v = (client *)(attachable *)SvPTR_ornull (sv, "cf::client"); }
329inline void sv_to (SV *sv, player * &v) { v = (player *)(attachable *)SvPTR_ornull (sv, "cf::player"); } 350inline void sv_to (SV *sv, player * &v) { v = (player *)(attachable *)SvPTR_ornull (sv, "cf::player"); }
330inline void sv_to (SV *sv, object * &v) { v = (object *)(attachable *)SvPTR_ornull (sv, "cf::object"); } 351inline void sv_to (SV *sv, object * &v) { v = (object *)(attachable *)SvPTR_ornull (sv, "cf::object"); }
331inline void sv_to (SV *sv, archetype * &v) { v = (archetype *)(attachable *)SvPTR_ornull (sv, "cf::arch"); } 352inline void sv_to (SV *sv, archetype * &v) { v = (archetype *)(attachable *)SvPTR_ornull (sv, "cf::arch"); }
332inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)(attachable *)SvPTR_ornull (sv, "cf::map"); } 353inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)(attachable *)SvPTR_ornull (sv, "cf::map"); }
354inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); }
333inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); } 355inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); }
334inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); } 356inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); }
335inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); } 357inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); }
336 358
337inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO 359inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO
504 } 526 }
505 527
506 attach = 0; 528 attach = 0;
507} 529}
508#endif 530#endif
509
510void attachable::optimise ()
511{
512 if (self
513 && SvREFCNT (self) == 1
514 && !HvTOTALKEYS (self))
515 {
516 flags &= ~F_BORROWED;
517 refcnt_inc ();
518 SvREFCNT_dec ((SV *)self);
519 }
520}
521 531
522///////////////////////////////////////////////////////////////////////////// 532/////////////////////////////////////////////////////////////////////////////
523 533
524extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 534extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
525{ 535{
828 CALL_CALL ("cf::map::emergency_save", G_VOID); 838 CALL_CALL ("cf::map::emergency_save", G_VOID);
829 CALL_END; 839 CALL_END;
830} 840}
831 841
832maptile * 842maptile *
833maptile::load_map_sync (const char *path, maptile *origin) 843maptile::find_sync (const char *path, maptile *origin)
834{ 844{
835 CALL_BEGIN (2); 845 CALL_BEGIN (2);
836 CALL_ARG (path); 846 CALL_ARG (path);
837 CALL_ARG (origin); 847 CALL_ARG (origin);
838 CALL_CALL ("cf::map::load_map_sync", G_SCALAR); 848 CALL_CALL ("cf::map::find_sync", G_SCALAR);
839 849
840 maptile *retval; 850 maptile *retval;
841 851
842 if (count) 852 if (count)
843 sv_to (POPs, retval); 853 sv_to (POPs, retval);
845 retval = 0; 855 retval = 0;
846 856
847 CALL_END; 857 CALL_END;
848 858
849 return retval; 859 return retval;
860}
861
862void
863maptile::do_load_sync ()
864{
865 CALL_BEGIN (1);
866 CALL_ARG (this);
867 CALL_CALL ("cf::map::do_load_sync", G_SCALAR);
868 CALL_END;
850} 869}
851 870
852void 871void
853maptile::change_all_map_light (int change) 872maptile::change_all_map_light (int change)
854{ 873{
873 892
874///////////////////////////////////////////////////////////////////////////// 893/////////////////////////////////////////////////////////////////////////////
875 894
876struct EventAPI *watcher_base::GEventAPI; 895struct EventAPI *watcher_base::GEventAPI;
877struct CoroAPI *coroapi::GCoroAPI; 896struct CoroAPI *coroapi::GCoroAPI;
897
898int coroapi::cede_counter;
878 899
879static void iw_dispatch (pe_event *ev) 900static void iw_dispatch (pe_event *ev)
880{ 901{
881 iw *w = (iw *)ev->ext_data; 902 iw *w = (iw *)ev->ext_data;
882 w->call (*w); 903 w->call (*w);
1459 const_iv (ST_SETUP) 1480 const_iv (ST_SETUP)
1460 const_iv (ST_PLAYING) 1481 const_iv (ST_PLAYING)
1461 const_iv (ST_CUSTOM) 1482 const_iv (ST_CUSTOM)
1462 1483
1463 const_iv (ST_CHANGE_CLASS) 1484 const_iv (ST_CHANGE_CLASS)
1464 const_iv (ST_CONFIRM_QUIT)
1465 const_iv (ST_GET_PARTY_PASSWORD)
1466 1485
1467 const_iv (IO_HEADER) 1486 const_iv (IO_HEADER)
1468 const_iv (IO_OBJECTS) 1487 const_iv (IO_OBJECTS)
1469 const_iv (IO_UNIQUES) 1488 const_iv (IO_UNIQUES)
1470 1489
1524 1543
1525void _global_reattach () 1544void _global_reattach ()
1526 CODE: 1545 CODE:
1527{ 1546{
1528 // reattach to all attachable objects in the game. 1547 // reattach to all attachable objects in the game.
1529 for (sockvec::iterator i = clients.begin (); i != clients.end (); ++i) 1548 for_all_clients (ns)
1530 (*i)->reattach (); 1549 ns->reattach ();
1531 1550
1532 for_all_players (pl) 1551 for_all_players (pl)
1533 pl->reattach (); 1552 pl->reattach ();
1534 1553
1535 //TODO 1554 //TODO
1536 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i) 1555 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i)
1537 // i->second->reattach (); 1556 // i->second->reattach ();
1538 1557
1539 for (object *op = object::first; op; op = op->next) 1558 for_all_objects (op)
1540 op->reattach (); 1559 op->reattach ();
1541} 1560}
1542 1561
1543NV floor (NV x) 1562NV floor (NV x)
1544 1563
1601 1620
1602void emergency_save () 1621void emergency_save ()
1603 1622
1604void _exit (int status = 0) 1623void _exit (int status = 0)
1605 1624
1625#if _POSIX_MEMLOCK
1626
1627int mlockall (int flags = MCL_CURRENT | MCL_FUTURE)
1628
1629int munlockall ()
1630
1631#endif
1632
1606int find_animation (char *text) 1633int find_animation (char *text)
1607 PROTOTYPE: $ 1634 PROTOTYPE: $
1608 1635
1609int random_roll (int min, int max, object *op, int goodbad); 1636int random_roll (int min, int max, object *op, int goodbad);
1610 1637
1656 CODE: 1683 CODE:
1657 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1684 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1658 OUTPUT: 1685 OUTPUT:
1659 RETVAL 1686 RETVAL
1660 1687
1661#bool 1688INCLUDE: $PERL genacc attachable ../include/cfperl.h |
1662#destroyed (attachable *at)
1663#
1664#void
1665#destroy (attachable *at)
1666 1689
1667MODULE = cf PACKAGE = cf::global 1690MODULE = cf PACKAGE = cf::global
1668 1691
1669int invoke (SV *klass, int event, ...) 1692int invoke (SV *klass, int event, ...)
1670 CODE: 1693 CODE:
1973 CODE: 1996 CODE:
1974 pl->ob->stats.hp = pl->ob->stats.maxhp; 1997 pl->ob->stats.hp = pl->ob->stats.maxhp;
1975 pl->ob->stats.sp = pl->ob->stats.maxsp; 1998 pl->ob->stats.sp = pl->ob->stats.maxsp;
1976 pl->ob->stats.grace = pl->ob->stats.maxgrace; 1999 pl->ob->stats.grace = pl->ob->stats.maxgrace;
1977 pl->orig_stats = pl->ob->stats; 2000 pl->orig_stats = pl->ob->stats;
1978
1979player *cf_player_find (char *name)
1980 PROTOTYPE: $
1981 2001
1982void cf_player_move (player *pl, int dir) 2002void cf_player_move (player *pl, int dir)
1983 2003
1984void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0); 2004void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0);
1985 2005
2031 if (y) sv_to (y, pl->bed_y); 2051 if (y) sv_to (y, pl->bed_y);
2032 2052
2033void 2053void
2034list () 2054list ()
2035 PPCODE: 2055 PPCODE:
2036 for (player *pl = first_player; pl; pl = pl->next) 2056 for_all_players (pl)
2037 XPUSHs (sv_2mortal (to_sv (pl))); 2057 XPUSHs (sv_2mortal (to_sv (pl)));
2038
2039bool
2040peaceful (player *pl, bool new_setting = 0)
2041 PROTOTYPE: $;$
2042 CODE:
2043 RETVAL = pl->peaceful;
2044 if (items > 1)
2045 pl->peaceful = new_setting;
2046 OUTPUT:
2047 RETVAL
2048
2049living *
2050orig_stats (player *pl)
2051 CODE:
2052 RETVAL = &pl->orig_stats;
2053 OUTPUT: RETVAL
2054
2055living *
2056last_stats (player *pl)
2057 CODE:
2058 RETVAL = &pl->last_stats;
2059 OUTPUT: RETVAL
2060 2058
2061 2059
2062MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ 2060MODULE = cf PACKAGE = cf::map PREFIX = cf_map_
2063 2061
2064int invoke (maptile *map, int event, ...) 2062int invoke (maptile *map, int event, ...)
2080 PROTOTYPE: 2078 PROTOTYPE:
2081 CODE: 2079 CODE:
2082 RETVAL = new maptile; 2080 RETVAL = new maptile;
2083 OUTPUT: 2081 OUTPUT:
2084 RETVAL 2082 RETVAL
2085
2086void
2087maptile::destroy ()
2088 2083
2089void 2084void
2090maptile::players () 2085maptile::players ()
2091 PPCODE: 2086 PPCODE:
2092 if (GIMME_V == G_SCALAR) 2087 if (GIMME_V == G_SCALAR)
2360 char *buf = SvPVbyte (packet, len); 2355 char *buf = SvPVbyte (packet, len);
2361 2356
2362 THIS->send_packet (buf, len); 2357 THIS->send_packet (buf, len);
2363} 2358}
2364 2359
2365void
2366client::destroy ()
2367

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines