亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? os_unix.c

?? sqlite 3.3.8 支持加密的版本
?? C
?? 第 1 頁 / 共 5 頁
字號:
# define SQLITE_THREAD_OVERRIDE_LOCK -1
#endif
#ifdef SQLITE_TEST
int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK;
#else
static int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK;
#endif

/*
** This structure holds information passed into individual test
** threads by the testThreadLockingBehavior() routine.
*/
struct threadTestData {
  int fd;                /* File to be locked */
  struct flock lock;     /* The locking operation */
  int result;            /* Result of the locking operation */
};

#ifdef SQLITE_LOCK_TRACE
/*
** Print out information about all locking operations.
**
** This routine is used for troubleshooting locks on multithreaded
** platforms.  Enable by compiling with the -DSQLITE_LOCK_TRACE
** command-line option on the compiler.  This code is normally
** turned off.
*/
static int lockTrace(int fd, int op, struct flock *p){
  char *zOpName, *zType;
  int s;
  int savedErrno;
  if( op==F_GETLK ){
    zOpName = "GETLK";
  }else if( op==F_SETLK ){
    zOpName = "SETLK";
  }else{
    s = fcntl(fd, op, p);
    sqlite3DebugPrintf("fcntl unknown %d %d %d\n", fd, op, s);
    return s;
  }
  if( p->l_type==F_RDLCK ){
    zType = "RDLCK";
  }else if( p->l_type==F_WRLCK ){
    zType = "WRLCK";
  }else if( p->l_type==F_UNLCK ){
    zType = "UNLCK";
  }else{
    assert( 0 );
  }
  assert( p->l_whence==SEEK_SET );
  s = fcntl(fd, op, p);
  savedErrno = errno;
  sqlite3DebugPrintf("fcntl %d %d %s %s %d %d %d %d\n",
     threadid, fd, zOpName, zType, (int)p->l_start, (int)p->l_len,
     (int)p->l_pid, s);
  if( s && op==F_SETLK && (p->l_type==F_RDLCK || p->l_type==F_WRLCK) ){
    struct flock l2;
    l2 = *p;
    fcntl(fd, F_GETLK, &l2);
    if( l2.l_type==F_RDLCK ){
      zType = "RDLCK";
    }else if( l2.l_type==F_WRLCK ){
      zType = "WRLCK";
    }else if( l2.l_type==F_UNLCK ){
      zType = "UNLCK";
    }else{
      assert( 0 );
    }
    sqlite3DebugPrintf("fcntl-failure-reason: %s %d %d %d\n",
       zType, (int)l2.l_start, (int)l2.l_len, (int)l2.l_pid);
  }
  errno = savedErrno;
  return s;
}
#define fcntl lockTrace
#endif /* SQLITE_LOCK_TRACE */

/*
** The testThreadLockingBehavior() routine launches two separate
** threads on this routine.  This routine attempts to lock a file
** descriptor then returns.  The success or failure of that attempt
** allows the testThreadLockingBehavior() procedure to determine
** whether or not threads can override each others locks.
*/
static void *threadLockingTest(void *pArg){
  struct threadTestData *pData = (struct threadTestData*)pArg;
  pData->result = fcntl(pData->fd, F_SETLK, &pData->lock);
  return pArg;
}

/*
** This procedure attempts to determine whether or not threads
** can override each others locks then sets the 
** threadsOverrideEachOthersLocks variable appropriately.
*/
static void testThreadLockingBehavior(int fd_orig){
  int fd;
  struct threadTestData d[2];
  pthread_t t[2];

  fd = dup(fd_orig);
  if( fd<0 ) return;
  memset(d, 0, sizeof(d));
  d[0].fd = fd;
  d[0].lock.l_type = F_RDLCK;
  d[0].lock.l_len = 1;
  d[0].lock.l_start = 0;
  d[0].lock.l_whence = SEEK_SET;
  d[1] = d[0];
  d[1].lock.l_type = F_WRLCK;
  pthread_create(&t[0], 0, threadLockingTest, &d[0]);
  pthread_create(&t[1], 0, threadLockingTest, &d[1]);
  pthread_join(t[0], 0);
  pthread_join(t[1], 0);
  close(fd);
  threadsOverrideEachOthersLocks =  d[0].result==0 && d[1].result==0;
}
#endif /* SQLITE_UNIX_THREADS */

/*
** Release a lockInfo structure previously allocated by findLockInfo().
*/
static void releaseLockInfo(struct lockInfo *pLock){
  assert( sqlite3OsInMutex(1) );
  if (pLock == NULL)
    return;
  pLock->nRef--;
  if( pLock->nRef==0 ){
    sqlite3HashInsert(&lockHash, &pLock->key, sizeof(pLock->key), 0);
    sqlite3ThreadSafeFree(pLock);
  }
}

/*
** Release a openCnt structure previously allocated by findLockInfo().
*/
static void releaseOpenCnt(struct openCnt *pOpen){
  assert( sqlite3OsInMutex(1) );
  if (pOpen == NULL)
    return;
  pOpen->nRef--;
  if( pOpen->nRef==0 ){
    sqlite3HashInsert(&openHash, &pOpen->key, sizeof(pOpen->key), 0);
    free(pOpen->aPending);
    sqlite3ThreadSafeFree(pOpen);
  }
}

#ifdef SQLITE_ENABLE_LOCKING_STYLE
/*
** Tests a byte-range locking query to see if byte range locks are 
** supported, if not we fall back to dotlockLockingStyle.
*/
static sqlite3LockingStyle sqlite3TestLockingStyle(const char *filePath, 
  int fd) {
  /* test byte-range lock using fcntl */
  struct flock lockInfo;
  
  lockInfo.l_len = 1;
  lockInfo.l_start = 0;
  lockInfo.l_whence = SEEK_SET;
  lockInfo.l_type = F_RDLCK;
  
  if (fcntl(fd, F_GETLK, (int) &lockInfo) != -1) {
    return posixLockingStyle;
  } 
  
  /* testing for flock can give false positives.  So if if the above test
  ** fails, then we fall back to using dot-lock style locking.
  */  
  return dotlockLockingStyle;
}

/* 
** Examines the f_fstypename entry in the statfs structure as returned by 
** stat() for the file system hosting the database file, assigns the 
** appropriate locking style based on it's value.  These values and 
** assignments are based on Darwin/OSX behavior and have not been tested on 
** other systems.
*/
static sqlite3LockingStyle sqlite3DetectLockingStyle(const char *filePath, 
  int fd) {

#ifdef SQLITE_FIXED_LOCKING_STYLE
  return (sqlite3LockingStyle)SQLITE_FIXED_LOCKING_STYLE;
#else
  struct statfs fsInfo;

  if (statfs(filePath, &fsInfo) == -1)
    return sqlite3TestLockingStyle(filePath, fd);
  
  if (fsInfo.f_flags & MNT_RDONLY)
    return noLockingStyle;
  
  if( (!strcmp(fsInfo.f_fstypename, "hfs")) ||
    (!strcmp(fsInfo.f_fstypename, "ufs")) )
		return posixLockingStyle;
  
  if(!strcmp(fsInfo.f_fstypename, "afpfs"))
    return afpLockingStyle;
  
  if(!strcmp(fsInfo.f_fstypename, "nfs")) 
    return sqlite3TestLockingStyle(filePath, fd);
  
  if(!strcmp(fsInfo.f_fstypename, "smbfs"))
    return flockLockingStyle;
  
  if(!strcmp(fsInfo.f_fstypename, "msdos"))
    return dotlockLockingStyle;
  
  if(!strcmp(fsInfo.f_fstypename, "webdav"))
    return unsupportedLockingStyle;
  
  return sqlite3TestLockingStyle(filePath, fd);  
#endif // SQLITE_FIXED_LOCKING_STYLE
}

#endif /* SQLITE_ENABLE_LOCKING_STYLE */

/*
** Given a file descriptor, locate lockInfo and openCnt structures that
** describes that file descriptor.  Create new ones if necessary.  The
** return values might be uninitialized if an error occurs.
**
** Return the number of errors.
*/
static int findLockInfo(
  int fd,                      /* The file descriptor used in the key */
  struct lockInfo **ppLock,    /* Return the lockInfo structure here */
  struct openCnt **ppOpen      /* Return the openCnt structure here */
){
  int rc;
  struct lockKey key1;
  struct openKey key2;
  struct stat statbuf;
  struct lockInfo *pLock;
  struct openCnt *pOpen;
  rc = fstat(fd, &statbuf);
  if( rc!=0 ) return 1;

  assert( sqlite3OsInMutex(1) );
  memset(&key1, 0, sizeof(key1));
  key1.dev = statbuf.st_dev;
  key1.ino = statbuf.st_ino;
#ifdef SQLITE_UNIX_THREADS
  if( threadsOverrideEachOthersLocks<0 ){
    testThreadLockingBehavior(fd);
  }
  key1.tid = threadsOverrideEachOthersLocks ? 0 : pthread_self();
#endif
  memset(&key2, 0, sizeof(key2));
  key2.dev = statbuf.st_dev;
  key2.ino = statbuf.st_ino;
  pLock = (struct lockInfo*)sqlite3HashFind(&lockHash, &key1, sizeof(key1));
  if( pLock==0 ){
    struct lockInfo *pOld;
    pLock = sqlite3ThreadSafeMalloc( sizeof(*pLock) );
    if( pLock==0 ){
      rc = 1;
      goto exit_findlockinfo;
    }
    pLock->key = key1;
    pLock->nRef = 1;
    pLock->cnt = 0;
    pLock->locktype = 0;
    pOld = sqlite3HashInsert(&lockHash, &pLock->key, sizeof(key1), pLock);
    if( pOld!=0 ){
      assert( pOld==pLock );
      sqlite3ThreadSafeFree(pLock);
      rc = 1;
      goto exit_findlockinfo;
    }
  }else{
    pLock->nRef++;
  }
  *ppLock = pLock;
  if( ppOpen!=0 ){
    pOpen = (struct openCnt*)sqlite3HashFind(&openHash, &key2, sizeof(key2));
    if( pOpen==0 ){
      struct openCnt *pOld;
      pOpen = sqlite3ThreadSafeMalloc( sizeof(*pOpen) );
      if( pOpen==0 ){
        releaseLockInfo(pLock);
        rc = 1;
        goto exit_findlockinfo;
      }
      pOpen->key = key2;
      pOpen->nRef = 1;
      pOpen->nLock = 0;
      pOpen->nPending = 0;
      pOpen->aPending = 0;
      pOld = sqlite3HashInsert(&openHash, &pOpen->key, sizeof(key2), pOpen);
      if( pOld!=0 ){
        assert( pOld==pOpen );
        sqlite3ThreadSafeFree(pOpen);
        releaseLockInfo(pLock);
        rc = 1;
        goto exit_findlockinfo;
      }
    }else{
      pOpen->nRef++;
    }
    *ppOpen = pOpen;
  }

exit_findlockinfo:
  return rc;
}

#ifdef SQLITE_DEBUG
/*
** Helper function for printing out trace information from debugging
** binaries. This returns the string represetation of the supplied
** integer lock-type.
*/
static const char *locktypeName(int locktype){
  switch( locktype ){
  case NO_LOCK: return "NONE";
  case SHARED_LOCK: return "SHARED";
  case RESERVED_LOCK: return "RESERVED";
  case PENDING_LOCK: return "PENDING";
  case EXCLUSIVE_LOCK: return "EXCLUSIVE";
  }
  return "ERROR";
}
#endif

/*
** If we are currently in a different thread than the thread that the
** unixFile argument belongs to, then transfer ownership of the unixFile
** over to the current thread.
**
** A unixFile is only owned by a thread on systems where one thread is
** unable to override locks created by a different thread.  RedHat9 is
** an example of such a system.
**
** Ownership transfer is only allowed if the unixFile is currently unlocked.
** If the unixFile is locked and an ownership is wrong, then return
** SQLITE_MISUSE.  SQLITE_OK is returned if everything works.
*/
#ifdef SQLITE_UNIX_THREADS
static int transferOwnership(unixFile *pFile){
  int rc;
  pthread_t hSelf;
  if( threadsOverrideEachOthersLocks ){
    /* Ownership transfers not needed on this system */
    return SQLITE_OK;
  }
  hSelf = pthread_self();
  if( pthread_equal(pFile->tid, hSelf) ){
    /* We are still in the same thread */
    TRACE1("No-transfer, same thread\n");
    return SQLITE_OK;
  }
  if( pFile->locktype!=NO_LOCK ){
    /* We cannot change ownership while we are holding a lock! */
    return SQLITE_MISUSE;
  }
  TRACE4("Transfer ownership of %d from %d to %d\n", pFile->h,pFile->tid,hSelf);
  pFile->tid = hSelf;
  if (pFile->pLock != NULL) {
    releaseLockInfo(pFile->pLock);
    rc = findLockInfo(pFile->h, &pFile->pLock, 0);
    TRACE5("LOCK    %d is now %s(%s,%d)\n", pFile->h,
           locktypeName(pFile->locktype),
           locktypeName(pFile->pLock->locktype), pFile->pLock->cnt);
    return rc;
  } else {
    return SQLITE_OK;
  }
}
#else
  /* On single-threaded builds, ownership transfer is a no-op */
# define transferOwnership(X) SQLITE_OK
#endif

/*
** Delete the named file
*/
int sqlite3UnixDelete(const char *zFilename){
  unlink(zFilename);
  return SQLITE_OK;
}

/*
** Return TRUE if the named file exists.
*/
int sqlite3UnixFileExists(const char *zFilename){
  return access(zFilename, 0)==0;
}

/* Forward declaration */
static int allocateUnixFile(
  int h,                    /* File descriptor of the open file */
  OsFile **pId,             /* Write the real file descriptor here */
  const char *zFilename,    /* Name of the file being opened */
  int delFlag               /* If true, make sure the file deletes on close */
);

/*
** Attempt to open a file for both reading and writing.  If that
** fails, try opening it read-only.  If the file does not exist,
** try to create it.
**

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品理论片| 欧美色手机在线观看| 国产日韩精品一区二区浪潮av | 91丨porny丨国产入口| 午夜不卡在线视频| 亚洲美女视频在线观看| 欧美肥胖老妇做爰| 不卡大黄网站免费看| 日韩国产一区二| 精品一区免费av| 一区二区三区四区高清精品免费观看| 亚洲一级二级三级| 成人免费毛片app| 91福利国产成人精品照片| av激情亚洲男人天堂| 欧美在线观看视频在线| 欧美在线你懂的| 欧美一卡二卡三卡| 亚洲国产岛国毛片在线| 中文字幕欧美三区| 国产精品成人一区二区艾草| 日韩欧美色综合网站| 国产精品欧美一级免费| 亚洲国产精品人人做人人爽| 视频一区国产视频| 本田岬高潮一区二区三区| 欧美日韩成人综合天天影院 | 欧美色综合天天久久综合精品| 4438成人网| 一级中文字幕一区二区| 国产福利视频一区二区三区| 欧美一区二区视频在线观看| 久久色视频免费观看| 日韩中文字幕亚洲一区二区va在线 | 夜夜嗨av一区二区三区网页| 国内精品久久久久影院薰衣草 | 97超碰欧美中文字幕| 国产精品美女久久久久久久久 | 91丨九色丨蝌蚪富婆spa| 91极品视觉盛宴| 欧美韩国日本一区| 日韩和的一区二区| 久久99精品久久久久婷婷| 在线亚洲一区二区| 精品国产不卡一区二区三区| 国产精品麻豆久久久| 极品少妇xxxx偷拍精品少妇| 欧美成人在线直播| 青青草成人在线观看| 精品黑人一区二区三区久久| 亚洲777理论| 97精品国产露脸对白| 亚洲一区二区欧美日韩 | 精品一区二区在线免费观看| 日韩亚洲欧美在线观看| 久久精工是国产品牌吗| 国产欧美日韩综合精品一区二区| 国产成人午夜片在线观看高清观看 | 香港成人在线视频| 欧美日韩www| 粉嫩高潮美女一区二区三区 | 精品国产91久久久久久久妲己| 91国在线观看| 亚洲一区二区三区四区中文字幕 | 亚洲国产成人午夜在线一区| 成人永久aaa| 中文字幕av一区二区三区高| 色欧美日韩亚洲| 99久久99久久精品免费看蜜桃| 亚洲成av人片一区二区| 久久伊人蜜桃av一区二区| 欧美怡红院视频| 成人精品gif动图一区| 日韩一区精品字幕| 亚洲视频小说图片| 欧美大片在线观看| 欧美色网站导航| 在线影院国内精品| 99视频精品在线| 国产成人亚洲综合a∨婷婷图片 | 久久精品一区二区| 欧美xxxx在线观看| 日本韩国欧美一区| 色综合久久久久久久久| 另类小说色综合网站| 亚洲成人av福利| 日本中文字幕一区二区有限公司| 亚洲欧美综合色| 亚洲欧美偷拍三级| 亚洲免费观看视频| 亚洲男人的天堂av| 亚洲国产一区在线观看| 午夜精品久久久久久久久久| 麻豆成人91精品二区三区| 国产成人综合视频| 色综合久久久久网| 国产91对白在线观看九色| 日韩高清中文字幕一区| 蜜桃久久精品一区二区| 99久久婷婷国产综合精品 | 成人小视频免费在线观看| 国产成人精品一区二| 91视频一区二区| 7777精品伊人久久久大香线蕉超级流畅 | 久久久久久久综合日本| 国产视频在线观看一区二区三区| 国产日韩欧美精品在线| 一区二区三区四区五区视频在线观看| 一区二区三区四区在线| 一区二区三区在线免费播放| 三级成人在线视频| 99精品久久99久久久久| 欧美欧美欧美欧美首页| 精品国产一区二区在线观看| 一区在线观看免费| 狠狠色狠狠色综合日日91app| 91亚洲午夜精品久久久久久| 日韩免费看的电影| 一级做a爱片久久| 成人动漫在线一区| 26uuu精品一区二区| 免费观看一级欧美片| 欧美性猛片aaaaaaa做受| 亚洲男女毛片无遮挡| 91麻豆文化传媒在线观看| 亚洲少妇30p| 在线视频国内自拍亚洲视频| 中文字幕第一区第二区| 99精品1区2区| 亚洲免费观看视频| 欧美日韩免费高清一区色橹橹| 伊人夜夜躁av伊人久久| 在线观看91精品国产入口| 亚洲风情在线资源站| 久久夜色精品国产噜噜av| 成人动漫精品一区二区| 一区二区三区中文字幕精品精品| 在线欧美小视频| 久久精品99国产精品| 国产欧美精品日韩区二区麻豆天美| 成人aa视频在线观看| 婷婷综合另类小说色区| 2021中文字幕一区亚洲| 99久久精品费精品国产一区二区| 樱花草国产18久久久久| 日韩美女一区二区三区四区| 国产成人精品免费网站| 一区二区三区在线免费播放| 久久伊99综合婷婷久久伊| 色综合久久综合网欧美综合网| 亚洲综合视频网| 久久嫩草精品久久久精品| 欧美色成人综合| 色综合久久99| 国产999精品久久久久久绿帽| 午夜欧美大尺度福利影院在线看| 中文字幕不卡在线| 精品日韩欧美一区二区| 欧美日韩国产影片| 日本精品一区二区三区四区的功能| 国精产品一区一区三区mba桃花 | 国产精品久久777777| 日韩精品一区二区三区视频在线观看| 99久久伊人精品| 91蜜桃网址入口| 日本道精品一区二区三区| 99re在线视频这里只有精品| 国产传媒欧美日韩成人| 国产精品资源在线观看| 麻豆成人久久精品二区三区红 | 欧美在线不卡一区| 欧美色倩网站大全免费| 欧美久久婷婷综合色| 欧美精品电影在线播放| 欧美日本韩国一区二区三区视频| 欧美高清激情brazzers| 日韩欧美一区在线观看| 一区二区三区在线视频播放| 亚洲欧美国产高清| 婷婷久久综合九色国产成人| 日韩av一级片| 国产激情一区二区三区四区| 成人aa视频在线观看| 欧美日韩mp4| 国产精品美女一区二区在线观看| 亚洲欧美日韩人成在线播放| 七七婷婷婷婷精品国产| 国产成人综合视频| 在线观看欧美精品| 日韩精品一区二区三区视频在线观看 | 日韩免费一区二区三区在线播放| 久久久久久久久久久电影| 中文字幕一区二区三区精华液 | 欧美日韩久久不卡| 欧美国产日韩亚洲一区| 无码av中文一区二区三区桃花岛| 精品亚洲成a人在线观看| 色婷婷综合久久久久中文 | 国产成人在线色| 欧美一二区视频|