Design
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. $Id: Design,v 11.2 1999/11/21 23:08:27 bostic Exp $
  2. There are three ways we do locking in the mpool code:
  3. Locking a handle mutex to provide concurrency for DB_THREAD operations.
  4. Locking the region mutex to provide mutual exclusion while reading and
  5.     writing structures in the shared region.
  6. Locking buffer header mutexes during I/O.
  7. The first will not be further described here.  We use the shared mpool
  8. region lock to provide mutual exclusion while reading/modifying all of
  9. the data structures, including the buffer headers.  We use a per-buffer
  10. header lock to wait on buffer I/O.  The order of locking is as follows:
  11. Searching for a buffer:
  12.     Acquire the region lock.
  13.     Find the buffer header.
  14.     Increment the reference count (guarantee the buffer stays).
  15.     While the BH_LOCKED flag is set (I/O is going on) {
  16. Release the region lock.
  17.     Explicitly yield the processor if it's not the first pass
  18.     through this loop, otherwise, we can simply spin because
  19.     we'll be simply switching between the two locks.
  20. Request the buffer lock.
  21. The I/O will complete...
  22. Acquire the buffer lock.
  23. Release the buffer lock.
  24. Acquire the region lock.
  25.     }
  26.     Return the buffer.
  27. Reading/writing a buffer:
  28.     Acquire the region lock.
  29.     Find/create the buffer header.
  30.     If reading, increment the reference count (guarantee the buffer stays).
  31.     Set the BH_LOCKED flag.
  32.     Acquire the buffer lock (guaranteed not to block).
  33.     Release the region lock.
  34.     Do the I/O and/or initialize the buffer contents.
  35.     Release the buffer lock.
  36. At this point, the buffer lock is available, but the logical
  37. operation (flagged by BH_LOCKED) is not yet completed.  For
  38. this reason, among others, threads checking the BH_LOCKED flag
  39. must loop around their test.
  40.     Acquire the region lock.
  41.     Clear the BH_LOCKED flag.
  42.     Release the region lock.
  43.     Return/discard the buffer.
  44. Pointers to DB_MPOOL, MPOOL, DB_MPOOLFILE and MPOOLFILE structures are
  45. not reacquired when a region lock is reacquired because they couldn't
  46. have been closed/discarded and because they never move in memory.