/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 6a62583e374ba3ac1a3fcc0da2bfdac7d3942689:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73  /*.** 2007 Augus
0010: 74 20 32 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 28.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
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 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ***.** This file
0180: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 20   contains the C 
0190: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69  functions that i
01a0: 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 65 78 65 73  mplement mutexes
01b0: 20 66 6f 72 20 4f 53 2f 32 0a 2a 2f 0a 23 69 6e   for OS/2.*/.#in
01c0: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
01d0: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  .h"../*.** The c
01e0: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
01f0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
0200: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4f 53   SQLITE_MUTEX_OS
0210: 32 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  2 is defined..**
0220: 20 53 65 65 20 74 68 65 20 6d 75 74 65 78 2e 68   See the mutex.h
0230: 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c   file for detail
0240: 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
0250: 49 54 45 5f 4d 55 54 45 58 5f 4f 53 32 0a 0a 2f  ITE_MUTEX_OS2../
0260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0270: 2a 2a 2a 2a 2a 2a 20 4f 53 2f 32 20 4d 75 74 65  ****** OS/2 Mute
0280: 78 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  x Implementation
0290: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
02a0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
02b0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
02c0: 6e 20 6f 66 20 6d 75 74 65 78 65 73 20 69 73 20  n of mutexes is 
02d0: 62 75 69 6c 74 20 75 73 69 6e 67 20 74 68 65 20  built using the 
02e0: 4f 53 2f 32 20 41 50 49 2e 0a 2a 2f 0a 0a 2f 2a  OS/2 API..*/../*
02f0: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 62  .** The mutex ob
0300: 6a 65 63 74 0a 2a 2a 20 45 61 63 68 20 72 65 63  ject.** Each rec
0310: 75 72 73 69 76 65 20 6d 75 74 65 78 20 69 73 20  ursive mutex is 
0320: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0330: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0340: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
0350: 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  t sqlite3_mutex 
0360: 7b 0a 20 20 48 4d 54 58 20 6d 75 74 65 78 3b 20  {.  HMTX mutex; 
0370: 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63        /* Mutex c
0380: 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 65 20 6c  ontrolling the l
0390: 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 20 69 64  ock */.  int  id
03a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75  ;          /* Mu
03b0: 74 65 78 20 74 79 70 65 20 2a 2f 0a 20 20 69 6e  tex type */.  in
03c0: 74 20 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  t  nRef;        
03d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
03e0: 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 54 49 44  erences */.  TID
03f0: 20 20 6f 77 6e 65 72 3b 20 20 20 20 20 20 20 2f    owner;       /
0400: 2a 20 54 68 72 65 61 64 20 68 6f 6c 64 69 6e 67  * Thread holding
0410: 20 74 68 69 73 20 6d 75 74 65 78 20 2a 2f 0a 7d   this mutex */.}
0420: 3b 0a 0a 23 64 65 66 69 6e 65 20 4f 53 32 5f 4d  ;..#define OS2_M
0430: 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52  UTEX_INITIALIZER
0440: 20 20 20 30 2c 30 2c 30 2c 30 0a 0a 2f 2a 0a 2a     0,0,0,0../*.*
0450: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
0460: 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
0470: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
0480: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
0490: 20 6f 73 32 4d 75 74 65 78 49 6e 69 74 28 76 6f   os2MutexInit(vo
04a0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
04b0: 54 45 5f 4f 4b 3b 20 7d 0a 73 74 61 74 69 63 20  TE_OK; }.static 
04c0: 69 6e 74 20 6f 73 32 4d 75 74 65 78 45 6e 64 28  int os2MutexEnd(
04d0: 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51  void){ return SQ
04e0: 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 0a 2a  LITE_OK; }../*.*
04f0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75  * The sqlite3_mu
0500: 74 65 78 5f 61 6c 6c 6f 63 28 29 20 72 6f 75 74  tex_alloc() rout
0510: 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
0520: 6e 65 77 0a 2a 2a 20 6d 75 74 65 78 20 61 6e 64  new.** mutex and
0530: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
0540: 65 72 20 74 6f 20 69 74 2e 20 20 49 66 20 69 74  er to it.  If it
0550: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 0a 2a 2a   returns NULL.**
0560: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
0570: 20 61 20 6d 75 74 65 78 20 63 6f 75 6c 64 20 6e   a mutex could n
0580: 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 2e  ot be allocated.
0590: 20 0a 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c 6c   .** SQLite will
05a0: 20 75 6e 77 69 6e 64 20 69 74 73 20 73 74 61 63   unwind its stac
05b0: 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  k and return an 
05c0: 65 72 72 6f 72 2e 20 20 54 68 65 20 61 72 67 75  error.  The argu
05d0: 6d 65 6e 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ment.** to sqlit
05e0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29  e3_mutex_alloc()
05f0: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
0600: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
0610: 74 73 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a  ts:.**.** <ul>.*
0620: 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d  * <li>  SQLITE_M
0630: 55 54 45 58 5f 46 41 53 54 20 20 20 20 20 20 20  UTEX_FAST       
0640: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 3c 6c 69          0.** <li
0650: 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  >  SQLITE_MUTEX_
0660: 52 45 43 55 52 53 49 56 45 20 20 20 20 20 20 20  RECURSIVE       
0670: 20 20 20 31 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51     1.** <li>  SQ
0680: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
0690: 43 5f 4d 41 53 54 45 52 20 20 20 20 20 20 32 0a  C_MASTER      2.
06a0: 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f  ** <li>  SQLITE_
06b0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
06c0: 20 20 20 20 20 20 20 20 20 33 0a 2a 2a 20 3c 6c           3.** <l
06d0: 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  i>  SQLITE_MUTEX
06e0: 5f 53 54 41 54 49 43 5f 50 52 4e 47 20 20 20 20  _STATIC_PRNG    
06f0: 20 20 20 20 34 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a      4.** </ul>.*
0700: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0710: 77 6f 20 63 6f 6e 73 74 61 6e 74 73 20 63 61 75  wo constants cau
0720: 73 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  se sqlite3_mutex
0730: 5f 61 6c 6c 6f 63 28 29 20 74 6f 20 63 72 65 61  _alloc() to crea
0740: 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6d 75 74 65  te.** a new mute
0750: 78 2e 20 20 54 68 65 20 6e 65 77 20 6d 75 74 65  x.  The new mute
0760: 78 20 69 73 20 72 65 63 75 72 73 69 76 65 20 77  x is recursive w
0770: 68 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  hen SQLITE_MUTEX
0780: 5f 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 69 73  _RECURSIVE.** is
0790: 20 75 73 65 64 20 62 75 74 20 6e 6f 74 20 6e 65   used but not ne
07a0: 63 65 73 73 61 72 69 6c 79 20 73 6f 20 77 68 65  cessarily so whe
07b0: 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  n SQLITE_MUTEX_F
07c0: 41 53 54 20 69 73 20 75 73 65 64 2e 0a 2a 2a 20  AST is used..** 
07d0: 54 68 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  The mutex implem
07e0: 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
07f0: 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
0800: 20 64 69 73 74 69 6e 63 74 69 6f 6e 0a 2a 2a 20   distinction.** 
0810: 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 4d  between SQLITE_M
0820: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 61  UTEX_RECURSIVE a
0830: 6e 64 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  nd SQLITE_MUTEX_
0840: 46 41 53 54 20 69 66 20 69 74 20 64 6f 65 73 0a  FAST if it does.
0850: 2a 2a 20 6e 6f 74 20 77 61 6e 74 20 74 6f 2e 20  ** not want to. 
0860: 20 42 75 74 20 53 51 4c 69 74 65 20 77 69 6c 6c   But SQLite will
0870: 20 6f 6e 6c 79 20 72 65 71 75 65 73 74 20 61 20   only request a 
0880: 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 20  recursive mutex 
0890: 69 6e 0a 2a 2a 20 63 61 73 65 73 20 77 68 65 72  in.** cases wher
08a0: 65 20 69 74 20 72 65 61 6c 6c 79 20 6e 65 65 64  e it really need
08b0: 73 20 6f 6e 65 2e 20 20 49 66 20 61 20 66 61 73  s one.  If a fas
08c0: 74 65 72 20 6e 6f 6e 2d 72 65 63 75 72 73 69 76  ter non-recursiv
08d0: 65 20 6d 75 74 65 78 0a 2a 2a 20 69 6d 70 6c 65  e mutex.** imple
08e0: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 76 61  mentation is ava
08f0: 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 68 6f  ilable on the ho
0900: 73 74 20 70 6c 61 74 66 6f 72 6d 2c 20 74 68 65  st platform, the
0910: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
0920: 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
0930: 20 73 75 63 68 20 61 20 6d 75 74 65 78 20 69 6e   such a mutex in
0940: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 53 51 4c   response to SQL
0950: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 2e 0a  ITE_MUTEX_FAST..
0960: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 74 68 65 72 20  **.** The other 
0970: 61 6c 6c 6f 77 65 64 20 70 61 72 61 6d 65 74 65  allowed paramete
0980: 72 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d 75  rs to sqlite3_mu
0990: 74 65 78 5f 61 6c 6c 6f 63 28 29 20 65 61 63 68  tex_alloc() each
09a0: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
09b0: 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 69 63  nter to a static
09c0: 20 70 72 65 65 78 69 73 74 69 6e 67 20 6d 75 74   preexisting mut
09d0: 65 78 2e 20 20 54 68 72 65 65 20 73 74 61 74 69  ex.  Three stati
09e0: 63 20 6d 75 74 65 78 65 73 20 61 72 65 0a 2a 2a  c mutexes are.**
09f0: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 75 72   used by the cur
0a00: 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  rent version of 
0a10: 53 51 4c 69 74 65 2e 20 20 46 75 74 75 72 65 20  SQLite.  Future 
0a20: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
0a30: 74 65 0a 2a 2a 20 6d 61 79 20 61 64 64 20 61 64  te.** may add ad
0a40: 64 69 74 69 6f 6e 61 6c 20 73 74 61 74 69 63 20  ditional static 
0a50: 6d 75 74 65 78 65 73 2e 20 20 53 74 61 74 69 63  mutexes.  Static
0a60: 20 6d 75 74 65 78 65 73 20 61 72 65 20 66 6f 72   mutexes are for
0a70: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
0a80: 20 62 79 20 53 51 4c 69 74 65 20 6f 6e 6c 79 2e   by SQLite only.
0a90: 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 74    Applications t
0aa0: 68 61 74 20 75 73 65 20 53 51 4c 69 74 65 20 6d  hat use SQLite m
0ab0: 75 74 65 78 65 73 20 73 68 6f 75 6c 64 0a 2a 2a  utexes should.**
0ac0: 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 64 79   use only the dy
0ad0: 6e 61 6d 69 63 20 6d 75 74 65 78 65 73 20 72 65  namic mutexes re
0ae0: 74 75 72 6e 65 64 20 62 79 20 53 51 4c 49 54 45  turned by SQLITE
0af0: 5f 4d 55 54 45 58 5f 46 41 53 54 20 6f 72 0a 2a  _MUTEX_FAST or.*
0b00: 2a 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  * SQLITE_MUTEX_R
0b10: 45 43 55 52 53 49 56 45 2e 0a 2a 2a 0a 2a 2a 20  ECURSIVE..**.** 
0b20: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 6f 6e 65  Note that if one
0b30: 20 6f 66 20 74 68 65 20 64 79 6e 61 6d 69 63 20   of the dynamic 
0b40: 6d 75 74 65 78 20 70 61 72 61 6d 65 74 65 72 73  mutex parameters
0b50: 20 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46   (SQLITE_MUTEX_F
0b60: 41 53 54 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  AST.** or SQLITE
0b70: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
0b80: 29 20 69 73 20 75 73 65 64 20 74 68 65 6e 20 73  ) is used then s
0b90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
0ba0: 6f 63 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  oc().** returns 
0bb0: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 75 74 65  a different mute
0bc0: 78 20 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 2e  x on every call.
0bd0: 20 20 42 75 74 20 66 6f 72 20 74 68 65 20 73 74    But for the st
0be0: 61 74 69 63 0a 2a 2a 20 6d 75 74 65 78 20 74 79  atic.** mutex ty
0bf0: 70 65 73 2c 20 74 68 65 20 73 61 6d 65 20 6d 75  pes, the same mu
0c00: 74 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 20  tex is returned 
0c10: 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 20 74 68  on every call th
0c20: 61 74 20 68 61 73 0a 2a 2a 20 74 68 65 20 73 61  at has.** the sa
0c30: 6d 65 20 74 79 70 65 20 6e 75 6d 62 65 72 2e 0a  me type number..
0c40: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
0c50: 33 5f 6d 75 74 65 78 20 2a 6f 73 32 4d 75 74 65  3_mutex *os2Mute
0c60: 78 41 6c 6c 6f 63 28 69 6e 74 20 69 54 79 70 65  xAlloc(int iType
0c70: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
0c80: 65 78 20 2a 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ex *p = NULL;.  
0c90: 73 77 69 74 63 68 28 20 69 54 79 70 65 20 29 7b  switch( iType ){
0ca0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0cb0: 5f 4d 55 54 45 58 5f 46 41 53 54 3a 0a 20 20 20  _MUTEX_FAST:.   
0cc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 55 54   case SQLITE_MUT
0cd0: 45 58 5f 52 45 43 55 52 53 49 56 45 3a 20 7b 0a  EX_RECURSIVE: {.
0ce0: 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65        p = sqlite
0cf0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
0d00: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 20  eof(*p) );.     
0d10: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
0d20: 20 20 70 2d 3e 69 64 20 3d 20 69 54 79 70 65 3b    p->id = iType;
0d30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 44 6f 73  .        if( Dos
0d40: 43 72 65 61 74 65 4d 75 74 65 78 53 65 6d 28 20  CreateMutexSem( 
0d50: 30 2c 20 26 70 2d 3e 6d 75 74 65 78 2c 20 30 2c  0, &p->mutex, 0,
0d60: 20 46 41 4c 53 45 20 29 20 21 3d 20 4e 4f 5f 45   FALSE ) != NO_E
0d70: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20  RROR ){.        
0d80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 20    sqlite3_free( 
0d90: 70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  p );.          p
0da0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20   = NULL;.       
0db0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
0dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0dd0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
0de0: 20 20 20 73 74 61 74 69 63 20 76 6f 6c 61 74 69     static volati
0df0: 6c 65 20 69 6e 74 20 69 73 49 6e 69 74 20 3d 20  le int isInit = 
0e00: 30 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  0;.      static 
0e10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 73 74  sqlite3_mutex st
0e20: 61 74 69 63 4d 75 74 65 78 65 73 5b 5d 20 3d 20  aticMutexes[] = 
0e30: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 53 32 5f  {.        { OS2_
0e40: 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
0e50: 52 2c 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  R, },.        { 
0e60: 4f 53 32 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41  OS2_MUTEX_INITIA
0e70: 4c 49 5a 45 52 2c 20 7d 2c 0a 20 20 20 20 20 20  LIZER, },.      
0e80: 20 20 7b 20 4f 53 32 5f 4d 55 54 45 58 5f 49 4e    { OS2_MUTEX_IN
0e90: 49 54 49 41 4c 49 5a 45 52 2c 20 7d 2c 0a 20 20  ITIALIZER, },.  
0ea0: 20 20 20 20 20 20 7b 20 4f 53 32 5f 4d 55 54 45        { OS2_MUTE
0eb0: 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c 20 7d  X_INITIALIZER, }
0ec0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 53 32 5f  ,.        { OS2_
0ed0: 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
0ee0: 52 2c 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  R, },.        { 
0ef0: 4f 53 32 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41  OS2_MUTEX_INITIA
0f00: 4c 49 5a 45 52 2c 20 7d 2c 0a 20 20 20 20 20 20  LIZER, },.      
0f10: 7d 3b 0a 20 20 20 20 20 20 69 66 20 28 20 21 69  };.      if ( !i
0f20: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 20  sInit ){.       
0f30: 20 41 50 49 52 45 54 20 72 63 3b 0a 20 20 20 20   APIRET rc;.    
0f40: 20 20 20 20 50 54 49 42 20 70 74 69 62 3b 0a 20      PTIB ptib;. 
0f50: 20 20 20 20 20 20 20 50 50 49 42 20 70 70 69 62         PPIB ppib
0f60: 3b 0a 20 20 20 20 20 20 20 20 48 4d 54 58 20 6d  ;.        HMTX m
0f70: 75 74 65 78 3b 0a 20 20 20 20 20 20 20 20 63 68  utex;.        ch
0f80: 61 72 20 6e 61 6d 65 5b 33 32 5d 3b 0a 20 20 20  ar name[32];.   
0f90: 20 20 20 20 20 44 6f 73 47 65 74 49 6e 66 6f 42       DosGetInfoB
0fa0: 6c 6f 63 6b 73 28 20 26 70 74 69 62 2c 20 26 70  locks( &ptib, &p
0fb0: 70 69 62 20 29 3b 0a 20 20 20 20 20 20 20 20 73  pib );.        s
0fc0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
0fd0: 20 73 69 7a 65 6f 66 28 6e 61 6d 65 29 2c 20 6e   sizeof(name), n
0fe0: 61 6d 65 2c 20 22 5c 5c 53 45 4d 33 32 5c 5c 53  ame, "\\SEM32\\S
0ff0: 51 4c 49 54 45 25 30 34 78 22 2c 0a 20 20 20 20  QLITE%04x",.    
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 20 20 20 20 70 70 69 62 2d 3e 70 69 62 5f        ppib->pib_
1020: 75 6c 70 69 64 20 29 3b 0a 20 20 20 20 20 20 20  ulpid );.       
1030: 20 77 68 69 6c 65 28 20 21 69 73 49 6e 69 74 20   while( !isInit 
1040: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 75 74  ){.          mut
1050: 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
1060: 20 20 72 63 20 3d 20 44 6f 73 43 72 65 61 74 65    rc = DosCreate
1070: 4d 75 74 65 78 53 65 6d 28 20 6e 61 6d 65 2c 20  MutexSem( name, 
1080: 26 6d 75 74 65 78 2c 20 30 2c 20 46 41 4c 53 45  &mutex, 0, FALSE
1090: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
10a0: 20 72 63 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20   rc == NO_ERROR 
10b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
10c0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
10d0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
10e0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20  isInit ){.      
10f0: 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 20 3d          for( i =
1100: 20 30 3b 20 69 20 3c 20 73 69 7a 65 6f 66 28 73   0; i < sizeof(s
1110: 74 61 74 69 63 4d 75 74 65 78 65 73 29 2f 73 69  taticMutexes)/si
1120: 7a 65 6f 66 28 73 74 61 74 69 63 4d 75 74 65 78  zeof(staticMutex
1130: 65 73 5b 30 5d 29 3b 20 69 2b 2b 20 29 7b 0a 20  es[0]); i++ ){. 
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
1150: 6f 73 43 72 65 61 74 65 4d 75 74 65 78 53 65 6d  osCreateMutexSem
1160: 28 20 30 2c 20 26 73 74 61 74 69 63 4d 75 74 65  ( 0, &staticMute
1170: 78 65 73 5b 69 5d 2e 6d 75 74 65 78 2c 20 30 2c  xes[i].mutex, 0,
1180: 20 46 41 4c 53 45 20 29 3b 0a 20 20 20 20 20 20   FALSE );.      
1190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11a0: 20 20 20 20 20 20 20 20 69 73 49 6e 69 74 20 3d          isInit =
11b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
11c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 44 6f  }.            Do
11d0: 73 43 6c 6f 73 65 4d 75 74 65 78 53 65 6d 28 20  sCloseMutexSem( 
11e0: 6d 75 74 65 78 20 29 3b 0a 20 20 20 20 20 20 20  mutex );.       
11f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20     }else if( rc 
1200: 3d 3d 20 45 52 52 4f 52 5f 44 55 50 4c 49 43 41  == ERROR_DUPLICA
1210: 54 45 5f 4e 41 4d 45 20 29 7b 0a 20 20 20 20 20  TE_NAME ){.     
1220: 20 20 20 20 20 20 20 44 6f 73 53 6c 65 65 70 28         DosSleep(
1230: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   1 );.          
1240: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1250: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
1260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1270: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1280: 20 61 73 73 65 72 74 28 20 69 54 79 70 65 2d 32   assert( iType-2
1290: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 61   >= 0 );.      a
12a0: 73 73 65 72 74 28 20 69 54 79 70 65 2d 32 20 3c  ssert( iType-2 <
12b0: 20 73 69 7a 65 6f 66 28 73 74 61 74 69 63 4d 75   sizeof(staticMu
12c0: 74 65 78 65 73 29 2f 73 69 7a 65 6f 66 28 73 74  texes)/sizeof(st
12d0: 61 74 69 63 4d 75 74 65 78 65 73 5b 30 5d 29 20  aticMutexes[0]) 
12e0: 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 26 73 74  );.      p = &st
12f0: 61 74 69 63 4d 75 74 65 78 65 73 5b 69 54 79 70  aticMutexes[iTyp
1300: 65 2d 32 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 69  e-2];.      p->i
1310: 64 20 3d 20 69 54 79 70 65 3b 0a 20 20 20 20 20  d = iType;.     
1320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1330: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
1340: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1350: 74 69 6e 65 20 64 65 61 6c 6c 6f 63 61 74 65 73  tine deallocates
1360: 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c   a previously al
1370: 6c 6f 63 61 74 65 64 20 6d 75 74 65 78 2e 0a 2a  located mutex..*
1380: 2a 20 53 51 4c 69 74 65 20 69 73 20 63 61 72 65  * SQLite is care
1390: 66 75 6c 20 74 6f 20 64 65 61 6c 6c 6f 63 61 74  ful to deallocat
13a0: 65 20 65 76 65 72 79 20 6d 75 74 65 78 20 74 68  e every mutex th
13b0: 61 74 20 69 74 20 61 6c 6c 6f 63 61 74 65 73 2e  at it allocates.
13c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13d0: 6f 73 32 4d 75 74 65 78 46 72 65 65 28 73 71 6c  os2MutexFree(sql
13e0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a  ite3_mutex *p){.
13f0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1400: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1410: 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 61  ->nRef==0 );.  a
1420: 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53 51  ssert( p->id==SQ
1430: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 20  LITE_MUTEX_FAST 
1440: 7c 7c 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45  || p->id==SQLITE
1450: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
1460: 20 29 3b 0a 20 20 44 6f 73 43 6c 6f 73 65 4d 75   );.  DosCloseMu
1470: 74 65 78 53 65 6d 28 20 70 2d 3e 6d 75 74 65 78  texSem( p->mutex
1480: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
1490: 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 23 69 66 64  ee( p );.}..#ifd
14a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
14b0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  /*.** The sqlite
14c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 20 61  3_mutex_held() a
14d0: 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  nd sqlite3_mutex
14e0: 5f 6e 6f 74 68 65 6c 64 28 29 20 72 6f 75 74 69  _notheld() routi
14f0: 6e 65 20 61 72 65 0a 2a 2a 20 69 6e 74 65 6e 64  ne are.** intend
1500: 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64  ed for use insid
1510: 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
1520: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
1530: 20 69 6e 74 20 6f 73 32 4d 75 74 65 78 48 65 6c   int os2MutexHel
1540: 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  d(sqlite3_mutex 
1550: 2a 70 29 7b 0a 20 20 54 49 44 20 74 69 64 3b 0a  *p){.  TID tid;.
1560: 20 20 50 49 44 20 70 69 64 3b 0a 20 20 55 4c 4f    PID pid;.  ULO
1570: 4e 47 20 75 6c 43 6f 75 6e 74 3b 0a 20 20 50 54  NG ulCount;.  PT
1580: 49 42 20 70 74 69 62 3b 0a 20 20 69 66 28 20 70  IB ptib;.  if( p
1590: 21 3d 30 20 29 20 7b 0a 20 20 20 20 44 6f 73 51  !=0 ) {.    DosQ
15a0: 75 65 72 79 4d 75 74 65 78 53 65 6d 28 70 2d 3e  ueryMutexSem(p->
15b0: 6d 75 74 65 78 2c 20 26 70 69 64 2c 20 26 74 69  mutex, &pid, &ti
15c0: 64 2c 20 26 75 6c 43 6f 75 6e 74 29 3b 0a 20 20  d, &ulCount);.  
15d0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 44 6f 73  } else {.    Dos
15e0: 47 65 74 49 6e 66 6f 42 6c 6f 63 6b 73 28 26 70  GetInfoBlocks(&p
15f0: 74 69 62 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  tib, NULL);.    
1600: 74 69 64 20 3d 20 70 74 69 62 2d 3e 74 69 62 5f  tid = ptib->tib_
1610: 70 74 69 62 32 2d 3e 74 69 62 32 5f 75 6c 74 69  ptib2->tib2_ulti
1620: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
1630: 70 3d 3d 30 20 7c 7c 20 28 70 2d 3e 6e 52 65 66  p==0 || (p->nRef
1640: 21 3d 30 20 26 26 20 70 2d 3e 6f 77 6e 65 72 3d  !=0 && p->owner=
1650: 3d 74 69 64 29 3b 0a 7d 0a 73 74 61 74 69 63 20  =tid);.}.static 
1660: 69 6e 74 20 6f 73 32 4d 75 74 65 78 4e 6f 74 68  int os2MutexNoth
1670: 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  eld(sqlite3_mute
1680: 78 20 2a 70 29 7b 0a 20 20 54 49 44 20 74 69 64  x *p){.  TID tid
1690: 3b 0a 20 20 50 49 44 20 70 69 64 3b 0a 20 20 55  ;.  PID pid;.  U
16a0: 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 3b 0a 20 20  LONG ulCount;.  
16b0: 50 54 49 42 20 70 74 69 62 3b 0a 20 20 69 66 28  PTIB ptib;.  if(
16c0: 20 70 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 44   p!= 0 ) {.    D
16d0: 6f 73 51 75 65 72 79 4d 75 74 65 78 53 65 6d 28  osQueryMutexSem(
16e0: 70 2d 3e 6d 75 74 65 78 2c 20 26 70 69 64 2c 20  p->mutex, &pid, 
16f0: 26 74 69 64 2c 20 26 75 6c 43 6f 75 6e 74 29 3b  &tid, &ulCount);
1700: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
1710: 44 6f 73 47 65 74 49 6e 66 6f 42 6c 6f 63 6b 73  DosGetInfoBlocks
1720: 28 26 70 74 69 62 2c 20 4e 55 4c 4c 29 3b 0a 20  (&ptib, NULL);. 
1730: 20 20 20 74 69 64 20 3d 20 70 74 69 62 2d 3e 74     tid = ptib->t
1740: 69 62 5f 70 74 69 62 32 2d 3e 74 69 62 32 5f 75  ib_ptib2->tib2_u
1750: 6c 74 69 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ltid;.  }.  retu
1760: 72 6e 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 52  rn p==0 || p->nR
1770: 65 66 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 77 6e 65  ef==0 || p->owne
1780: 72 21 3d 74 69 64 3b 0a 7d 0a 23 65 6e 64 69 66  r!=tid;.}.#endif
1790: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ../*.** The sqli
17a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
17b0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75  ) and sqlite3_mu
17c0: 74 65 78 5f 74 72 79 28 29 20 72 6f 75 74 69 6e  tex_try() routin
17d0: 65 73 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  es attempt.** to
17e0: 20 65 6e 74 65 72 20 61 20 6d 75 74 65 78 2e 20   enter a mutex. 
17f0: 20 49 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65   If another thre
1800: 61 64 20 69 73 20 61 6c 72 65 61 64 79 20 77 69  ad is already wi
1810: 74 68 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 0a  thin the mutex,.
1820: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ** sqlite3_mutex
1830: 5f 65 6e 74 65 72 28 29 20 77 69 6c 6c 20 62 6c  _enter() will bl
1840: 6f 63 6b 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  ock and sqlite3_
1850: 6d 75 74 65 78 5f 74 72 79 28 29 20 77 69 6c 6c  mutex_try() will
1860: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
1870: 45 5f 42 55 53 59 2e 20 20 54 68 65 20 73 71 6c  E_BUSY.  The sql
1880: 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29  ite3_mutex_try()
1890: 20 69 6e 74 65 72 66 61 63 65 20 72 65 74 75 72   interface retur
18a0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  ns SQLITE_OK.** 
18b0: 75 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 20  upon successful 
18c0: 65 6e 74 72 79 2e 20 20 4d 75 74 65 78 65 73 20  entry.  Mutexes 
18d0: 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 53 51  created using SQ
18e0: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
18f0: 53 49 56 45 20 63 61 6e 0a 2a 2a 20 62 65 20 65  SIVE can.** be e
1900: 6e 74 65 72 65 64 20 6d 75 6c 74 69 70 6c 65 20  ntered multiple 
1910: 74 69 6d 65 73 20 62 79 20 74 68 65 20 73 61 6d  times by the sam
1920: 65 20 74 68 72 65 61 64 2e 20 20 49 6e 20 73 75  e thread.  In su
1930: 63 68 20 63 61 73 65 73 20 74 68 65 2c 0a 2a 2a  ch cases the,.**
1940: 20 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 65   mutex must be e
1950: 78 69 74 65 64 20 61 6e 20 65 71 75 61 6c 20 6e  xited an equal n
1960: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 62  umber of times b
1970: 65 66 6f 72 65 20 61 6e 6f 74 68 65 72 20 74 68  efore another th
1980: 72 65 61 64 0a 2a 2a 20 63 61 6e 20 65 6e 74 65  read.** can ente
1990: 72 2e 20 20 49 66 20 74 68 65 20 73 61 6d 65 20  r.  If the same 
19a0: 74 68 72 65 61 64 20 74 72 69 65 73 20 74 6f 20  thread tries to 
19b0: 65 6e 74 65 72 20 61 6e 79 20 6f 74 68 65 72 20  enter any other 
19c0: 6b 69 6e 64 20 6f 66 20 6d 75 74 65 78 0a 2a 2a  kind of mutex.**
19d0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2c   more than once,
19e0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 69 73   the behavior is
19f0: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
1a00: 74 61 74 69 63 20 76 6f 69 64 20 6f 73 32 4d 75  tatic void os2Mu
1a10: 74 65 78 45 6e 74 65 72 28 73 71 6c 69 74 65 33  texEnter(sqlite3
1a20: 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 54 49  _mutex *p){.  TI
1a30: 44 20 74 69 64 3b 0a 20 20 50 49 44 20 68 6f 6c  D tid;.  PID hol
1a40: 64 65 72 31 3b 0a 20 20 55 4c 4f 4e 47 20 68 6f  der1;.  ULONG ho
1a50: 6c 64 65 72 32 3b 0a 20 20 69 66 28 20 70 3d 3d  lder2;.  if( p==
1a60: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
1a70: 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53 51 4c  sert( p->id==SQL
1a80: 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
1a90: 49 56 45 20 7c 7c 20 6f 73 32 4d 75 74 65 78 4e  IVE || os2MutexN
1aa0: 6f 74 68 65 6c 64 28 70 29 20 29 3b 0a 20 20 44  otheld(p) );.  D
1ab0: 6f 73 52 65 71 75 65 73 74 4d 75 74 65 78 53 65  osRequestMutexSe
1ac0: 6d 28 70 2d 3e 6d 75 74 65 78 2c 20 53 45 4d 5f  m(p->mutex, SEM_
1ad0: 49 4e 44 45 46 49 4e 49 54 45 5f 57 41 49 54 29  INDEFINITE_WAIT)
1ae0: 3b 0a 20 20 44 6f 73 51 75 65 72 79 4d 75 74 65  ;.  DosQueryMute
1af0: 78 53 65 6d 28 70 2d 3e 6d 75 74 65 78 2c 20 26  xSem(p->mutex, &
1b00: 68 6f 6c 64 65 72 31 2c 20 26 74 69 64 2c 20 26  holder1, &tid, &
1b10: 68 6f 6c 64 65 72 32 29 3b 0a 20 20 70 2d 3e 6f  holder2);.  p->o
1b20: 77 6e 65 72 20 3d 20 74 69 64 3b 0a 20 20 70 2d  wner = tid;.  p-
1b30: 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 73 74 61 74 69  >nRef++;.}.stati
1b40: 63 20 69 6e 74 20 6f 73 32 4d 75 74 65 78 54 72  c int os2MutexTr
1b50: 79 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  y(sqlite3_mutex 
1b60: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1b70: 20 54 49 44 20 74 69 64 3b 0a 20 20 50 49 44 20   TID tid;.  PID 
1b80: 68 6f 6c 64 65 72 31 3b 0a 20 20 55 4c 4f 4e 47  holder1;.  ULONG
1b90: 20 68 6f 6c 64 65 72 32 3b 0a 20 20 69 66 28 20   holder2;.  if( 
1ba0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
1bb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1bc0: 74 28 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45  t( p->id==SQLITE
1bd0: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
1be0: 20 7c 7c 20 6f 73 32 4d 75 74 65 78 4e 6f 74 68   || os2MutexNoth
1bf0: 65 6c 64 28 70 29 20 29 3b 0a 20 20 69 66 28 20  eld(p) );.  if( 
1c00: 44 6f 73 52 65 71 75 65 73 74 4d 75 74 65 78 53  DosRequestMutexS
1c10: 65 6d 28 70 2d 3e 6d 75 74 65 78 2c 20 53 45 4d  em(p->mutex, SEM
1c20: 5f 49 4d 4d 45 44 49 41 54 45 5f 52 45 54 55 52  _IMMEDIATE_RETUR
1c30: 4e 29 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 29 20  N) == NO_ERROR) 
1c40: 7b 0a 20 20 20 20 44 6f 73 51 75 65 72 79 4d 75  {.    DosQueryMu
1c50: 74 65 78 53 65 6d 28 70 2d 3e 6d 75 74 65 78 2c  texSem(p->mutex,
1c60: 20 26 68 6f 6c 64 65 72 31 2c 20 26 74 69 64 2c   &holder1, &tid,
1c70: 20 26 68 6f 6c 64 65 72 32 29 3b 0a 20 20 20 20   &holder2);.    
1c80: 70 2d 3e 6f 77 6e 65 72 20 3d 20 74 69 64 3b 0a  p->owner = tid;.
1c90: 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20      p->nRef++;. 
1ca0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1cb0: 4b 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  K;.  } else {.  
1cc0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1cd0: 53 59 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  SY;.  }..  retur
1ce0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1cf0: 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  he sqlite3_mutex
1d00: 5f 6c 65 61 76 65 28 29 20 72 6f 75 74 69 6e 65  _leave() routine
1d10: 20 65 78 69 74 73 20 61 20 6d 75 74 65 78 20 74   exits a mutex t
1d20: 68 61 74 20 77 61 73 0a 2a 2a 20 70 72 65 76 69  hat was.** previ
1d30: 6f 75 73 6c 79 20 65 6e 74 65 72 65 64 20 62 79  ously entered by
1d40: 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64   the same thread
1d50: 2e 20 20 54 68 65 20 62 65 68 61 76 69 6f 72 0a  .  The behavior.
1d60: 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  ** is undefined 
1d70: 69 66 20 74 68 65 20 6d 75 74 65 78 20 69 73 20  if the mutex is 
1d80: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 65 6e  not currently en
1d90: 74 65 72 65 64 20 6f 72 0a 2a 2a 20 69 73 20 6e  tered or.** is n
1da0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c  ot currently all
1db0: 6f 63 61 74 65 64 2e 20 20 53 51 4c 69 74 65 20  ocated.  SQLite 
1dc0: 77 69 6c 6c 20 6e 65 76 65 72 20 64 6f 20 65 69  will never do ei
1dd0: 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
1de0: 76 6f 69 64 20 6f 73 32 4d 75 74 65 78 4c 65 61  void os2MutexLea
1df0: 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ve(sqlite3_mutex
1e00: 20 2a 70 29 7b 0a 20 20 54 49 44 20 74 69 64 3b   *p){.  TID tid;
1e10: 0a 20 20 50 49 44 20 68 6f 6c 64 65 72 31 3b 0a  .  PID holder1;.
1e20: 20 20 55 4c 4f 4e 47 20 68 6f 6c 64 65 72 32 3b    ULONG holder2;
1e30: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1e40: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
1e50: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 44  p->nRef>0 );.  D
1e60: 6f 73 51 75 65 72 79 4d 75 74 65 78 53 65 6d 28  osQueryMutexSem(
1e70: 70 2d 3e 6d 75 74 65 78 2c 20 26 68 6f 6c 64 65  p->mutex, &holde
1e80: 72 31 2c 20 26 74 69 64 2c 20 26 68 6f 6c 64 65  r1, &tid, &holde
1e90: 72 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r2);.  assert( p
1ea0: 2d 3e 6f 77 6e 65 72 3d 3d 74 69 64 20 29 3b 0a  ->owner==tid );.
1eb0: 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 61    p->nRef--;.  a
1ec0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d  ssert( p->nRef==
1ed0: 30 20 7c 7c 20 70 2d 3e 69 64 3d 3d 53 51 4c 49  0 || p->id==SQLI
1ee0: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1ef0: 56 45 20 29 3b 0a 20 20 44 6f 73 52 65 6c 65 61  VE );.  DosRelea
1f00: 73 65 4d 75 74 65 78 53 65 6d 28 70 2d 3e 6d 75  seMutexSem(p->mu
1f10: 74 65 78 29 3b 0a 7d 0a 0a 73 71 6c 69 74 65 33  tex);.}..sqlite3
1f20: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 20 63  _mutex_methods c
1f30: 6f 6e 73 74 20 2a 73 71 6c 69 74 65 33 44 65 66  onst *sqlite3Def
1f40: 61 75 6c 74 4d 75 74 65 78 28 76 6f 69 64 29 7b  aultMutex(void){
1f50: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1f60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
1f70: 74 68 6f 64 73 20 73 4d 75 74 65 78 20 3d 20 7b  thods sMutex = {
1f80: 0a 20 20 20 20 6f 73 32 4d 75 74 65 78 49 6e 69  .    os2MutexIni
1f90: 74 2c 0a 20 20 20 20 6f 73 32 4d 75 74 65 78 45  t,.    os2MutexE
1fa0: 6e 64 2c 0a 20 20 20 20 6f 73 32 4d 75 74 65 78  nd,.    os2Mutex
1fb0: 41 6c 6c 6f 63 2c 0a 20 20 20 20 6f 73 32 4d 75  Alloc,.    os2Mu
1fc0: 74 65 78 46 72 65 65 2c 0a 20 20 20 20 6f 73 32  texFree,.    os2
1fd0: 4d 75 74 65 78 45 6e 74 65 72 2c 0a 20 20 20 20  MutexEnter,.    
1fe0: 6f 73 32 4d 75 74 65 78 54 72 79 2c 0a 20 20 20  os2MutexTry,.   
1ff0: 20 6f 73 32 4d 75 74 65 78 4c 65 61 76 65 2c 0a   os2MutexLeave,.
2000: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2010: 42 55 47 0a 20 20 20 20 6f 73 32 4d 75 74 65 78  BUG.    os2Mutex
2020: 48 65 6c 64 2c 0a 20 20 20 20 6f 73 32 4d 75 74  Held,.    os2Mut
2030: 65 78 4e 6f 74 68 65 6c 64 0a 23 65 6e 64 69 66  exNotheld.#endif
2040: 0a 20 20 7d 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  };..  return 
2050: 26 73 4d 75 74 65 78 3b 0a 7d 0a 23 65 6e 64 69  &sMutex;.}.#endi
2060: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 55 54 45  f /* SQLITE_MUTE
2070: 58 5f 4f 53 32 20 2a 2f 0a                       X_OS2 */.