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

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.28 2002/08/06 04:56:19 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 (__os_is_winnt()) {
  32. ULONG64 off = (ULONG64)db_iop->pagesize * db_iop->pgno;
  33. OVERLAPPED over;
  34. DWORD nbytes;
  35. over.Offset = (DWORD)(off & 0xffffffff);
  36. over.OffsetHigh = (DWORD)(off >> 32);
  37. over.hEvent = 0; /* we don't want asynchronous notifications */
  38. switch (op) {
  39. case DB_IO_READ:
  40. if (DB_GLOBAL(j_read) != NULL)
  41. goto slow;
  42. if (!ReadFile(db_iop->fhp->handle,
  43.     db_iop->buf, (DWORD)db_iop->bytes, &nbytes, &over))
  44. goto slow;
  45. break;
  46. case DB_IO_WRITE:
  47. if (DB_GLOBAL(j_write) != NULL)
  48. goto slow;
  49. if (!WriteFile(db_iop->fhp->handle,
  50.     db_iop->buf, (DWORD)db_iop->bytes, &nbytes, &over))
  51. goto slow;
  52. break;
  53. }
  54. if (nbytes == db_iop->bytes) {
  55. *niop = (size_t)nbytes;
  56. return (0);
  57. }
  58. }
  59. slow: MUTEX_THREAD_LOCK(dbenv, db_iop->mutexp);
  60. if ((ret = __os_seek(dbenv, db_iop->fhp,
  61.     db_iop->pagesize, db_iop->pgno, 0, 0, DB_OS_SEEK_SET)) != 0)
  62. goto err;
  63. switch (op) {
  64. case DB_IO_READ:
  65. ret = __os_read(dbenv,
  66.     db_iop->fhp, db_iop->buf, db_iop->bytes, niop);
  67. break;
  68. case DB_IO_WRITE:
  69. ret = __os_write(dbenv,
  70.     db_iop->fhp, db_iop->buf, db_iop->bytes, niop);
  71. break;
  72. }
  73. err: MUTEX_THREAD_UNLOCK(dbenv, db_iop->mutexp);
  74. return (ret);
  75. }
  76. /*
  77.  * __os_read --
  78.  * Read from a file handle.
  79.  *
  80.  * PUBLIC: int __os_read __P((DB_ENV *, DB_FH *, void *, size_t, size_t *));
  81.  */
  82. int
  83. __os_read(dbenv, fhp, addr, len, nrp)
  84. DB_ENV *dbenv;
  85. DB_FH *fhp;
  86. void *addr;
  87. size_t len;
  88. size_t *nrp;
  89. {
  90. size_t offset;
  91. DWORD nr;
  92. int ret;
  93. BOOL success;
  94. u_int8_t *taddr;
  95. for (taddr = addr,
  96.     offset = 0; offset < len; taddr += nr, offset += nr) {
  97. retry: if (DB_GLOBAL(j_read) != NULL) {
  98. nr = (DWORD)DB_GLOBAL(j_read)(fhp->fd,
  99.     taddr, len - offset);
  100. success = (nr >= 0);
  101. } else {
  102. success = ReadFile(fhp->handle,
  103.     taddr, (DWORD)(len - offset), &nr, NULL);
  104. if (!success)
  105. __os_set_errno(__os_win32_errno());
  106. }
  107. if (!success) {
  108. if ((ret = __os_get_errno()) == EINTR)
  109. goto retry;
  110. __db_err(dbenv, "read: 0x%lx, %lu: %s",
  111.     P_TO_ULONG(taddr),
  112.     (u_long)len - offset, strerror(ret));
  113. return (ret);
  114. }
  115. if (nr == 0)
  116. break;
  117. }
  118. *nrp = taddr - (u_int8_t *)addr;
  119. return (0);
  120. }
  121. /*
  122.  * __os_write --
  123.  * Write to a file handle.
  124.  *
  125.  * PUBLIC: int __os_write __P((DB_ENV *, DB_FH *, void *, size_t, size_t *));
  126.  */
  127. int
  128. __os_write(dbenv, fhp, addr, len, nwp)
  129. DB_ENV *dbenv;
  130. DB_FH *fhp;
  131. void *addr;
  132. size_t len;
  133. size_t *nwp;
  134. {
  135. size_t offset;
  136. DWORD nw;
  137. int ret;
  138. BOOL success;
  139. u_int8_t *taddr;
  140. for (taddr = addr,
  141.     offset = 0; offset < len; taddr += nw, offset += nw) {
  142. retry: if (DB_GLOBAL(j_write) != NULL) {
  143. nw = (DWORD)DB_GLOBAL(j_write)(fhp->fd,
  144.     taddr, len - offset);
  145. success = (nw >= 0);
  146. } else {
  147. success = WriteFile(fhp->handle,
  148.     taddr, (DWORD)(len - offset), &nw, NULL);
  149. if (!success)
  150. __os_set_errno(__os_win32_errno());
  151. }
  152. if (!success) {
  153. if ((ret = __os_get_errno()) == EINTR)
  154. goto retry;
  155. __db_err(dbenv, "write: 0x%x, %lu: %s", taddr,
  156.     (u_long)len-offset, strerror(ret));
  157. return (ret);
  158. }
  159. }
  160. *nwp = len;
  161. return (0);
  162. }