ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro-Mysql/Mysql.xs
(Generate patch)

Comparing Coro-Mysql/Mysql.xs (file contents):
Revision 1.1 by root, Mon May 18 15:19:38 2009 UTC vs.
Revision 1.6 by root, Wed Sep 1 16:38:07 2010 UTC

5#include <mysql.h> 5#include <mysql.h>
6 6
7#include "EXTERN.h" 7#include "EXTERN.h"
8#include "perl.h" 8#include "perl.h"
9#include "XSUB.h" 9#include "XSUB.h"
10
11#define IN_DESTRUCT PL_dirty
10 12
11typedef U16 uint16; 13typedef U16 uint16;
12 14
13/* cached function gv's */ 15/* cached function gv's */
14static CV *readable, *writable; 16static CV *readable, *writable;
19 21
20#define CoMy_MAGIC 0x436f4d79 22#define CoMy_MAGIC 0x436f4d79
21 23
22typedef struct { 24typedef struct {
23 int magic; 25 int magic;
24 SV *corosocket; 26 SV *corohandle_sv, *corohandle;
25 int bufofs, bufcnt; 27 int bufofs, bufcnt;
26 char buf[VIO_READ_BUFFER_SIZE]; 28 char buf[VIO_READ_BUFFER_SIZE];
27} ourdata; 29} ourdata;
28 30
29#define OURDATAPTR (*((ourdata **)((vio)->desc + DESC_OFFSET))) 31#define OURDATAPTR (*((ourdata **)((vio)->desc + DESC_OFFSET)))
30 32
31static int 33static int
32our_read (Vio *vio, gptr p, int len) 34our_read (Vio *vio, xgptr p, int len)
33{ 35{
34 ourdata *our = OURDATAPTR; 36 ourdata *our = OURDATAPTR;
35 37
36 if (!our->bufcnt) 38 if (!our->bufcnt)
37 { 39 {
48 break; 50 break;
49 51
50 { 52 {
51 dSP; 53 dSP;
52 PUSHMARK (SP); 54 PUSHMARK (SP);
53 XPUSHs (our->corosocket); 55 XPUSHs (our->corohandle);
54 PUTBACK; 56 PUTBACK;
55 call_sv ((SV *)readable, G_VOID | G_DISCARD); 57 call_sv ((SV *)readable, G_VOID | G_DISCARD);
56 } 58 }
57 } 59 }
58 60
72 74
73 return len; 75 return len;
74} 76}
75 77
76static int 78static int
77our_write (Vio *vio, const gptr p, int len) 79our_write (Vio *vio, const xgptr p, int len)
78{ 80{
79 char *ptr = (char *)p; 81 char *ptr = (char *)p;
80 my_bool dummy; 82 my_bool dummy;
81 83
82 vio->vioblocking (vio, 0, &dummy); 84 vio->vioblocking (vio, 0, &dummy);
92 } 94 }
93 else if (errno == EAGAIN) 95 else if (errno == EAGAIN)
94 { 96 {
95 dSP; 97 dSP;
96 PUSHMARK (SP); 98 PUSHMARK (SP);
97 XPUSHs (OURDATAPTR->corosocket); 99 XPUSHs (OURDATAPTR->corohandle);
98 PUTBACK; 100 PUTBACK;
99 call_sv ((SV *)writable, G_VOID | G_DISCARD); 101 call_sv ((SV *)writable, G_VOID | G_DISCARD);
100 } 102 }
101 else if (ptr == (char *)p) 103 else if (ptr == (char *)p)
102 return -1; 104 return -1;
103 else 105 else
104 break; 106 break;
105 } 107 }
106 108
107 return ptr - (char *)p; 109 return ptr - (char *)p;
110}
111
112static int
113our_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);
108} 134}
109 135
110MODULE = Coro::Mysql PACKAGE = Coro::Mysql 136MODULE = Coro::Mysql PACKAGE = Coro::Mysql
111 137
112BOOT: 138BOOT:
116} 142}
117 143
118PROTOTYPES: ENABLE 144PROTOTYPES: ENABLE
119 145
120void 146void
121_patch (IV sock, int fd, SV *corosocket) 147_patch (IV sock, int fd, SV *corohandle_sv, SV *corohandle)
122 CODE: 148 CODE:
123{ 149{
124 MYSQL *my = (MYSQL *)sock; 150 MYSQL *my = (MYSQL *)sock;
125 Vio *vio = my->net.vio; 151 Vio *vio = my->net.vio;
126 ourdata *our; 152 ourdata *our;
129 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?");
130 156
131 if (fd != vio->sd) 157 if (fd != vio->sd)
132 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?");
133 159
160 if (vio->vioclose != vio_close)
161 croak ("vio.write has unexpected content - library mismatch, unsupported transport or API changes?");
162
134 if (vio->write != vio_write) 163 if (vio->write != vio_write)
135 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?");
136 165
137 if (vio->read != vio_read && vio->read != vio_read_buff) 166 if (vio->read != vio_read
167 && vio->read != vio_read_buff)
138 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?");
139 169
140 Newz (0, our, 1, ourdata); 170 Newz (0, our, 1, ourdata);
141 our->magic = CoMy_MAGIC; 171 our->magic = CoMy_MAGIC;
172 our->corohandle_sv = newSVsv (corohandle_sv);
142 our->corosocket = newSVsv (corosocket); 173 our->corohandle = newSVsv (corohandle);
143 174
144 vio->desc [DESC_OFFSET - 1] = 0; 175 vio->desc [DESC_OFFSET - 1] = 0;
145 OURDATAPTR = our; 176 OURDATAPTR = our;
146 177
178 vio->vioclose = our_close;
147 vio->write = our_write; 179 vio->write = our_write;
148 vio->read = our_read; 180 vio->read = our_read;
149} 181}
150 182
151void
152_unpatch (IV sock)
153 CODE:
154{
155 MYSQL *my = (MYSQL *)sock;
156 Vio *vio = my->net.vio;
157 my_bool dummy;
158
159 if (vio->read != our_read)
160 croak ("vio.read has unexpected content during unpatch - wtf?");
161
162 SvREFCNT_dec (OURDATAPTR->corosocket);
163
164 Safefree (OURDATAPTR);
165
166 vio->read = vio_read;
167 vio->write = vio_write;
168}
169
170
171

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines