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.118 by root, Sat Dec 30 20:32:30 2006 UTC vs.
Revision 1.129 by root, Sun Jan 7 21:54:59 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); 109void attachable::optimise ()
116#endif 110{
111 if (self
112 && SvREFCNT (self) == 1
113 && !HvTOTALKEYS (self))
114 {
115 flags &= ~F_BORROWED;
116 refcnt_inc ();
117 SvREFCNT_dec ((SV *)self);
118 }
117} 119}
118 120
119// check wether the object really is dead 121// check wether the object really is dead
120void 122void
121attachable::do_check () 123attachable::do_check ()
122{ 124{
123 if (refcnt > 0) 125 if (refcnt > 0)
124 return; 126 return;
125 127
126 // try to unborrow the refcnt from perl 128 optimise ();
127 if (flags & F_BORROWED) 129
130 if (self)
128 { 131 {
129 assert (self);//D//TODO//remove when stable 132 if (refcnt + SvREFCNT (self) > 0)
133 return;
134
135 assert (flags & F_BORROWED);
136
130 flags &= ~F_BORROWED; 137 flags &= ~F_BORROWED;
131 refcnt_inc (); 138 refcnt_inc ();
132 SvREFCNT_dec (self); 139 SvREFCNT_dec (self);
140 self = 0;
133 } 141 }
134 142
135 if (refcnt > 0 || self) 143 if (refcnt > 0)
136 return; 144 return;
137 145
138 destroy (); 146 destroy ();
139} 147}
140 148
141void 149void
142attachable::do_destroy () 150attachable::do_destroy ()
143{ 151{
144 invoke (EVENT_ATTACHABLE_DESTROY, DT_END); 152 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
145 153
146 //TODO: call generic destroy callback 154 if (self)
155 hv_clear (self);
156
147 mortals.push_back (this); 157 mortals.push_back (this);
148} 158}
149 159
150void 160void
151attachable::destroy () 161attachable::destroy ()
209 219
210static int 220static int
211attachable_free (pTHX_ SV *sv, MAGIC *mg) 221attachable_free (pTHX_ SV *sv, MAGIC *mg)
212{ 222{
213 attachable *at = (attachable *)mg->mg_ptr; 223 attachable *at = (attachable *)mg->mg_ptr;
214 assert (!(at->flags & attachable::F_BORROWED));//D//TODO//remove when stable 224 assert (!(at->flags & attachable::F_BORROWED));
215 at->self = 0; 225 at->self = 0;
216 // next line makes sense, but most objects still have refcnt 0 by default 226 // next line makes sense, but most objects still have refcnt 0 by default
217 //at->refcnt_chk (); 227 //at->refcnt_chk ();
218 return 0; 228 return 0;
219} 229}
232 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0); 242 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0);
233 243
234 // borrow the refcnt from the object 244 // borrow the refcnt from the object
235 obj->flags |= attachable::F_BORROWED; 245 obj->flags |= attachable::F_BORROWED;
236 obj->refcnt_dec (); 246 obj->refcnt_dec ();
247
248 // now bless the object _once_
249 return sv_bless (newRV_inc ((SV *)obj->self), stash);
237 } 250 }
238 251 else
239 return sv_bless (newRV_inc ((SV *)obj->self), stash); 252 return newRV_inc ((SV *)obj->self);
240} 253}
241 254
242static void 255static void
243clearSVptr (SV *sv) 256clearSVptr (SV *sv)
244{ 257{
328inline void sv_to (SV *sv, client * &v) { v = (client *)(attachable *)SvPTR_ornull (sv, "cf::client"); } 341inline 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"); } 342inline 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"); } 343inline 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"); } 344inline 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"); } 345inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)(attachable *)SvPTR_ornull (sv, "cf::map"); }
346inline 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"); } 347inline 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"); } 348inline 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"); } 349inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); }
336 350
337inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO 351inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO
504 } 518 }
505 519
506 attach = 0; 520 attach = 0;
507} 521}
508#endif 522#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 523
522///////////////////////////////////////////////////////////////////////////// 524/////////////////////////////////////////////////////////////////////////////
523 525
524extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 526extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
525{ 527{
828 CALL_CALL ("cf::map::emergency_save", G_VOID); 830 CALL_CALL ("cf::map::emergency_save", G_VOID);
829 CALL_END; 831 CALL_END;
830} 832}
831 833
832maptile * 834maptile *
833maptile::find_map (const char *path, maptile *origin) 835maptile::find_sync (const char *path, maptile *origin)
834{ 836{
835 CALL_BEGIN (2); 837 CALL_BEGIN (2);
836 CALL_ARG (path); 838 CALL_ARG (path);
837 CALL_ARG (origin); 839 CALL_ARG (origin);
838 CALL_CALL ("cf::map::find_map", G_SCALAR); 840 CALL_CALL ("cf::map::find_sync", G_SCALAR);
839 841
840 maptile *retval; 842 maptile *retval;
841 843
842 if (count) 844 if (count)
843 sv_to (POPs, retval); 845 sv_to (POPs, retval);
848 850
849 return retval; 851 return retval;
850} 852}
851 853
852void 854void
853maptile::do_load () 855maptile::do_load_sync ()
854{ 856{
855 CALL_BEGIN (1); 857 CALL_BEGIN (1);
856 CALL_ARG (this); 858 CALL_ARG (this);
857 CALL_CALL ("cf::map::do_load", G_VOID); 859 CALL_CALL ("cf::map::do_load_sync", G_SCALAR);
858 CALL_END; 860 CALL_END;
859}
860
861maptile *
862maptile::customise_for (object *op)
863{
864 CALL_BEGIN (2);
865 CALL_ARG (this);
866 CALL_ARG (op);
867 CALL_CALL ("cf::map::customise_for", G_SCALAR);
868
869 maptile *retval;
870
871 if (count)
872 sv_to (POPs, retval);
873 else
874 retval = 0;
875
876 CALL_END;
877
878 return retval ? retval : this;
879} 861}
880 862
881void 863void
882maptile::change_all_map_light (int change) 864maptile::change_all_map_light (int change)
883{ 865{
902 884
903///////////////////////////////////////////////////////////////////////////// 885/////////////////////////////////////////////////////////////////////////////
904 886
905struct EventAPI *watcher_base::GEventAPI; 887struct EventAPI *watcher_base::GEventAPI;
906struct CoroAPI *coroapi::GCoroAPI; 888struct CoroAPI *coroapi::GCoroAPI;
889
890int coroapi::cede_counter;
907 891
908static void iw_dispatch (pe_event *ev) 892static void iw_dispatch (pe_event *ev)
909{ 893{
910 iw *w = (iw *)ev->ext_data; 894 iw *w = (iw *)ev->ext_data;
911 w->call (*w); 895 w->call (*w);
1317 const_iv (P_BLOCKSVIEW) 1301 const_iv (P_BLOCKSVIEW)
1318 const_iv (P_PLAYER) 1302 const_iv (P_PLAYER)
1319 const_iv (P_NO_MAGIC) 1303 const_iv (P_NO_MAGIC)
1320 const_iv (P_IS_ALIVE) 1304 const_iv (P_IS_ALIVE)
1321 const_iv (P_NO_CLERIC) 1305 const_iv (P_NO_CLERIC)
1322 const_iv (P_NEED_UPDATE)
1323 const_iv (P_OUT_OF_MAP) 1306 const_iv (P_OUT_OF_MAP)
1324 const_iv (P_NEW_MAP) 1307 const_iv (P_NEW_MAP)
1308 const_iv (P_UPTODATE)
1325 1309
1326 const_iv (UP_OBJ_INSERT) 1310 const_iv (UP_OBJ_INSERT)
1327 const_iv (UP_OBJ_REMOVE) 1311 const_iv (UP_OBJ_REMOVE)
1328 const_iv (UP_OBJ_CHANGE) 1312 const_iv (UP_OBJ_CHANGE)
1329 const_iv (UP_OBJ_FACE) 1313 const_iv (UP_OBJ_FACE)
1488 const_iv (ST_SETUP) 1472 const_iv (ST_SETUP)
1489 const_iv (ST_PLAYING) 1473 const_iv (ST_PLAYING)
1490 const_iv (ST_CUSTOM) 1474 const_iv (ST_CUSTOM)
1491 1475
1492 const_iv (ST_CHANGE_CLASS) 1476 const_iv (ST_CHANGE_CLASS)
1493 const_iv (ST_CONFIRM_QUIT)
1494 const_iv (ST_GET_PARTY_PASSWORD)
1495 1477
1496 const_iv (IO_HEADER) 1478 const_iv (IO_HEADER)
1497 const_iv (IO_OBJECTS) 1479 const_iv (IO_OBJECTS)
1498 const_iv (IO_UNIQUES) 1480 const_iv (IO_UNIQUES)
1499 1481
1553 1535
1554void _global_reattach () 1536void _global_reattach ()
1555 CODE: 1537 CODE:
1556{ 1538{
1557 // reattach to all attachable objects in the game. 1539 // reattach to all attachable objects in the game.
1558 for (sockvec::iterator i = clients.begin (); i != clients.end (); ++i) 1540 for_all_clients (ns)
1559 (*i)->reattach (); 1541 ns->reattach ();
1560 1542
1561 for_all_players (pl) 1543 for_all_players (pl)
1562 pl->reattach (); 1544 pl->reattach ();
1563 1545
1564 //TODO 1546 //TODO
1565 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i) 1547 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i)
1566 // i->second->reattach (); 1548 // i->second->reattach ();
1567 1549
1568 for (object *op = object::first; op; op = op->next) 1550 for_all_objects (op)
1569 op->reattach (); 1551 op->reattach ();
1570} 1552}
1571 1553
1572NV floor (NV x) 1554NV floor (NV x)
1573 1555
1624 case 5: RETVAL = settings.playerdir; break; 1606 case 5: RETVAL = settings.playerdir; break;
1625 case 6: RETVAL = settings.datadir ; break; 1607 case 6: RETVAL = settings.datadir ; break;
1626 } 1608 }
1627 OUTPUT: RETVAL 1609 OUTPUT: RETVAL
1628 1610
1611void abort ()
1612
1629void emergency_save () 1613void emergency_save ()
1630 1614
1631void _exit (int status = 0) 1615void _exit (int status = 0)
1616
1617#if _POSIX_MEMLOCK
1618
1619int mlockall (int flags = MCL_CURRENT | MCL_FUTURE)
1620
1621int munlockall ()
1622
1623#endif
1632 1624
1633int find_animation (char *text) 1625int find_animation (char *text)
1634 PROTOTYPE: $ 1626 PROTOTYPE: $
1635 1627
1636int random_roll (int min, int max, object *op, int goodbad); 1628int random_roll (int min, int max, object *op, int goodbad);
1683 CODE: 1675 CODE:
1684 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1676 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1685 OUTPUT: 1677 OUTPUT:
1686 RETVAL 1678 RETVAL
1687 1679
1688#bool 1680INCLUDE: $PERL genacc attachable ../include/cfperl.h |
1689#destroyed (attachable *at)
1690#
1691#void
1692#destroy (attachable *at)
1693 1681
1694MODULE = cf PACKAGE = cf::global 1682MODULE = cf PACKAGE = cf::global
1695 1683
1696int invoke (SV *klass, int event, ...) 1684int invoke (SV *klass, int event, ...)
1697 CODE: 1685 CODE:
1942 RETVAL = op->contr; 1930 RETVAL = op->contr;
1943 OUTPUT: RETVAL 1931 OUTPUT: RETVAL
1944 1932
1945void check_score (object *op) 1933void check_score (object *op)
1946 1934
1947void cf_player_message (object *obj, char *txt, int flags = NDI_ORANGE | NDI_UNIQUE) 1935void message (object *op, char *txt, int flags = NDI_ORANGE | NDI_UNIQUE)
1936 CODE:
1937 new_draw_info (flags, 0, op, txt);
1948 1938
1949object *cf_player_send_inventory (object *op) 1939object *cf_player_send_inventory (object *op)
1950 1940
1951char *cf_player_get_ip (object *op) 1941char *cf_player_get_ip (object *op)
1952 ALIAS: ip = 0 1942 ALIAS: ip = 0
1998 CODE: 1988 CODE:
1999 pl->ob->stats.hp = pl->ob->stats.maxhp; 1989 pl->ob->stats.hp = pl->ob->stats.maxhp;
2000 pl->ob->stats.sp = pl->ob->stats.maxsp; 1990 pl->ob->stats.sp = pl->ob->stats.maxsp;
2001 pl->ob->stats.grace = pl->ob->stats.maxgrace; 1991 pl->ob->stats.grace = pl->ob->stats.maxgrace;
2002 pl->orig_stats = pl->ob->stats; 1992 pl->orig_stats = pl->ob->stats;
2003
2004player *cf_player_find (char *name)
2005 PROTOTYPE: $
2006 1993
2007void cf_player_move (player *pl, int dir) 1994void cf_player_move (player *pl, int dir)
2008 1995
2009void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0); 1996void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0);
2010 1997
2056 if (y) sv_to (y, pl->bed_y); 2043 if (y) sv_to (y, pl->bed_y);
2057 2044
2058void 2045void
2059list () 2046list ()
2060 PPCODE: 2047 PPCODE:
2061 for (player *pl = first_player; pl; pl = pl->next) 2048 for_all_players (pl)
2062 XPUSHs (sv_2mortal (to_sv (pl))); 2049 XPUSHs (sv_2mortal (to_sv (pl)));
2063 2050
2064bool 2051bool
2065peaceful (player *pl, bool new_setting = 0) 2052peaceful (player *pl, bool new_setting = 0)
2066 PROTOTYPE: $;$ 2053 PROTOTYPE: $;$
2105 PROTOTYPE: 2092 PROTOTYPE:
2106 CODE: 2093 CODE:
2107 RETVAL = new maptile; 2094 RETVAL = new maptile;
2108 OUTPUT: 2095 OUTPUT:
2109 RETVAL 2096 RETVAL
2110
2111void
2112maptile::destroy ()
2113 2097
2114void 2098void
2115maptile::players () 2099maptile::players ()
2116 PPCODE: 2100 PPCODE:
2117 if (GIMME_V == G_SCALAR) 2101 if (GIMME_V == G_SCALAR)
2206 case 4: RETVAL = newSVuv ( GET_MAP_MOVE_BLOCK (obj, x, y)); break; 2190 case 4: RETVAL = newSVuv ( GET_MAP_MOVE_BLOCK (obj, x, y)); break;
2207 case 5: RETVAL = newSVuv ( GET_MAP_MOVE_SLOW (obj, x, y)); break; 2191 case 5: RETVAL = newSVuv ( GET_MAP_MOVE_SLOW (obj, x, y)); break;
2208 case 6: RETVAL = newSVuv ( GET_MAP_MOVE_ON (obj, x, y)); break; 2192 case 6: RETVAL = newSVuv ( GET_MAP_MOVE_ON (obj, x, y)); break;
2209 case 7: RETVAL = newSVuv ( GET_MAP_MOVE_OFF (obj, x, y)); break; 2193 case 7: RETVAL = newSVuv ( GET_MAP_MOVE_OFF (obj, x, y)); break;
2210 } 2194 }
2211 OUTPUT: 2195 OUTPUT: RETVAL
2212 RETVAL
2213 2196
2214void fix_walls (maptile *map, int x, int y) 2197void fix_walls (maptile *map, int x, int y)
2215 2198
2216void fix_walls_around (maptile *map, int x, int y) 2199void fix_walls_around (maptile *map, int x, int y)
2200
2201const char *
2202region_name (maptile *m)
2203 CODE:
2204 RETVAL = get_name_of_region_for_map (m);
2205 OUTPUT: RETVAL
2217 2206
2218# worst xs function of my life 2207# worst xs function of my life
2219maptile * 2208maptile *
2220_create_random_map (\ 2209_create_random_map (\
2221 char *path,\ 2210 char *path,\
2265 assign (rmp.monsterstyle , monsterstyle); 2254 assign (rmp.monsterstyle , monsterstyle);
2266 assign (rmp.treasurestyle , treasurestyle); 2255 assign (rmp.treasurestyle , treasurestyle);
2267 assign (rmp.layoutstyle , layoutstyle); 2256 assign (rmp.layoutstyle , layoutstyle);
2268 assign (rmp.doorstyle , doorstyle); 2257 assign (rmp.doorstyle , doorstyle);
2269 assign (rmp.decorstyle , decorstyle); 2258 assign (rmp.decorstyle , decorstyle);
2270 assign (rmp.origin_map , origin_map);
2271 assign (rmp.final_map , final_map);
2272 assign (rmp.exitstyle , exitstyle); 2259 assign (rmp.exitstyle , exitstyle);
2273 assign (rmp.this_map , this_map);
2274 assign (rmp.exit_on_final_map, exit_on_final_map); 2260 assign (rmp.exit_on_final_map, exit_on_final_map);
2275 2261
2262 rmp.origin_map = origin_map;
2263 rmp.final_map = final_map;
2264 rmp.this_map = this_map;
2276 rmp.Xsize = Xsize; 2265 rmp.Xsize = Xsize;
2277 rmp.Ysize = Ysize; 2266 rmp.Ysize = Ysize;
2278 rmp.expand2x = expand2x; 2267 rmp.expand2x = expand2x;
2279 rmp.layoutoptions1 = layoutoptions1; 2268 rmp.layoutoptions1 = layoutoptions1;
2280 rmp.layoutoptions2 = layoutoptions2; 2269 rmp.layoutoptions2 = layoutoptions2;
2323 PROTOTYPE: 2312 PROTOTYPE:
2324 CODE: 2313 CODE:
2325 RETVAL = get_firstparty (); 2314 RETVAL = get_firstparty ();
2326 OUTPUT: RETVAL 2315 OUTPUT: RETVAL
2327 2316
2328partylist *next (partylist *party) 2317INCLUDE: $PERL genacc partylist ../include/player.h |
2329 CODE:
2330 RETVAL = party->next;
2331 OUTPUT: RETVAL
2332
2333const char *name (partylist *party)
2334 CODE:
2335 RETVAL = party->partyname;
2336 OUTPUT: RETVAL
2337
2338const char *password (partylist *party)
2339 CODE:
2340 RETVAL = party->passwd;
2341 OUTPUT: RETVAL
2342 2318
2343MODULE = cf PACKAGE = cf::region 2319MODULE = cf PACKAGE = cf::region
2344 2320
2345region *first () 2321region *first ()
2346 PROTOTYPE: 2322 PROTOTYPE:
2347 CODE: 2323 CODE:
2348 RETVAL = first_region; 2324 RETVAL = first_region;
2349 OUTPUT: RETVAL 2325 OUTPUT: RETVAL
2350 2326
2351region *next (region *reg) 2327region *find (char *name)
2328 PROTOTYPE: $
2352 CODE: 2329 CODE:
2353 RETVAL = reg->next; 2330 RETVAL = get_region_by_name (name);
2354 OUTPUT: RETVAL 2331 OUTPUT: RETVAL
2355 2332
2356const char *name (region *reg) 2333INCLUDE: $PERL genacc region ../include/map.h |
2357 CODE:
2358 RETVAL = reg->name;
2359 OUTPUT: RETVAL
2360
2361region *parent (region *reg)
2362 CODE:
2363 RETVAL = reg->parent;
2364 OUTPUT: RETVAL
2365
2366const char *longname (region *reg)
2367 CODE:
2368 RETVAL = reg->longname;
2369 OUTPUT: RETVAL
2370
2371const char *msg (region *reg)
2372 CODE:
2373 RETVAL = reg->msg;
2374 OUTPUT: RETVAL
2375 2334
2376MODULE = cf PACKAGE = cf::living 2335MODULE = cf PACKAGE = cf::living
2377 2336
2378INCLUDE: $PERL genacc living ../include/living.h | 2337INCLUDE: $PERL genacc living ../include/living.h |
2379 2338
2410 char *buf = SvPVbyte (packet, len); 2369 char *buf = SvPVbyte (packet, len);
2411 2370
2412 THIS->send_packet (buf, len); 2371 THIS->send_packet (buf, len);
2413} 2372}
2414 2373
2415void
2416client::destroy ()
2417

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines