util_cache.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 2000-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: util_cache.c,v 1.3 2002/04/04 18:50:10 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <unistd.h>
  16. #endif
  17. #include "db_int.h"
  18. /*
  19.  * __db_util_cache --
  20.  * Compute if we have enough cache.
  21.  *
  22.  * PUBLIC: int __db_util_cache __P((DB_ENV *, DB *, u_int32_t *, int *));
  23.  */
  24. int
  25. __db_util_cache(dbenv, dbp, cachep, resizep)
  26. DB_ENV *dbenv;
  27. DB *dbp;
  28. u_int32_t *cachep;
  29. int *resizep;
  30. {
  31. DBTYPE type;
  32. DB_BTREE_STAT *bsp;
  33. DB_HASH_STAT *hsp;
  34. DB_QUEUE_STAT *qsp;
  35. u_int32_t pgsize;
  36. int ret;
  37. void *sp;
  38. /*
  39.  * The current cache size is in cachep.  If it's insufficient, set the
  40.  * the memory referenced by resizep to 1 and set cachep to the minimum
  41.  * size needed.
  42.  */
  43. if ((ret = dbp->get_type(dbp, &type)) != 0) {
  44. dbenv->err(dbenv, ret, "DB->get_type");
  45. return (ret);
  46. }
  47. if ((ret = dbp->stat(dbp, &sp, DB_FAST_STAT)) != 0) {
  48. dbenv->err(dbenv, ret, "DB->stat");
  49. return (ret);
  50. }
  51. switch (type) {
  52. case DB_QUEUE:
  53. qsp = (DB_QUEUE_STAT *)sp;
  54. pgsize = qsp->qs_pagesize;
  55. break;
  56. case DB_HASH:
  57. hsp = (DB_HASH_STAT *)sp;
  58. pgsize = hsp->hash_pagesize;
  59. break;
  60. case DB_BTREE:
  61. case DB_RECNO:
  62. bsp = (DB_BTREE_STAT *)sp;
  63. pgsize = bsp->bt_pagesize;
  64. break;
  65. default:
  66. dbenv->err(dbenv, ret, "unknown database type: %d", type);
  67. return (EINVAL);
  68. }
  69. free(sp);
  70. /*
  71.  * Make sure our current cache is big enough.  We want at least
  72.  * DB_MINPAGECACHE pages in the cache.
  73.  */
  74. if ((*cachep / pgsize) < DB_MINPAGECACHE) {
  75. *resizep = 1;
  76. *cachep = pgsize * DB_MINPAGECACHE;
  77. } else
  78. *resizep = 0;
  79. return (0);
  80. }