test_ncbi_heapmgr.c
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbi_heapmgr.c,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 17:05:07  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbi_heapmgr.c,v 1000.0 2003/10/29 17:05:07 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Anton Lavrentiev
  35.  *
  36.  * File Description:
  37.  *   Simple random test of heap manager API. Not an interface example!
  38.  *
  39.  */
  40. #include "../ncbi_priv.h"
  41. #include <connect/ncbi_heapmgr.h>
  42. #include <stdlib.h>
  43. #include <time.h>
  44. #if 0
  45. #  define eLOG_Warning eLOG_Fatal
  46. #  define eLOG_Error   eLOG_Fatal
  47. #  include "../ncbi_heapmgr.c"
  48. #endif
  49. /* This header must go last */
  50. #include "test_assert.h"
  51. #ifdef __cplusplus
  52. extern "C" {
  53. #endif
  54. /*ARGSUSED*/
  55. static void* s_Expand(void* base, TNCBI_Size size, void* arg)
  56. {
  57.     if (base && size)
  58.         return realloc(base, size);
  59.     if (size)
  60.         return malloc(size);
  61.     if (base)
  62.         free(base);
  63.     return 0;
  64. }
  65. #ifdef __cplusplus
  66. } /* extern "C" */
  67. #endif
  68. int main(void)
  69. {
  70.     SHEAP_Block* blk;
  71.     int r, j, i;
  72.     HEAP heap;
  73.     char* c;
  74.     CORE_SetLOGFILE(stderr, 0/*false*/);
  75.     for (j = 1; j <= 3; j++) {
  76.         srand((int)time(0));
  77.         CORE_LOGF(eLOG_Note, ("Creating heap %d", j));
  78.         if (!(heap = HEAP_Create(0, 0, 4096, s_Expand, 0)))
  79.             CORE_LOG(eLOG_Error, "Cannot create heap");
  80.         while (rand() != 12345) {
  81.             r = rand() & 7;
  82.             if (r == 1 || r == 3) {
  83.                 i = rand() & 0xFF;
  84.                 if (i) {
  85.                     CORE_LOGF(eLOG_Note, ("Allocating %d bytes", i));
  86.                     if (!(blk = HEAP_Alloc(heap, i)))
  87.                         CORE_LOG(eLOG_Error, "Allocation failed");
  88.                     else
  89.                         CORE_LOG(eLOG_Note, "Done");
  90.                     c = (char*) blk + sizeof(*blk);
  91.                     while (i--)
  92.                         *c++ = rand();
  93.                 }
  94.             } else if (r == 2 || r == 4) {
  95.                 blk = 0;
  96.                 i = 0;
  97.                 do {
  98.                     blk = HEAP_Walk(heap, blk);
  99.                     if (!blk)
  100.                         break;
  101.                     i++;
  102.                 } while (rand() & 0x7);
  103.                 if (blk && (short) blk->flag) {
  104.                     CORE_LOGF(eLOG_Note,
  105.                               ("Deleting block #%d, size %u", i,
  106.                                (unsigned) (blk->size - sizeof(*blk))));
  107.                     HEAP_Free(heap, blk);
  108.                     CORE_LOG(eLOG_Note, "Done");
  109.                 }
  110.             } else if (r == 5) {
  111.                 blk = 0;
  112.                 i = 0;
  113.                 CORE_LOG(eLOG_Note, "Walking the heap");
  114.                 do {
  115.                     blk = HEAP_Walk(heap, blk);
  116.                     if (blk)
  117.                         CORE_LOGF(eLOG_Note,
  118.                                   ("Block #%d (%s), size %u", ++i,
  119.                                    (short) blk->flag ? "used" : "free",
  120.                                    (unsigned) (blk->size - sizeof(*blk))));
  121.                 } while (blk);
  122.                 CORE_LOGF(eLOG_Note,
  123.                           ("Total of %d block%s", i, i == 1 ? "" : "s"));
  124.             } else if (r == 6 || r == 7) {
  125.                 HEAP newheap;
  126.                 if (r == 6)
  127.                     newheap = HEAP_Attach(/* HACK! */*((char**)heap));
  128.                 else
  129.                     newheap = HEAP_Copy(heap);
  130.                 if (!newheap)
  131.                     CORE_LOGF(eLOG_Error, ("%s failed",
  132.                                            r == 6 ? "Attach" : "Copy"));
  133.                 blk = 0;
  134.                 i = 0;
  135.                 CORE_LOGF(eLOG_Note, ("Walking %s heap",
  136.                                       r == 6 ? "attached" : "copied"));
  137.                 do {
  138.                     blk = HEAP_Walk(newheap, blk);
  139.                     if (blk)
  140.                         CORE_LOGF(eLOG_Note,
  141.                                   ("Block #%d (%s), size %u", ++i,
  142.                                    (short) blk->flag ? "used" : "free",
  143.                                    (unsigned) (blk->size - sizeof(*blk))));
  144.                 } while (blk);
  145.                 CORE_LOGF(eLOG_Note,
  146.                           ("Total of %d block%s", i, i == 1 ? "" : "s"));
  147.                 HEAP_Detach(newheap);
  148.             } else {
  149.                 TNCBI_Size size = HEAP_Size(heap);
  150.                 CORE_LOGF(eLOG_Note, ("Heap trimmed: %u -> %u",
  151.                                       (unsigned) size,
  152.                                       (unsigned) HEAP_Trim(heap)));
  153.             }
  154.         }
  155.         HEAP_Destroy(heap);
  156.         CORE_LOGF(eLOG_Note, ("Heap %d done", j));
  157.     }
  158.     CORE_LOG(eLOG_Note, "Test completed");
  159.     return 0;
  160. }
  161. /*
  162.  * --------------------------------------------------------------------------
  163.  * $Log: test_ncbi_heapmgr.c,v $
  164.  * Revision 1000.0  2003/10/29 17:05:07  gouriano
  165.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.12
  166.  *
  167.  * Revision 6.12  2003/08/25 14:58:10  lavr
  168.  * Adjust test to take advantage of modified API
  169.  *
  170.  * Revision 6.11  2003/07/31 17:54:16  lavr
  171.  * +HEAP_Trim() test
  172.  *
  173.  * Revision 6.10  2003/02/27 15:34:35  lavr
  174.  * Log moved to end
  175.  *
  176.  * Revision 6.9  2002/04/15 19:21:44  lavr
  177.  * +#include "../test/test_assert.h"
  178.  *
  179.  * Revision 6.8  2001/07/03 20:53:38  lavr
  180.  * HEAP_Copy() test added
  181.  *
  182.  * Revision 6.7  2001/06/19 19:12:04  lavr
  183.  * Type change: size_t -> TNCBI_Size; time_t -> TNCBI_Time
  184.  *
  185.  * Revision 6.6  2001/01/23 23:22:05  lavr
  186.  * Patched logging (in a few places)
  187.  *
  188.  * Revision 6.5  2001/01/12 23:59:53  lavr
  189.  * Message logging modified for use LOG facility only
  190.  *
  191.  * Revision 6.4  2000/12/29 18:23:42  lavr
  192.  * getpagesize() replaced by a constant 4096, which is "more portable".
  193.  *
  194.  * Revision 6.3  2000/05/31 23:12:32  lavr
  195.  * First try to assemble things together to get working service mapper
  196.  *
  197.  * Revision 6.2  2000/05/16 15:21:03  lavr
  198.  * Cleaned up with format - argument correspondence; #include <time.h> added
  199.  *
  200.  * Revision 6.1  2000/05/12 19:35:13  lavr
  201.  * First working revision
  202.  *
  203.  * ==========================================================================
  204.  */