source: git/omalloc/omBinPage.h @ d011a2

spielwiese
Last change on this file since d011a2 was 13fe1b, checked in by Hans Schönemann <hannes@…>, 23 years ago
*hannes: DecAlpha-ccc-port git-svn-id: file:///usr/local/Singular/svn/trunk@5409 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 3.4 KB
Line 
1/*******************************************************************
2 *  File:    omBinPage.h
3 *  Purpose: declaration of routines for primitve BinPage managment
4 *  Author:  obachman (Olaf Bachmann)
5 *  Created: 11/99
6 *  Version: $Id: omBinPage.h,v 1.5 2001-04-30 09:02:03 Singular Exp $
7 *******************************************************************/
8#ifndef OM_BIN_PAGE_H
9#define OM_BIN_PAGE_H
10
11/***********************************************************************
12 *
13 * Macros for page manipulations
14 *
15 **********************************************************************/
16
17#define omIsAddrPageAligned(addr) \
18  (((long) (addr) & (SIZEOF_SYSTEM_PAGE -1)) == 0)
19
20#define omGetPageOfAddr(addr) \
21  ((void*) (((long)addr) & ~(SIZEOF_SYSTEM_PAGE -1)))
22
23#define omGetBinPageOfAddr(addr) \
24  ((omBinPage) ((long) (addr) & ~(SIZEOF_SYSTEM_PAGE -1)))
25
26#define omIsAddrOnPage(addr, page) (omGetPageOfAddr(addr) == (void*) (page))
27
28#define omAreAddrOnSamePage(a1, a2) \
29  (omGetPageOfAddr(a1) == omGetPageOfAddr(a2))
30
31/***********************************************************************
32 *
33 * Identifying whether an address is a BinPageAddr:
34 *
35 *******************************************************************/
36
37/* Here is how it works (assume SIZEOF_LONG == 4, SIZEOF_SYSTEM_PAGE = 2^12):
38   Let
39   Addr: |    15               |  5       |    12        |
40          PAGE_INDEX            PAGE_SHIFT PAGE_OFFSET
41
42                                      PAGE_BASE
43
44   om_PageIndicies is an array of bit-fields which is indexed by
45                  PAGE_INDEX - om_MinBinPageIndex. Its maximal length
46                  is 2^15. PAGE_SHIFT is used as index into the bit-field.
47                  If it's value is 1, then addr is from omBinPage, else
48                  not.
49
50   om_MinPageIndex is minimal page index of registered BinPageAddr
51
52   In other words: omIsBinPageAddr iff PAGE_INDEX >= om_MinBinPageIndex && PAGE_INDEX <=  om_MaxBinPageIndex
53   && om_PageIndicies[PAGE_INDEX - om_MinPageIndex] & (1 << PAGE_SHIFT) */
54
55extern unsigned long om_MaxBinPageIndex;
56extern unsigned long om_MinBinPageIndex;
57extern unsigned long *om_BinPageIndicies;
58
59#define OM_SIZEOF_INDEX_PAGE (((unsigned long) SIZEOF_SYSTEM_PAGE) << LOG_BIT_SIZEOF_LONG)
60
61#define omGetPageShiftOfAddr(addr) \
62  ((((unsigned long) addr) & (OM_SIZEOF_INDEX_PAGE -1)) >> LOG_BIT_SIZEOF_SYSTEM_PAGE)
63
64#define omGetPageIndexOfAddr(addr) \
65  (((unsigned long) addr) >> (LOG_BIT_SIZEOF_LONG + LOG_BIT_SIZEOF_SYSTEM_PAGE))
66
67
68#if defined(OM_INLINE) || defined(OM_INTERNAL_DEBUG)
69#define omIsBinPageAddr(addr) _omIsBinPageAddr(addr)
70#else
71/* let's hope the compiler can eliminate common subexpressions well */      \
72#define omIsBinPageAddr(addr)                                               \
73  ((omGetPageIndexOfAddr(addr) >= om_MinBinPageIndex) &&                    \
74   (omGetPageIndexOfAddr(addr) <= om_MaxBinPageIndex) &&                    \
75   ((om_BinPageIndicies[omGetPageIndexOfAddr(addr) - om_MinBinPageIndex] &   \
76     (((unsigned long) 1) << omGetPageShiftOfAddr(addr))) != 0))
77#endif
78
79/*BEGINPRIVATE*/
80/*******************************************************************
81 *
82 * Alloc/Free of BinPages
83 *
84 *******************************************************************/
85extern omBinPage omAllocBinPages(int how_many);
86extern omBinPage omAllocBinPage();
87
88extern void omFreeBinPages(omBinPage page, int how_many);
89#define omFreeBinPage(addr) omFreeBinPages(addr, 1)
90/*ENDPRIVATE*/
91
92#endif /* OM_BIN_PAGE_H */
Note: See TracBrowser for help on using the repository browser.