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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996, 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: mp_fset.c,v 11.13 2000/11/30 00:58:41 ubell Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #endif
  14. #ifdef  HAVE_RPC
  15. #include "db_server.h"
  16. #endif
  17. #include "db_int.h"
  18. #include "db_shash.h"
  19. #include "mp.h"
  20. #ifdef HAVE_RPC
  21. #include "gen_client_ext.h"
  22. #include "rpc_client_ext.h"
  23. #endif
  24. /*
  25.  * memp_fset --
  26.  * Mpool page set-flag routine.
  27.  */
  28. int
  29. memp_fset(dbmfp, pgaddr, flags)
  30. DB_MPOOLFILE *dbmfp;
  31. void *pgaddr;
  32. u_int32_t flags;
  33. {
  34. BH *bhp;
  35. DB_ENV *dbenv;
  36. DB_MPOOL *dbmp;
  37. MPOOL *c_mp, *mp;
  38. int ret;
  39. dbmp = dbmfp->dbmp;
  40. dbenv = dbmp->dbenv;
  41. mp = dbmp->reginfo[0].primary;
  42. #ifdef HAVE_RPC
  43. if (F_ISSET(dbenv, DB_ENV_RPCCLIENT))
  44. return (__dbcl_memp_fset(dbmfp, pgaddr, flags));
  45. #endif
  46. PANIC_CHECK(dbenv);
  47. /* Validate arguments. */
  48. if (flags == 0)
  49. return (__db_ferr(dbenv, "memp_fset", 1));
  50. if ((ret = __db_fchk(dbenv, "memp_fset", flags,
  51.     DB_MPOOL_DIRTY | DB_MPOOL_CLEAN | DB_MPOOL_DISCARD)) != 0)
  52. return (ret);
  53. if ((ret = __db_fcchk(dbenv, "memp_fset",
  54.     flags, DB_MPOOL_CLEAN, DB_MPOOL_DIRTY)) != 0)
  55. return (ret);
  56. if (LF_ISSET(DB_MPOOL_DIRTY) && F_ISSET(dbmfp, MP_READONLY)) {
  57. __db_err(dbenv, "%s: dirty flag set for readonly file page",
  58.     __memp_fn(dbmfp));
  59. return (EACCES);
  60. }
  61. /* Convert the page address to a buffer header. */
  62. bhp = (BH *)((u_int8_t *)pgaddr - SSZA(BH, buf));
  63. /* Convert the buffer header to a cache. */
  64. c_mp = BH_TO_CACHE(dbmp, bhp);
  65. R_LOCK(dbenv, dbmp->reginfo);
  66. if (LF_ISSET(DB_MPOOL_CLEAN) && F_ISSET(bhp, BH_DIRTY)) {
  67. ++c_mp->stat.st_page_clean;
  68. --c_mp->stat.st_page_dirty;
  69. F_CLR(bhp, BH_DIRTY);
  70. }
  71. if (LF_ISSET(DB_MPOOL_DIRTY) && !F_ISSET(bhp, BH_DIRTY)) {
  72. --c_mp->stat.st_page_clean;
  73. ++c_mp->stat.st_page_dirty;
  74. F_SET(bhp, BH_DIRTY);
  75. }
  76. if (LF_ISSET(DB_MPOOL_DISCARD))
  77. F_SET(bhp, BH_DISCARD);
  78. R_UNLOCK(dbenv, dbmp->reginfo);
  79. return (0);
  80. }