/ Hex Artifact Content
Login

Artifact 378edf0a2b142b4f7640ee982df06d50b98788ea:


0000: 2f 2a 0a 2a 2a 20 32 30 31 32 2d 30 31 2d 33 30  /*.** 2012-01-30
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 4d 75 74 65 78 20 66 75 6e 63  **.** Mutex func
0180: 74 69 6f 6e 73 20 66 6f 72 20 4c 53 4d 2e 0a 2a  tions for LSM..*
0190: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 73 6d 49  /.#include "lsmI
01a0: 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  nt.h"../*.** All
01b0: 6f 63 61 74 65 20 61 20 6e 65 77 20 6d 75 74 65  ocate a new mute
01c0: 78 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 4d 75 74  x..*/.int lsmMut
01d0: 65 78 4e 65 77 28 6c 73 6d 5f 65 6e 76 20 2a 70  exNew(lsm_env *p
01e0: 45 6e 76 2c 20 6c 73 6d 5f 6d 75 74 65 78 20 2a  Env, lsm_mutex *
01f0: 2a 70 70 4e 65 77 29 7b 0a 20 20 72 65 74 75 72  *ppNew){.  retur
0200: 6e 20 70 45 6e 76 2d 3e 78 4d 75 74 65 78 4e 65  n pEnv->xMutexNe
0210: 77 28 70 45 6e 76 2c 20 70 70 4e 65 77 29 3b 0a  w(pEnv, ppNew);.
0220: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0230: 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 6f 6e 65  a handle for one
0240: 20 6f 66 20 74 68 65 20 73 74 61 74 69 63 20 6d   of the static m
0250: 75 74 65 78 65 73 2e 0a 2a 2f 0a 69 6e 74 20 6c  utexes..*/.int l
0260: 73 6d 4d 75 74 65 78 53 74 61 74 69 63 28 6c 73  smMutexStatic(ls
0270: 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 69 6e 74  m_env *pEnv, int
0280: 20 69 4d 75 74 65 78 2c 20 6c 73 6d 5f 6d 75 74   iMutex, lsm_mut
0290: 65 78 20 2a 2a 70 70 53 74 61 74 69 63 29 7b 0a  ex **ppStatic){.
02a0: 20 20 72 65 74 75 72 6e 20 70 45 6e 76 2d 3e 78    return pEnv->x
02b0: 4d 75 74 65 78 53 74 61 74 69 63 28 70 45 6e 76  MutexStatic(pEnv
02c0: 2c 20 69 4d 75 74 65 78 2c 20 70 70 53 74 61 74  , iMutex, ppStat
02d0: 69 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ic);.}../*.** Fr
02e0: 65 65 20 61 20 6d 75 74 65 78 20 61 6c 6c 6f 63  ee a mutex alloc
02f0: 61 74 65 64 20 62 79 20 6c 73 6d 4d 75 74 65 78  ated by lsmMutex
0300: 4e 65 77 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 6c  New()..*/.void l
0310: 73 6d 4d 75 74 65 78 44 65 6c 28 6c 73 6d 5f 65  smMutexDel(lsm_e
0320: 6e 76 20 2a 70 45 6e 76 2c 20 6c 73 6d 5f 6d 75  nv *pEnv, lsm_mu
0330: 74 65 78 20 2a 70 4d 75 74 65 78 29 7b 0a 20 20  tex *pMutex){.  
0340: 69 66 28 20 70 4d 75 74 65 78 20 29 20 70 45 6e  if( pMutex ) pEn
0350: 76 2d 3e 78 4d 75 74 65 78 44 65 6c 28 70 4d 75  v->xMutexDel(pMu
0360: 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  tex);.}../*.** E
0370: 6e 74 65 72 20 61 20 6d 75 74 65 78 2e 0a 2a 2f  nter a mutex..*/
0380: 0a 76 6f 69 64 20 6c 73 6d 4d 75 74 65 78 45 6e  .void lsmMutexEn
0390: 74 65 72 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e  ter(lsm_env *pEn
03a0: 76 2c 20 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 4d  v, lsm_mutex *pM
03b0: 75 74 65 78 29 7b 0a 20 20 70 45 6e 76 2d 3e 78  utex){.  pEnv->x
03c0: 4d 75 74 65 78 45 6e 74 65 72 28 70 4d 75 74 65  MutexEnter(pMute
03d0: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  x);.}../*.** Att
03e0: 65 6d 70 74 20 74 6f 20 65 6e 74 65 72 20 61 20  empt to enter a 
03f0: 6d 75 74 65 78 2c 20 62 75 74 20 64 6f 20 6e 6f  mutex, but do no
0400: 74 20 62 6c 6f 63 6b 2e 20 49 66 20 73 75 63 63  t block. If succ
0410: 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 7a  essful, return z
0420: 65 72 6f 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ero..** Otherwis
0430: 65 2c 20 69 66 20 74 68 65 20 6d 75 74 65 78 20  e, if the mutex 
0440: 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
0450: 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 68  by some other th
0460: 72 65 61 64 20 61 6e 64 20 69 73 20 6e 6f 74 0a  read and is not.
0470: 2a 2a 20 65 6e 74 65 72 65 64 2c 20 72 65 74 75  ** entered, retu
0480: 72 6e 20 6e 6f 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a  rn non zero..**.
0490: 2a 2a 20 45 61 63 68 20 73 75 63 63 65 73 73 66  ** Each successf
04a0: 75 6c 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  ul call to this 
04b0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
04c0: 20 6d 61 74 63 68 65 64 20 62 79 20 61 20 63 61   matched by a ca
04d0: 6c 6c 20 74 6f 0a 2a 2a 20 6c 73 6d 4d 75 74 65  ll to.** lsmMute
04e0: 78 4c 65 61 76 65 28 29 2e 0a 2a 2f 0a 69 6e 74  xLeave()..*/.int
04f0: 20 6c 73 6d 4d 75 74 65 78 54 72 79 28 6c 73 6d   lsmMutexTry(lsm
0500: 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 6c 73 6d 5f  _env *pEnv, lsm_
0510: 6d 75 74 65 78 20 2a 70 4d 75 74 65 78 29 7b 0a  mutex *pMutex){.
0520: 20 20 72 65 74 75 72 6e 20 70 45 6e 76 2d 3e 78    return pEnv->x
0530: 4d 75 74 65 78 54 72 79 28 70 4d 75 74 65 78 29  MutexTry(pMutex)
0540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 65 61 76 65  ;.}../*.** Leave
0550: 20 61 20 6d 75 74 65 78 2e 0a 2a 2f 0a 76 6f 69   a mutex..*/.voi
0560: 64 20 6c 73 6d 4d 75 74 65 78 4c 65 61 76 65 28  d lsmMutexLeave(
0570: 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 6c  lsm_env *pEnv, l
0580: 73 6d 5f 6d 75 74 65 78 20 2a 70 4d 75 74 65 78  sm_mutex *pMutex
0590: 29 7b 0a 20 20 70 45 6e 76 2d 3e 78 4d 75 74 65  ){.  pEnv->xMute
05a0: 78 4c 65 61 76 65 28 70 4d 75 74 65 78 29 3b 0a  xLeave(pMutex);.
05b0: 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
05c0: 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  G./*.** Return n
05d0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6d  on-zero if the m
05e0: 75 74 65 78 20 70 61 73 73 65 64 20 61 73 20 74  utex passed as t
05f0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
0600: 6e 74 20 69 73 20 68 65 6c 64 0a 2a 2a 20 62 79  nt is held.** by
0610: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 74 68 72   the calling thr
0620: 65 61 64 2c 20 6f 72 20 7a 65 72 6f 20 6f 74 68  ead, or zero oth
0630: 65 72 77 69 73 65 2e 20 49 66 20 74 68 65 20 69  erwise. If the i
0640: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
0650: 20 6e 6f 74 20 0a 2a 2a 20 61 62 6c 65 20 74 6f   not .** able to
0660: 20 74 65 6c 6c 20 69 66 20 74 68 65 20 6d 75 74   tell if the mut
0670: 65 78 20 69 73 20 68 65 6c 64 20 62 79 20 74 68  ex is held by th
0680: 65 20 63 61 6c 6c 65 72 2c 20 69 74 20 73 68 6f  e caller, it sho
0690: 75 6c 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  uld return.** no
06a0: 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
06b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
06c0: 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
06d0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
06e0: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
06f0: 6c 73 6d 4d 75 74 65 78 48 65 6c 64 28 6c 73 6d  lsmMutexHeld(lsm
0700: 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 6c 73 6d 5f  _env *pEnv, lsm_
0710: 6d 75 74 65 78 20 2a 70 4d 75 74 65 78 29 7b 0a  mutex *pMutex){.
0720: 20 20 72 65 74 75 72 6e 20 70 45 6e 76 2d 3e 78    return pEnv->x
0730: 4d 75 74 65 78 48 65 6c 64 20 3f 20 70 45 6e 76  MutexHeld ? pEnv
0740: 2d 3e 78 4d 75 74 65 78 48 65 6c 64 28 70 4d 75  ->xMutexHeld(pMu
0750: 74 65 78 29 20 3a 20 31 3b 0a 7d 0a 0a 2f 2a 0a  tex) : 1;.}../*.
0760: 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
0770: 72 6f 20 69 66 20 74 68 65 20 6d 75 74 65 78 20  ro if the mutex 
0780: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
0790: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
07a0: 20 6e 6f 74 20 0a 2a 2a 20 68 65 6c 64 20 62 79   not .** held by
07b0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 74 68 72   the calling thr
07c0: 65 61 64 2c 20 6f 72 20 7a 65 72 6f 20 6f 74 68  ead, or zero oth
07d0: 65 72 77 69 73 65 2e 20 49 66 20 74 68 65 20 69  erwise. If the i
07e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 0a 2a  mplementation .*
07f0: 2a 20 69 73 20 6e 6f 74 20 61 62 6c 65 20 74 6f  * is not able to
0800: 20 74 65 6c 6c 20 69 66 20 74 68 65 20 6d 75 74   tell if the mut
0810: 65 78 20 69 73 20 68 65 6c 64 20 62 79 20 74 68  ex is held by th
0820: 65 20 63 61 6c 6c 65 72 2c 20 69 74 20 73 68 6f  e caller, it sho
0830: 75 6c 64 20 0a 2a 2a 20 72 65 74 75 72 6e 20 6e  uld .** return n
0840: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
0850: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
0860: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
0870: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
0880: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
0890: 20 6c 73 6d 4d 75 74 65 78 4e 6f 74 48 65 6c 64   lsmMutexNotHeld
08a0: 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20  (lsm_env *pEnv, 
08b0: 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 4d 75 74 65  lsm_mutex *pMute
08c0: 78 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 45 6e  x){.  return pEn
08d0: 76 2d 3e 78 4d 75 74 65 78 4e 6f 74 48 65 6c 64  v->xMutexNotHeld
08e0: 20 3f 20 70 45 6e 76 2d 3e 78 4d 75 74 65 78 4e   ? pEnv->xMutexN
08f0: 6f 74 48 65 6c 64 28 70 4d 75 74 65 78 29 20 3a  otHeld(pMutex) :
0900: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a            1;.}.#endif.