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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: os_finit.c,v 11.8 2000/11/30 00:58:42 ubell Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <string.h>
  14. #endif
  15. #include "db_int.h"
  16. /*
  17.  * __os_finit --
  18.  * Initialize a regular file, optionally zero-filling it as well.
  19.  *
  20.  * PUBLIC: int __os_finit __P((DB_ENV *, DB_FH *, size_t, int));
  21.  */
  22. int
  23. __os_finit(dbenv, fhp, size, zerofill)
  24. DB_ENV *dbenv;
  25. DB_FH *fhp;
  26. size_t size;
  27. int zerofill;
  28. {
  29. db_pgno_t pages;
  30. size_t i;
  31. size_t nw;
  32. u_int32_t relative;
  33. int ret;
  34. char buf[OS_VMPAGESIZE];
  35. /* Write nuls to the new bytes. */
  36. memset(buf, 0, sizeof(buf));
  37. /*
  38.  * Extend the region by writing the last page.  If the region is >4Gb,
  39.  * increment may be larger than the maximum possible seek "relative"
  40.  * argument, as it's an unsigned 32-bit value.  Break the offset into
  41.  * pages of 1MB each so that we don't overflow (2^20 + 2^32 is bigger
  42.  * than any memory I expect to see for awhile).
  43.  */
  44. if ((ret = __os_seek(dbenv, fhp, 0, 0, 0, 0, DB_OS_SEEK_END)) != 0)
  45. return (ret);
  46. pages = (size - OS_VMPAGESIZE) / MEGABYTE;
  47. relative = (size - OS_VMPAGESIZE) % MEGABYTE;
  48. if ((ret = __os_seek(dbenv,
  49.     fhp, MEGABYTE, pages, relative, 0, DB_OS_SEEK_CUR)) != 0)
  50. return (ret);
  51. if ((ret = __os_write(dbenv, fhp, buf, sizeof(buf), &nw)) != 0)
  52. return (ret);
  53. if (nw != sizeof(buf))
  54. return (EIO);
  55. /*
  56.  * We may want to guarantee that there is enough disk space for the
  57.  * file, so we also write a byte to each page.  We write the byte
  58.  * because reading it is insufficient on systems smart enough not to
  59.  * instantiate disk pages to satisfy a read (e.g., Solaris).
  60.  */
  61. if (zerofill) {
  62. pages = size / MEGABYTE;
  63. relative = size % MEGABYTE;
  64. if ((ret = __os_seek(dbenv, fhp,
  65.     MEGABYTE, pages, relative, 1, DB_OS_SEEK_END)) != 0)
  66. return (ret);
  67. /* Write a byte to each page. */
  68. for (i = 0; i < size; i += OS_VMPAGESIZE) {
  69. if ((ret = __os_write(dbenv, fhp, buf, 1, &nw)) != 0)
  70. return (ret);
  71. if (nw != 1)
  72. return (EIO);
  73. if ((ret = __os_seek(dbenv, fhp,
  74.     0, 0, OS_VMPAGESIZE - 1, 0, DB_OS_SEEK_CUR)) != 0)
  75. return (ret);
  76. }
  77. }
  78. return (0);
  79. }
  80. /*
  81.  * __os_fpinit --
  82.  * Initialize a page in a regular file.
  83.  *
  84.  * PUBLIC: int __os_fpinit __P((DB_ENV *, DB_FH *, db_pgno_t, int, int));
  85.  */
  86. int
  87. __os_fpinit(dbenv, fhp, pgno, pagecount, pagesize)
  88. DB_ENV *dbenv;
  89. DB_FH *fhp;
  90. db_pgno_t pgno;
  91. int pagecount, pagesize;
  92. {
  93. COMPQUIET(dbenv, NULL);
  94. COMPQUIET(fhp, NULL);
  95. COMPQUIET(pgno, 0);
  96. COMPQUIET(pagecount, 0);
  97. COMPQUIET(pagesize, 0);
  98. return (0);
  99. }