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

Comparing BDB/BDB.xs (file contents):
Revision 1.30 by root, Sun Jan 13 09:43:21 2008 UTC vs.
Revision 1.36 by root, Sun Mar 30 08:01:58 2008 UTC

47typedef DBC DBC_ornuked; 47typedef DBC DBC_ornuked;
48typedef DB DB_ornuked; 48typedef DB DB_ornuked;
49typedef DB_SEQUENCE DB_SEQUENCE_ornuked; 49typedef DB_SEQUENCE DB_SEQUENCE_ornuked;
50 50
51typedef SV SV8; /* byte-sv, used for argument-checking */ 51typedef SV SV8; /* byte-sv, used for argument-checking */
52typedef char *octetstring; 52typedef char *bdb_filename;
53 53
54static SV *prepare_cb; 54static SV *prepare_cb;
55 55
56#if DB_VERSION_MINOR >= 6 56#if DB_VERSION_MINOR >= 6
57# define c_close close 57# define c_close close
60# define c_dup dup 60# define c_dup dup
61# define c_get get 61# define c_get get
62# define c_pget pget 62# define c_pget pget
63# define c_put put 63# define c_put put
64#endif 64#endif
65
66static char *
67get_bdb_filename (SV *sv)
68{
69 if (!SvOK (sv))
70 return 0;
71
72#if _WIN32
73 /* win32 madness + win32 perl absolutely brokenness make for horrible hacks */
74 {
75 STRLEN len;
76 char *src = SvPVbyte (sv, len);
77 SV *t1 = sv_newmortal ();
78 SV *t2 = sv_newmortal ();
79
80 sv_upgrade (t1, SVt_PV); SvPOK_only (t1); SvGROW (t1, len * 16 + 1);
81 sv_upgrade (t2, SVt_PV); SvPOK_only (t2); SvGROW (t2, len * 16 + 1);
82
83 len = MultiByteToWideChar (CP_ACP, 0, src, len, (WCHAR *)SvPVX (t1), SvLEN (t1) / sizeof (WCHAR));
84 len = WideCharToMultiByte (CP_UTF8, 0, (WCHAR *)SvPVX (t1), len, SvPVX (t2), SvLEN (t2), 0, 0);
85 SvPOK_only (t2);
86 SvPVX (t2)[len] = 0;
87 SvCUR_set (t2, len);
88
89 return SvPVX (t2);
90 }
91#else
92 return SvPVbyte_nolen (sv);
93#endif
94}
65 95
66static void 96static void
67debug_errcall (const DB_ENV *dbenv, const char *errpfx, const char *msg) 97debug_errcall (const DB_ENV *dbenv, const char *errpfx, const char *msg)
68{ 98{
69 printf ("err[%s]\n", msg); 99 printf ("err[%s]\n", msg);
205static mutex_t reqlock = X_MUTEX_INIT; 235static mutex_t reqlock = X_MUTEX_INIT;
206static cond_t reqwait = X_COND_INIT; 236static cond_t reqwait = X_COND_INIT;
207 237
208#if WORDACCESS_UNSAFE 238#if WORDACCESS_UNSAFE
209 239
210static unsigned int get_nready () 240static unsigned int get_nready (void)
211{ 241{
212 unsigned int retval; 242 unsigned int retval;
213 243
214 X_LOCK (reqlock); 244 X_LOCK (reqlock);
215 retval = nready; 245 retval = nready;
216 X_UNLOCK (reqlock); 246 X_UNLOCK (reqlock);
217 247
218 return retval; 248 return retval;
219} 249}
220 250
221static unsigned int get_npending () 251static unsigned int get_npending (void)
222{ 252{
223 unsigned int retval; 253 unsigned int retval;
224 254
225 X_LOCK (reslock); 255 X_LOCK (reslock);
226 retval = npending; 256 retval = npending;
227 X_UNLOCK (reslock); 257 X_UNLOCK (reslock);
228 258
229 return retval; 259 return retval;
230} 260}
231 261
232static unsigned int get_nthreads () 262static unsigned int get_nthreads (void)
233{ 263{
234 unsigned int retval; 264 unsigned int retval;
235 265
236 X_LOCK (wrklock); 266 X_LOCK (wrklock);
237 retval = started; 267 retval = started;
300 } 330 }
301 331
302 abort (); 332 abort ();
303} 333}
304 334
305static int poll_cb (); 335static int poll_cb (void);
306static void req_free (bdb_req req); 336static void req_free (bdb_req req);
307static void req_cancel (bdb_req req); 337static void req_cancel (bdb_req req);
308 338
309static int req_invoke (bdb_req req) 339static int req_invoke (bdb_req req)
310{ 340{
391#else 421#else
392# define TO_SOCKET(x) (x) 422# define TO_SOCKET(x) (x)
393#endif 423#endif
394 424
395static void 425static void
396create_respipe () 426create_respipe (void)
397{ 427{
398#ifdef _WIN32 428#ifdef _WIN32
399 int arg; /* argg */ 429 int arg; /* argg */
400#endif 430#endif
401 int old_readfd = respipe [0]; 431 int old_readfd = respipe [0];
455 free (wrk); 485 free (wrk);
456 486
457 X_UNLOCK (wrklock); 487 X_UNLOCK (wrklock);
458} 488}
459 489
460static void maybe_start_thread () 490static void maybe_start_thread (void)
461{ 491{
462 if (get_nthreads () >= wanted) 492 if (get_nthreads () >= wanted)
463 return; 493 return;
464 494
465 /* todo: maybe use idle here, but might be less exact */ 495 /* todo: maybe use idle here, but might be less exact */
550 580
551 while (started > wanted) 581 while (started > wanted)
552 end_thread (); 582 end_thread ();
553} 583}
554 584
555static void poll_wait () 585static void poll_wait (void)
556{ 586{
557 fd_set rfd; 587 fd_set rfd;
558 588
559 while (nreqs) 589 while (nreqs)
560 { 590 {
573 603
574 PerlSock_select (respipe [0] + 1, &rfd, 0, 0, 0); 604 PerlSock_select (respipe [0] + 1, &rfd, 0, 0, 0);
575 } 605 }
576} 606}
577 607
578static int poll_cb () 608static int poll_cb (void)
579{ 609{
580 dSP; 610 dSP;
581 int count = 0; 611 int count = 0;
582 int maxreqs = max_poll_reqs; 612 int maxreqs = max_poll_reqs;
583 int do_croak = 0; 613 int do_croak = 0;
952static void 982static void
953ptr_nuke (SV *sv) 983ptr_nuke (SV *sv)
954{ 984{
955 assert (SvROK (sv)); 985 assert (SvROK (sv));
956 sv_setiv (SvRV (sv), 0); 986 sv_setiv (SvRV (sv), 0);
987}
988
989static int
990errno_get (pTHX_ SV *sv, MAGIC *mg)
991{
992 if (*mg->mg_ptr == '!') // should always be the case
993 if (-30999 <= errno && errno <= -30800)
994 {
995 sv_setnv (sv, (NV)errno);
996 sv_setpv (sv, db_strerror (errno));
997 SvNOK_on (sv); /* what a wonderful hack! */
998 // ^^^ copied from perl sources
999 return 0;
1000 }
1001
1002 return PL_vtbl_sv.svt_get (aTHX_ sv, mg);
1003}
1004
1005static MGVTBL vtbl_errno;
1006
1007// this wonderful hack :( patches perl's $! variable to support our errno values
1008static void
1009patch_errno (void)
1010{
1011 SV *sv;
1012 MAGIC *mg;
1013
1014 if (!(sv = get_sv ("!", 1)))
1015 return;
1016
1017 if (!(mg = mg_find (sv, PERL_MAGIC_sv)))
1018 return;
1019
1020 if (mg->mg_virtual != &PL_vtbl_sv)
1021 return;
1022
1023 vtbl_errno = PL_vtbl_sv;
1024 vtbl_errno.svt_get = errno_get;
1025 mg->mg_virtual = &vtbl_errno;
957} 1026}
958 1027
959MODULE = BDB PACKAGE = BDB 1028MODULE = BDB PACKAGE = BDB
960 1029
961PROTOTYPES: ENABLE 1030PROTOTYPES: ENABLE
1159 X_MUTEX_CHECK (reslock); 1228 X_MUTEX_CHECK (reslock);
1160 X_MUTEX_CHECK (reqlock); 1229 X_MUTEX_CHECK (reqlock);
1161 1230
1162 X_COND_CHECK (reqwait); 1231 X_COND_CHECK (reqwait);
1163#endif 1232#endif
1233 patch_errno ();
1164} 1234}
1165 1235
1166void 1236void
1167max_poll_reqs (int nreqs) 1237max_poll_reqs (int nreqs)
1168 PROTOTYPE: $ 1238 PROTOTYPE: $
1326} 1396}
1327 OUTPUT: 1397 OUTPUT:
1328 RETVAL 1398 RETVAL
1329 1399
1330void 1400void
1331db_env_open (DB_ENV *env, octetstring db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef) 1401db_env_open (DB_ENV *env, bdb_filename db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef)
1332 CODE: 1402 CODE:
1333{ 1403{
1334 dREQ (REQ_ENV_OPEN); 1404 dREQ (REQ_ENV_OPEN);
1335 1405
1336 req->env = env; 1406 req->env = env;
1407} 1477}
1408 OUTPUT: 1478 OUTPUT:
1409 RETVAL 1479 RETVAL
1410 1480
1411void 1481void
1412db_open (DB *db, DB_TXN_ornull *txnid, octetstring file, octetstring database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef) 1482db_open (DB *db, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef)
1413 CODE: 1483 CODE:
1414{ 1484{
1415 dREQ (REQ_DB_OPEN); 1485 dREQ (REQ_DB_OPEN);
1416 req->db = db; 1486 req->db = db;
1417 req->txn = txnid; 1487 req->txn = txnid;
1457 req->uint1 = flags; 1527 req->uint1 = flags;
1458 REQ_SEND; 1528 REQ_SEND;
1459} 1529}
1460 1530
1461void 1531void
1462db_upgrade (DB *db, octetstring file, U32 flags = 0, SV *callback = &PL_sv_undef) 1532db_upgrade (DB *db, bdb_filename file, U32 flags = 0, SV *callback = &PL_sv_undef)
1463 CODE: 1533 CODE:
1464{ 1534{
1465 dREQ (REQ_DB_SYNC); 1535 dREQ (REQ_DB_SYNC);
1466 req->db = db; 1536 req->db = db;
1467 req->buf1 = strdup (file); 1537 req->buf1 = strdup (file);
2045 CODE: 2115 CODE:
2046 RETVAL = seq->set_range (seq, min, max); 2116 RETVAL = seq->set_range (seq, min, max);
2047 OUTPUT: 2117 OUTPUT:
2048 RETVAL 2118 RETVAL
2049 2119
2120

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines