… | |
… | |
21 | |
21 | |
22 | #define CoMy_MAGIC 0x436f4d79 |
22 | #define CoMy_MAGIC 0x436f4d79 |
23 | |
23 | |
24 | typedef struct { |
24 | typedef struct { |
25 | int magic; |
25 | int magic; |
26 | SV *corosocket; |
26 | SV *corohandle_sv, *corohandle; |
27 | int bufofs, bufcnt; |
27 | int bufofs, bufcnt; |
28 | char buf[VIO_READ_BUFFER_SIZE]; |
28 | char buf[VIO_READ_BUFFER_SIZE]; |
29 | } ourdata; |
29 | } ourdata; |
30 | |
30 | |
31 | #define OURDATAPTR (*((ourdata **)((vio)->desc + DESC_OFFSET))) |
31 | #define OURDATAPTR (*((ourdata **)((vio)->desc + DESC_OFFSET))) |
… | |
… | |
50 | break; |
50 | break; |
51 | |
51 | |
52 | { |
52 | { |
53 | dSP; |
53 | dSP; |
54 | PUSHMARK (SP); |
54 | PUSHMARK (SP); |
55 | XPUSHs (our->corosocket); |
55 | XPUSHs (our->corohandle); |
56 | PUTBACK; |
56 | PUTBACK; |
57 | call_sv ((SV *)readable, G_VOID | G_DISCARD); |
57 | call_sv ((SV *)readable, G_VOID | G_DISCARD); |
58 | } |
58 | } |
59 | } |
59 | } |
60 | |
60 | |
… | |
… | |
94 | } |
94 | } |
95 | else if (errno == EAGAIN) |
95 | else if (errno == EAGAIN) |
96 | { |
96 | { |
97 | dSP; |
97 | dSP; |
98 | PUSHMARK (SP); |
98 | PUSHMARK (SP); |
99 | XPUSHs (OURDATAPTR->corosocket); |
99 | XPUSHs (OURDATAPTR->corohandle); |
100 | PUTBACK; |
100 | PUTBACK; |
101 | call_sv ((SV *)writable, G_VOID | G_DISCARD); |
101 | call_sv ((SV *)writable, G_VOID | G_DISCARD); |
102 | } |
102 | } |
103 | else if (ptr == (char *)p) |
103 | else if (ptr == (char *)p) |
104 | return -1; |
104 | return -1; |
105 | else |
105 | else |
106 | break; |
106 | break; |
107 | } |
107 | } |
108 | |
108 | |
109 | return ptr - (char *)p; |
109 | return ptr - (char *)p; |
|
|
110 | } |
|
|
111 | |
|
|
112 | static int |
|
|
113 | our_close (Vio *vio) |
|
|
114 | { |
|
|
115 | if (vio->read != our_read) |
|
|
116 | croak ("vio.read has unexpected content during unpatch - wtf?"); |
|
|
117 | |
|
|
118 | if (vio->write != our_write) |
|
|
119 | croak ("vio.write has unexpected content during unpatch - wtf?"); |
|
|
120 | |
|
|
121 | if (vio->vioclose != our_close) |
|
|
122 | croak ("vio.vioclose has unexpected content during unpatch - wtf?"); |
|
|
123 | |
|
|
124 | SvREFCNT_dec (OURDATAPTR->corohandle); |
|
|
125 | SvREFCNT_dec (OURDATAPTR->corohandle_sv); |
|
|
126 | |
|
|
127 | Safefree (OURDATAPTR); |
|
|
128 | |
|
|
129 | vio->read = vio_read; |
|
|
130 | vio->write = vio_write; |
|
|
131 | vio->vioclose = vio_close; |
|
|
132 | |
|
|
133 | vio->vioclose (vio); |
110 | } |
134 | } |
111 | |
135 | |
112 | MODULE = Coro::Mysql PACKAGE = Coro::Mysql |
136 | MODULE = Coro::Mysql PACKAGE = Coro::Mysql |
113 | |
137 | |
114 | BOOT: |
138 | BOOT: |
… | |
… | |
118 | } |
142 | } |
119 | |
143 | |
120 | PROTOTYPES: ENABLE |
144 | PROTOTYPES: ENABLE |
121 | |
145 | |
122 | void |
146 | void |
123 | _patch (IV sock, int fd, SV *corosocket) |
147 | _patch (IV sock, int fd, SV *corohandle_sv, SV *corohandle) |
124 | CODE: |
148 | CODE: |
125 | { |
149 | { |
126 | MYSQL *my = (MYSQL *)sock; |
150 | MYSQL *my = (MYSQL *)sock; |
127 | Vio *vio = my->net.vio; |
151 | Vio *vio = my->net.vio; |
128 | ourdata *our; |
152 | ourdata *our; |
… | |
… | |
131 | croak ("DBD::mysql fd and libmysql disagree - library mismatch, unsupported transport or API changes?"); |
155 | croak ("DBD::mysql fd and libmysql disagree - library mismatch, unsupported transport or API changes?"); |
132 | |
156 | |
133 | if (fd != vio->sd) |
157 | if (fd != vio->sd) |
134 | croak ("DBD::mysql fd and vio-sd disagree - library mismatch, unsupported transport or API changes?"); |
158 | croak ("DBD::mysql fd and vio-sd disagree - library mismatch, unsupported transport or API changes?"); |
135 | |
159 | |
|
|
160 | if (vio->vioclose != vio_close) |
|
|
161 | croak ("vio.write has unexpected content - library mismatch, unsupported transport or API changes?"); |
|
|
162 | |
136 | if (vio->write != vio_write) |
163 | if (vio->write != vio_write) |
137 | croak ("vio.write has unexpected content - library mismatch, unsupported transport or API changes?"); |
164 | croak ("vio.write has unexpected content - library mismatch, unsupported transport or API changes?"); |
138 | |
165 | |
139 | if (vio->read != vio_read && vio->read != vio_read_buff) |
166 | if (vio->read != vio_read |
|
|
167 | && vio->read != vio_read_buff) |
140 | croak ("vio.read has unexpected content - library mismatch, unsupported transport or API changes?"); |
168 | croak ("vio.read has unexpected content - library mismatch, unsupported transport or API changes?"); |
141 | |
169 | |
142 | Newz (0, our, 1, ourdata); |
170 | Newz (0, our, 1, ourdata); |
143 | our->magic = CoMy_MAGIC; |
171 | our->magic = CoMy_MAGIC; |
|
|
172 | our->corohandle_sv = newSVsv (corohandle_sv); |
144 | our->corosocket = newSVsv (corosocket); |
173 | our->corohandle = newSVsv (corohandle); |
145 | |
174 | |
146 | vio->desc [DESC_OFFSET - 1] = 0; |
175 | vio->desc [DESC_OFFSET - 1] = 0; |
147 | OURDATAPTR = our; |
176 | OURDATAPTR = our; |
148 | |
177 | |
|
|
178 | vio->vioclose = our_close; |
149 | vio->write = our_write; |
179 | vio->write = our_write; |
150 | vio->read = our_read; |
180 | vio->read = our_read; |
151 | } |
181 | } |
152 | |
182 | |
153 | void |
|
|
154 | _unpatch (IV sock) |
|
|
155 | CODE: |
|
|
156 | if (!IN_DESTRUCT) |
|
|
157 | { |
|
|
158 | /* we currently leak data during global destruction */ |
|
|
159 | /* perl makes it extremely hard to do otherwise, though */ |
|
|
160 | MYSQL *my = (MYSQL *)sock; |
|
|
161 | Vio *vio = my->net.vio; |
|
|
162 | my_bool dummy; |
|
|
163 | |
|
|
164 | if (vio->read != our_read) |
|
|
165 | croak ("vio.read has unexpected content during unpatch - wtf?"); |
|
|
166 | |
|
|
167 | if (vio->write != our_write) |
|
|
168 | croak ("vio.write has unexpected content during unpatch - wtf?"); |
|
|
169 | |
|
|
170 | SvREFCNT_dec (OURDATAPTR->corosocket); |
|
|
171 | |
|
|
172 | Safefree (OURDATAPTR); |
|
|
173 | |
|
|
174 | vio->read = vio_read; |
|
|
175 | vio->write = vio_write; |
|
|
176 | } |
|
|
177 | |
|
|
178 | |
|
|
179 | |
|
|