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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: os_rw.c,v 11.24 2002/07/12 18:56:52 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <string.h>
  14. #include <unistd.h>
  15. #endif
  16. #include "db_int.h"
  17. /*
  18.  * __os_io --
  19.  * Do an I/O.
  20.  *
  21.  * PUBLIC: int __os_io __P((DB_ENV *, DB_IO *, int, size_t *));
  22.  */
  23. int
  24. __os_io(dbenv, db_iop, op, niop)
  25. DB_ENV *dbenv;
  26. DB_IO *db_iop;
  27. int op;
  28. size_t *niop;
  29. {
  30. int ret;
  31. #if defined(HAVE_PREAD) && defined(HAVE_PWRITE)
  32. switch (op) {
  33. case DB_IO_READ:
  34. if (DB_GLOBAL(j_read) != NULL)
  35. goto slow;
  36. *niop = pread(db_iop->fhp->fd, db_iop->buf,
  37.     db_iop->bytes, (off_t)db_iop->pgno * db_iop->pagesize);
  38. break;
  39. case DB_IO_WRITE:
  40. if (DB_GLOBAL(j_write) != NULL)
  41. goto slow;
  42. *niop = pwrite(db_iop->fhp->fd, db_iop->buf,
  43.     db_iop->bytes, (off_t)db_iop->pgno * db_iop->pagesize);
  44. break;
  45. }
  46. if (*niop == (size_t)db_iop->bytes)
  47. return (0);
  48. slow:
  49. #endif
  50. MUTEX_THREAD_LOCK(dbenv, db_iop->mutexp);
  51. if ((ret = __os_seek(dbenv, db_iop->fhp,
  52.     db_iop->pagesize, db_iop->pgno, 0, 0, DB_OS_SEEK_SET)) != 0)
  53. goto err;
  54. switch (op) {
  55. case DB_IO_READ:
  56. ret = __os_read(dbenv,
  57.     db_iop->fhp, db_iop->buf, db_iop->bytes, niop);
  58. break;
  59. case DB_IO_WRITE:
  60. ret = __os_write(dbenv,
  61.     db_iop->fhp, db_iop->buf, db_iop->bytes, niop);
  62. break;
  63. }
  64. err: MUTEX_THREAD_UNLOCK(dbenv, db_iop->mutexp);
  65. return (ret);
  66. }
  67. /*
  68.  * __os_read --
  69.  * Read from a file handle.
  70.  *
  71.  * PUBLIC: int __os_read __P((DB_ENV *, DB_FH *, void *, size_t, size_t *));
  72.  */
  73. int
  74. __os_read(dbenv, fhp, addr, len, nrp)
  75. DB_ENV *dbenv;
  76. DB_FH *fhp;
  77. void *addr;
  78. size_t len;
  79. size_t *nrp;
  80. {
  81. size_t offset;
  82. ssize_t nr;
  83. int ret;
  84. u_int8_t *taddr;
  85. for (taddr = addr,
  86.     offset = 0; offset < len; taddr += nr, offset += nr) {
  87. retry: if ((nr = DB_GLOBAL(j_read) != NULL ?
  88.     DB_GLOBAL(j_read)(fhp->fd, taddr, len - offset) :
  89.     read(fhp->fd, taddr, len - offset)) < 0) {
  90. if ((ret = __os_get_errno()) == EINTR)
  91. goto retry;
  92. __db_err(dbenv, "read: 0x%x, %lu: %s", taddr,
  93.     (u_long)len-offset, strerror(ret));
  94. return (ret);
  95. }
  96. if (nr == 0)
  97. break;
  98. }
  99. *nrp = taddr - (u_int8_t *)addr;
  100. return (0);
  101. }
  102. /*
  103.  * __os_write --
  104.  * Write to a file handle.
  105.  *
  106.  * PUBLIC: int __os_write __P((DB_ENV *, DB_FH *, void *, size_t, size_t *));
  107.  */
  108. int
  109. __os_write(dbenv, fhp, addr, len, nwp)
  110. DB_ENV *dbenv;
  111. DB_FH *fhp;
  112. void *addr;
  113. size_t len;
  114. size_t *nwp;
  115. {
  116. size_t offset;
  117. ssize_t nw;
  118. int ret;
  119. u_int8_t *taddr;
  120. for (taddr = addr,
  121.     offset = 0; offset < len; taddr += nw, offset += nw)
  122. retry: if ((nw = DB_GLOBAL(j_write) != NULL ?
  123.     DB_GLOBAL(j_write)(fhp->fd, taddr, len - offset) :
  124.     write(fhp->fd, taddr, len - offset)) < 0) {
  125. if ((ret = __os_get_errno()) == EINTR)
  126. goto retry;
  127. __db_err(dbenv, "write: 0x%x, %lu: %s", taddr,
  128.     (u_long)len-offset, strerror(ret));
  129. return (ret);
  130. }
  131. *nwp = len;
  132. return (0);
  133. }