--- Coro-Mysql/Mysql.xs 2009/06/20 20:44:09 1.4 +++ Coro-Mysql/Mysql.xs 2009/07/18 05:58:27 1.5 @@ -23,7 +23,7 @@ typedef struct { int magic; - SV *corosocket; + SV *corohandle_sv, *corohandle; int bufofs, bufcnt; char buf[VIO_READ_BUFFER_SIZE]; } ourdata; @@ -52,7 +52,7 @@ { dSP; PUSHMARK (SP); - XPUSHs (our->corosocket); + XPUSHs (our->corohandle); PUTBACK; call_sv ((SV *)readable, G_VOID | G_DISCARD); } @@ -96,7 +96,7 @@ { dSP; PUSHMARK (SP); - XPUSHs (OURDATAPTR->corosocket); + XPUSHs (OURDATAPTR->corohandle); PUTBACK; call_sv ((SV *)writable, G_VOID | G_DISCARD); } @@ -109,6 +109,30 @@ return ptr - (char *)p; } +static int +our_close (Vio *vio) +{ + if (vio->read != our_read) + croak ("vio.read has unexpected content during unpatch - wtf?"); + + if (vio->write != our_write) + croak ("vio.write has unexpected content during unpatch - wtf?"); + + if (vio->vioclose != our_close) + croak ("vio.vioclose has unexpected content during unpatch - wtf?"); + + SvREFCNT_dec (OURDATAPTR->corohandle); + SvREFCNT_dec (OURDATAPTR->corohandle_sv); + + Safefree (OURDATAPTR); + + vio->read = vio_read; + vio->write = vio_write; + vio->vioclose = vio_close; + + vio->vioclose (vio); +} + MODULE = Coro::Mysql PACKAGE = Coro::Mysql BOOT: @@ -120,7 +144,7 @@ PROTOTYPES: ENABLE void -_patch (IV sock, int fd, SV *corosocket) +_patch (IV sock, int fd, SV *corohandle_sv, SV *corohandle) CODE: { MYSQL *my = (MYSQL *)sock; @@ -133,47 +157,26 @@ if (fd != vio->sd) croak ("DBD::mysql fd and vio-sd disagree - library mismatch, unsupported transport or API changes?"); + if (vio->vioclose != vio_close) + croak ("vio.write has unexpected content - library mismatch, unsupported transport or API changes?"); + if (vio->write != vio_write) croak ("vio.write has unexpected content - library mismatch, unsupported transport or API changes?"); - if (vio->read != vio_read && vio->read != vio_read_buff) + if (vio->read != vio_read + && vio->read != vio_read_buff) croak ("vio.read has unexpected content - library mismatch, unsupported transport or API changes?"); Newz (0, our, 1, ourdata); our->magic = CoMy_MAGIC; - our->corosocket = newSVsv (corosocket); + our->corohandle_sv = newSVsv (corohandle_sv); + our->corohandle = newSVsv (corohandle); vio->desc [DESC_OFFSET - 1] = 0; OURDATAPTR = our; - vio->write = our_write; - vio->read = our_read; + vio->vioclose = our_close; + vio->write = our_write; + vio->read = our_read; } -void -_unpatch (IV sock) - CODE: - if (!IN_DESTRUCT) - { - /* we currently leak data during global destruction */ - /* perl makes it extremely hard to do otherwise, though */ - MYSQL *my = (MYSQL *)sock; - Vio *vio = my->net.vio; - my_bool dummy; - - if (vio->read != our_read) - croak ("vio.read has unexpected content during unpatch - wtf?"); - - if (vio->write != our_write) - croak ("vio.write has unexpected content during unpatch - wtf?"); - - SvREFCNT_dec (OURDATAPTR->corosocket); - - Safefree (OURDATAPTR); - - vio->read = vio_read; - vio->write = vio_write; - } - - -