| Index: third_party/sqlite/src/src/test_syscall.c
|
| diff --git a/third_party/sqlite/src/src/test_syscall.c b/third_party/sqlite/src/src/test_syscall.c
|
| index b8b05c5903b8b36eb78b8626171580367163aa8b..0dac2e897e0c39b11b3b7e82f1029e9099ba5170 100644
|
| --- a/third_party/sqlite/src/src/test_syscall.c
|
| +++ b/third_party/sqlite/src/src/test_syscall.c
|
| @@ -23,7 +23,7 @@
|
| **
|
| ** open close access getcwd stat fstat
|
| ** ftruncate fcntl read pread pread64 write
|
| -** pwrite pwrite64 fchmod fallocate
|
| +** pwrite pwrite64 fchmod fallocate mmap
|
| **
|
| ** test_syscall uninstall
|
| ** Uninstall all wrapper functions.
|
| @@ -67,20 +67,26 @@
|
| ** test_syscall list
|
| ** Return a list of all system calls. The list is constructed using
|
| ** the xNextSystemCall() VFS method.
|
| +**
|
| +** test_syscall pagesize PGSZ
|
| +** If PGSZ is a power of two greater than 256, install a wrapper around
|
| +** OS function getpagesize() that reports the system page size as PGSZ.
|
| +** Or, if PGSZ is less than zero, remove any wrapper already installed.
|
| */
|
|
|
| +#include "sqliteInt.h"
|
| #include "sqlite3.h"
|
| #include "tcl.h"
|
| #include <stdlib.h>
|
| #include <string.h>
|
| #include <assert.h>
|
|
|
| -#include "sqliteInt.h"
|
| #if SQLITE_OS_UNIX
|
|
|
| -/* From test1.c */
|
| -extern const char *sqlite3TestErrorName(int);
|
| +/* From main.c */
|
| +extern const char *sqlite3ErrName(int);
|
|
|
| +#include <sys/mman.h>
|
| #include <sys/types.h>
|
| #include <errno.h>
|
|
|
| @@ -88,7 +94,9 @@ static struct TestSyscallGlobal {
|
| int bPersist; /* 1 for persistent errors, 0 for transient */
|
| int nCount; /* Fail after this many more calls */
|
| int nFail; /* Number of failures that have occurred */
|
| -} gSyscall = { 0, 0 };
|
| + int pgsz;
|
| + sqlite3_syscall_ptr orig_getpagesize;
|
| +} gSyscall = { 0, 0, 0, 0, 0 };
|
|
|
| static int ts_open(const char *, int, int);
|
| static int ts_close(int fd);
|
| @@ -106,7 +114,8 @@ static int ts_pwrite(int fd, const void *aBuf, size_t nBuf, off_t off);
|
| static int ts_pwrite64(int fd, const void *aBuf, size_t nBuf, off_t off);
|
| static int ts_fchmod(int fd, mode_t mode);
|
| static int ts_fallocate(int fd, off_t off, off_t len);
|
| -
|
| +static void *ts_mmap(void *, size_t, int, int, int, off_t);
|
| +static void *ts_mremap(void*, size_t, size_t, int, ...);
|
|
|
| struct TestSyscallArray {
|
| const char *zName;
|
| @@ -131,6 +140,8 @@ struct TestSyscallArray {
|
| /* 13 */ { "pwrite64", (sqlite3_syscall_ptr)ts_pwrite64, 0, 0, 0 },
|
| /* 14 */ { "fchmod", (sqlite3_syscall_ptr)ts_fchmod, 0, 0, 0 },
|
| /* 15 */ { "fallocate", (sqlite3_syscall_ptr)ts_fallocate, 0, 0, 0 },
|
| + /* 16 */ { "mmap", (sqlite3_syscall_ptr)ts_mmap, 0, 0, 0 },
|
| + /* 17 */ { "mremap", (sqlite3_syscall_ptr)ts_mremap, 0, 0, 0 },
|
| { 0, 0, 0, 0, 0 }
|
| };
|
|
|
| @@ -152,6 +163,8 @@ struct TestSyscallArray {
|
| aSyscall[13].xOrig)
|
| #define orig_fchmod ((int(*)(int,mode_t))aSyscall[14].xOrig)
|
| #define orig_fallocate ((int(*)(int,off_t,off_t))aSyscall[15].xOrig)
|
| +#define orig_mmap ((void*(*)(void*,size_t,int,int,int,off_t))aSyscall[16].xOrig)
|
| +#define orig_mremap ((void*(*)(void*,size_t,size_t,int,...))aSyscall[17].xOrig)
|
|
|
| /*
|
| ** This function is called exactly once from within each invocation of a
|
| @@ -325,6 +338,7 @@ static int ts_pread64(int fd, void *aBuf, size_t nBuf, off_t off){
|
| */
|
| static int ts_write(int fd, const void *aBuf, size_t nBuf){
|
| if( tsIsFailErrno("write") ){
|
| + if( tsErrno("write")==EINTR ) orig_write(fd, aBuf, nBuf/2);
|
| return -1;
|
| }
|
| return orig_write(fd, aBuf, nBuf);
|
| @@ -376,6 +390,31 @@ static int ts_fallocate(int fd, off_t off, off_t len){
|
| return orig_fallocate(fd, off, len);
|
| }
|
|
|
| +static void *ts_mmap(
|
| + void *pAddr,
|
| + size_t nByte,
|
| + int prot,
|
| + int flags,
|
| + int fd,
|
| + off_t iOff
|
| +){
|
| + if( tsIsFailErrno("mmap") ){
|
| + return MAP_FAILED;
|
| + }
|
| + return orig_mmap(pAddr, nByte, prot, flags, fd, iOff);
|
| +}
|
| +
|
| +static void *ts_mremap(void *a, size_t b, size_t c, int d, ...){
|
| + va_list ap;
|
| + void *pArg;
|
| + if( tsIsFailErrno("mremap") ){
|
| + return MAP_FAILED;
|
| + }
|
| + va_start(ap, d);
|
| + pArg = va_arg(ap, void *);
|
| + return orig_mremap(a, b, c, d, pArg);
|
| +}
|
| +
|
| static int test_syscall_install(
|
| void * clientData,
|
| Tcl_Interp *interp,
|
| @@ -466,7 +505,7 @@ static int test_syscall_reset(
|
| }
|
| }
|
| if( rc!=SQLITE_OK ){
|
| - Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3TestErrorName(rc), -1));
|
| + Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
|
| return TCL_ERROR;
|
| }
|
|
|
| @@ -618,6 +657,45 @@ static int test_syscall_defaultvfs(
|
| return TCL_OK;
|
| }
|
|
|
| +static int ts_getpagesize(void){
|
| + return gSyscall.pgsz;
|
| +}
|
| +
|
| +static int test_syscall_pagesize(
|
| + void * clientData,
|
| + Tcl_Interp *interp,
|
| + int objc,
|
| + Tcl_Obj *CONST objv[]
|
| +){
|
| + sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
|
| + int pgsz;
|
| + if( objc!=3 ){
|
| + Tcl_WrongNumArgs(interp, 2, objv, "PGSZ");
|
| + return TCL_ERROR;
|
| + }
|
| + if( Tcl_GetIntFromObj(interp, objv[2], &pgsz) ){
|
| + return TCL_ERROR;
|
| + }
|
| +
|
| + if( pgsz<0 ){
|
| + if( gSyscall.orig_getpagesize ){
|
| + pVfs->xSetSystemCall(pVfs, "getpagesize", gSyscall.orig_getpagesize);
|
| + }
|
| + }else{
|
| + if( pgsz<512 || (pgsz & (pgsz-1)) ){
|
| + Tcl_AppendResult(interp, "pgsz out of range", 0);
|
| + return TCL_ERROR;
|
| + }
|
| + gSyscall.orig_getpagesize = pVfs->xGetSystemCall(pVfs, "getpagesize");
|
| + gSyscall.pgsz = pgsz;
|
| + pVfs->xSetSystemCall(
|
| + pVfs, "getpagesize", (sqlite3_syscall_ptr)ts_getpagesize
|
| + );
|
| + }
|
| +
|
| + return TCL_OK;
|
| +}
|
| +
|
| static int test_syscall(
|
| void * clientData,
|
| Tcl_Interp *interp,
|
| @@ -636,6 +714,7 @@ static int test_syscall(
|
| { "exists", test_syscall_exists },
|
| { "list", test_syscall_list },
|
| { "defaultvfs", test_syscall_defaultvfs },
|
| + { "pagesize", test_syscall_pagesize },
|
| { 0, 0 }
|
| };
|
| int iCmd;
|
| @@ -671,4 +750,3 @@ int SqlitetestSyscall_Init(Tcl_Interp *interp){
|
| return TCL_OK;
|
| }
|
| #endif
|
| -
|
|
|