aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan <dan@noemail.net>2018-12-24 15:22:47 +0000
committerdan <dan@noemail.net>2018-12-24 15:22:47 +0000
commit94e95ea46e89f34adeba606db60f4691a25d7c1f (patch)
tree70a34cb71ca9008af0cc2a8edeb7d0b2cf35e9b3 /src
parent29e9af88484b2266189d694faa3eb3e69f0a7190 (diff)
downloadsqlite-94e95ea46e89f34adeba606db60f4691a25d7c1f.tar.gz
sqlite-94e95ea46e89f34adeba606db60f4691a25d7c1f.zip
Copy some extra test infrastructure from the mutexfree-shmlock branch to trunk.
FossilOrigin-Name: 883337ffdb434b6856ceaada121c0be67e2fdec7b447675f45e85568ef28d7d9
Diffstat (limited to 'src')
-rw-r--r--src/test_vfs.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/test_vfs.c b/src/test_vfs.c
index 10d403294..efcda4813 100644
--- a/src/test_vfs.c
+++ b/src/test_vfs.c
@@ -1564,8 +1564,62 @@ static int SQLITE_TCLAPI testvfs_cmd(
return TCL_ERROR;
}
+extern int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb);
+extern const char *sqlite3ErrName(int);
+
+/*
+** tclcmd: vfs_shmlock DB DBNAME (shared|exclusive) (lock|unlock) OFFSET N
+*/
+static int SQLITE_TCLAPI test_vfs_shmlock(
+ void * clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ const char *azArg1[] = {"shared", "exclusive", 0};
+ const char *azArg2[] = {"lock", "unlock", 0};
+ sqlite3 *db = 0;
+ int rc = SQLITE_OK;
+ const char *zDbname = 0;
+ int iArg1 = 0;
+ int iArg2 = 0;
+ int iOffset = 0;
+ int n = 0;
+ sqlite3_file *pFd;
+
+ if( objc!=7 ){
+ Tcl_WrongNumArgs(interp, 1, objv,
+ "DB DBNAME (shared|exclusive) (lock|unlock) OFFSET N"
+ );
+ return TCL_ERROR;
+ }
+
+ zDbname = Tcl_GetString(objv[2]);
+ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db)
+ || Tcl_GetIndexFromObj(interp, objv[3], azArg1, "ARG", 0, &iArg1)
+ || Tcl_GetIndexFromObj(interp, objv[4], azArg2, "ARG", 0, &iArg2)
+ || Tcl_GetIntFromObj(interp, objv[5], &iOffset)
+ || Tcl_GetIntFromObj(interp, objv[6], &n)
+ ){
+ return TCL_ERROR;
+ }
+
+ sqlite3_file_control(db, zDbname, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd);
+ if( pFd==0 ){
+ return TCL_ERROR;
+ }
+ rc = pFd->pMethods->xShmLock(pFd, iOffset, n,
+ (iArg1==0 ? SQLITE_SHM_SHARED : SQLITE_SHM_EXCLUSIVE)
+ | (iArg2==0 ? SQLITE_SHM_LOCK : SQLITE_SHM_UNLOCK)
+ );
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
+ return TCL_OK;
+}
+
+
int Sqlitetestvfs_Init(Tcl_Interp *interp){
Tcl_CreateObjCommand(interp, "testvfs", testvfs_cmd, 0, 0);
+ Tcl_CreateObjCommand(interp, "vfs_shmlock", test_vfs_shmlock, 0, 0);
return TCL_OK;
}