bt_page.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*-
  2. * Copyright (c) 1990, 1993, 1994
  3. * The Regents of the University of California. All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions
  7. * are met:
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in the
  12. * documentation and/or other materials provided with the distribution.
  13. * 3. All advertising materials mentioning features or use of this software
  14. * must display the following acknowledgement:
  15. * This product includes software developed by the University of
  16. * California, Berkeley and its contributors.
  17. * 4. Neither the name of the University nor the names of its contributors
  18. * may be used to endorse or promote products derived from this software
  19. * without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31. * SUCH DAMAGE.
  32. */
  33. #if defined(LIBC_SCCS) && !defined(lint)
  34. static char sccsid[] = "@(#)bt_page.c 8.3 (Berkeley) 7/14/94";
  35. #endif /* LIBC_SCCS and not lint */
  36. #include <sys/types.h>
  37. #include <stdio.h>
  38. #include "../include/db.h"
  39. #include "btree.h"
  40. /*
  41. * __bt_free --
  42. * Put a page on the freelist.
  43. *
  44. * Parameters:
  45. * t: tree
  46. * h: page to free
  47. *
  48. * Returns:
  49. * RET_ERROR, RET_SUCCESS
  50. *
  51. * Side-effect:
  52. * mpool_put's the page.
  53. */
  54. int
  55. __bt_free(t, h)
  56. BTREE *t;
  57. PAGE *h;
  58. {
  59. /* Insert the page at the head of the free list. */
  60. h->prevpg = P_INVALID;
  61. h->nextpg = t->bt_free;
  62. t->bt_free = h->pgno;
  63. F_SET(t, B_METADIRTY);
  64. /* Make sure the page gets written back. */
  65. return (mpool_put(t->bt_mp, h, MPOOL_DIRTY));
  66. }
  67. /*
  68. * __bt_new --
  69. * Get a new page, preferably from the freelist.
  70. *
  71. * Parameters:
  72. * t: tree
  73. * npg: storage for page number.
  74. *
  75. * Returns:
  76. * Pointer to a page, NULL on error.
  77. */
  78. PAGE *
  79. __bt_new(t, npg)
  80. BTREE *t;
  81. pgno_t *npg;
  82. {
  83. PAGE *h;
  84. if (t->bt_free != P_INVALID &&
  85. (h = mpool_get(t->bt_mp, t->bt_free, 0)) != NULL) {
  86. *npg = t->bt_free;
  87. t->bt_free = h->nextpg;
  88. F_SET(t, B_METADIRTY);
  89. return (h);
  90. }
  91. return (mpool_new(t->bt_mp, npg));
  92. }