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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 2001-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: db_idspace.c,v 1.5 2002/02/01 18:15:29 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <stdlib.h>
  14. #endif
  15. #include "db_int.h"
  16. static int __db_idcmp __P((const void *, const void *));
  17. static int
  18. __db_idcmp(a, b)
  19. const void *a;
  20. const void *b;
  21. {
  22. u_int32_t i, j;
  23. i = *(u_int32_t *)a;
  24. j = *(u_int32_t *)b;
  25. if (i < j)
  26. return (-1);
  27. else if (i > j)
  28. return (1);
  29. else
  30. return (0);
  31. }
  32. /*
  33.  * __db_idspace --
  34.  *
  35.  * On input, minp and maxp contain the minimum and maximum valid values for
  36.  * the name space and on return, they contain the minimum and maximum ids
  37.  * available (by finding the biggest gap).
  38.  *
  39.  * PUBLIC: void __db_idspace __P((u_int32_t *, int, u_int32_t *, u_int32_t *));
  40.  */
  41. void
  42. __db_idspace(inuse, n, minp, maxp)
  43. u_int32_t *inuse;
  44. int n;
  45. u_int32_t *minp, *maxp;
  46. {
  47. int i, low;
  48. u_int32_t gap, t;
  49. /* A single locker ID is a special case. */
  50. if (n == 1) {
  51. /*
  52.  * If the single item in use is the last one in the range,
  53.  * then we've got to perform wrap which means that we set
  54.  * the min to the minimum ID, which is what we came in with,
  55.  * so we don't do anything.
  56.  */
  57. if (inuse[0] != *maxp)
  58. *minp = inuse[0];
  59. *maxp = inuse[0] - 1;
  60. return;
  61. }
  62. gap = 0;
  63. low = 0;
  64. qsort(inuse, n, sizeof(u_int32_t), __db_idcmp);
  65. for (i = 0; i < n - 1; i++)
  66. if ((t = (inuse[i + 1] - inuse[i])) > gap) {
  67. gap = t;
  68. low = i;
  69. }
  70. /* Check for largest gap at the end of the space. */
  71. if ((*maxp - inuse[n - 1]) + (inuse[0] - *minp) > gap) {
  72. /* Do same check as we do in the n == 1 case. */
  73. if (inuse[n - 1] != *maxp)
  74. *minp = inuse[n - 1];
  75. *maxp = inuse[0];
  76. } else {
  77. *minp = inuse[low];
  78. *maxp = inuse[low + 1];
  79. }
  80. }