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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 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: os_rw.c,v 11.15 2000/11/15 19:25:39 sue 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. #include "os_jump.h"
  18. /*
  19.  * __os_io --
  20.  * Do an I/O.
  21.  *
  22.  * PUBLIC: int __os_io __P((DB_ENV *, DB_IO *, int, size_t *));
  23.  */
  24. int
  25. __os_io(dbenv, db_iop, op, niop)
  26. DB_ENV *dbenv;
  27. DB_IO *db_iop;
  28. int op;
  29. size_t *niop;
  30. {
  31. int ret;
  32. #if defined(HAVE_PREAD) && defined(HAVE_PWRITE)
  33. switch (op) {
  34. case DB_IO_READ:
  35. if (__db_jump.j_read != NULL)
  36. goto slow;
  37. *niop = pread(db_iop->fhp->fd, db_iop->buf,
  38.     db_iop->bytes, (off_t)db_iop->pgno * db_iop->pagesize);
  39. break;
  40. case DB_IO_WRITE:
  41. if (__db_jump.j_write != NULL)
  42. goto slow;
  43. *niop = pwrite(db_iop->fhp->fd, db_iop->buf,
  44.     db_iop->bytes, (off_t)db_iop->pgno * db_iop->pagesize);
  45. break;
  46. }
  47. if (*niop == (size_t)db_iop->bytes)
  48. return (0);
  49. slow:
  50. #endif
  51. MUTEX_THREAD_LOCK(dbenv, db_iop->mutexp);
  52. if ((ret = __os_seek(dbenv, db_iop->fhp,
  53.     db_iop->pagesize, db_iop->pgno, 0, 0, DB_OS_SEEK_SET)) != 0)
  54. goto err;
  55. switch (op) {
  56. case DB_IO_READ:
  57. ret = __os_read(dbenv,
  58.     db_iop->fhp, db_iop->buf, db_iop->bytes, niop);
  59. break;
  60. case DB_IO_WRITE:
  61. ret = __os_write(dbenv,
  62.     db_iop->fhp, db_iop->buf, db_iop->bytes, niop);
  63. break;
  64. }
  65. err: MUTEX_THREAD_UNLOCK(dbenv, db_iop->mutexp);
  66. return (ret);
  67. }
  68. /*
  69.  * __os_read --
  70.  * Read from a file handle.
  71.  *
  72.  * PUBLIC: int __os_read __P((DB_ENV *, DB_FH *, void *, size_t, size_t *));
  73.  */
  74. int
  75. __os_read(dbenv, fhp, addr, len, nrp)
  76. DB_ENV *dbenv;
  77. DB_FH *fhp;
  78. void *addr;
  79. size_t len;
  80. size_t *nrp;
  81. {
  82. size_t offset;
  83. ssize_t nr;
  84. int ret;
  85. u_int8_t *taddr;
  86. for (taddr = addr,
  87.     offset = 0; offset < len; taddr += nr, offset += nr) {
  88. if ((nr = __db_jump.j_read != NULL ?
  89.     __db_jump.j_read(fhp->fd, taddr, len - offset) :
  90.     read(fhp->fd, taddr, len - offset)) < 0) {
  91. ret = __os_get_errno();
  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. if ((nw = __db_jump.j_write != NULL ?
  123.     __db_jump.j_write(fhp->fd, taddr, len - offset) :
  124.     write(fhp->fd, taddr, len - offset)) < 0) {
  125. ret = __os_get_errno();
  126. __db_err(dbenv, "write: 0x%x, %lu: %s", taddr,
  127.     (u_long)len-offset, strerror(ret));
  128. return (ret);
  129. }
  130. *nwp = len;
  131. return (0);
  132. }