Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

range.h

Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 1997 Microsoft Corporation 00004 00005 Module Name: 00006 00007 range.h 00008 00009 Abstract: 00010 00011 Kernel-mode range list support for arbiters 00012 00013 Author: 00014 00015 Andy Thornton (andrewth) 02/17/97 00016 00017 Revision History: 00018 00019 --*/ 00020 00021 #ifndef _RANGE_ 00022 #define _RANGE_ 00023 00024 // 00025 // Debugging options 00026 // 00027 00028 #if DBG && !defined(NTOS_KERNEL_RUNTIME) 00029 #include <stdio.h> 00030 #endif 00031 00032 #undef MAX_ULONGLONG 00033 #define MAX_ULONGLONG ((ULONGLONG)-1) 00034 00035 #define RTL_RANGE_LIST_ENTRY_TAG 'elRR' 00036 #define RTL_RANGE_LIST_MISC_TAG 'mlRR' 00037 00038 #if DBG 00039 #define DEBUG_PRINT(Level, Message) \ 00040 if (Level <= RtlRangeDebugLevel) DbgPrint Message 00041 #else 00042 #define DEBUG_PRINT(Level, Message) 00043 #endif // DBG 00044 00045 // 00046 // Range list structures 00047 // 00048 00049 #define RTLP_RANGE_LIST_ENTRY_MERGED 0x0001 00050 00051 typedef struct _RTLP_RANGE_LIST_ENTRY { 00052 00053 // 00054 // Common data 00055 // 00056 ULONGLONG Start; 00057 ULONGLONG End; 00058 00059 union { 00060 00061 // 00062 // An Allocated range 00063 // 00064 struct { 00065 00066 // 00067 // Data from the user given in AddRange 00068 // 00069 PVOID UserData; 00070 00071 // 00072 // The owner of the range 00073 // 00074 PVOID Owner; 00075 00076 } Allocated; 00077 00078 // 00079 // A Merged range 00080 // 00081 struct { 00082 00083 // 00084 // List of ranges that overlap between Start and End 00085 // 00086 LIST_ENTRY ListHead; 00087 00088 } Merged; 00089 00090 }; 00091 00092 // 00093 // User defined flags given in AddRange 00094 // 00095 UCHAR Attributes; 00096 00097 // 00098 // Range descriptors 00099 // 00100 UCHAR PublicFlags; // use RANGE_* 00101 00102 // 00103 // Control information 00104 // 00105 USHORT PrivateFlags; // use RANGE_LIST_ENTRY_* 00106 00107 // 00108 // Main linked list entry 00109 // 00110 LIST_ENTRY ListEntry; 00111 00112 } RTLP_RANGE_LIST_ENTRY, *PRTLP_RANGE_LIST_ENTRY; 00113 00114 00115 // 00116 // Useful macros for dealing with range list entries 00117 // 00118 00119 #define MERGED(Entry) (BOOLEAN)((Entry)->PrivateFlags & RTLP_RANGE_LIST_ENTRY_MERGED) 00120 #define SHARED(Entry) (BOOLEAN)((Entry)->PublicFlags & RTL_RANGE_SHARED) 00121 #define CONFLICT(Entry) (BOOLEAN)((Entry)->PublicFlags & RTL_RANGE_CONFLICT) 00122 00123 // 00124 // List Traversing Macros 00125 // 00126 00127 #define FOR_ALL_IN_LIST(Type, Head, Current) \ 00128 for((Current) = CONTAINING_RECORD((Head)->Flink, Type, ListEntry); \ 00129 (Head) != &(Current)->ListEntry; \ 00130 (Current) = CONTAINING_RECORD((Current)->ListEntry.Flink, \ 00131 Type, \ 00132 ListEntry) \ 00133 ) 00134 00135 #define FOR_ALL_IN_LIST_SAFE(Type, Head, Current, Next) \ 00136 for((Current) = CONTAINING_RECORD((Head)->Flink, Type, ListEntry), \ 00137 (Next) = CONTAINING_RECORD((Current)->ListEntry.Flink, \ 00138 Type, ListEntry); \ 00139 (Head) != &(Current)->ListEntry; \ 00140 (Current) = (Next), \ 00141 (Next) = CONTAINING_RECORD((Current)->ListEntry.Flink, \ 00142 Type, ListEntry) \ 00143 ) 00144 00145 00146 #define FOR_REST_IN_LIST(Type, Head, Current) \ 00147 for(; \ 00148 (Head) != &(Current)->ListEntry; \ 00149 (Current) = CONTAINING_RECORD((Current)->ListEntry.Flink, \ 00150 Type, \ 00151 ListEntry) \ 00152 ) 00153 00154 #define FOR_REST_IN_LIST_SAFE(Type, Head, Current, Next) \ 00155 for((Next) = CONTAINING_RECORD((Current)->ListEntry.Flink, \ 00156 Type, ListEntry); \ 00157 (Head) != &(Current)->ListEntry; \ 00158 (Current) = (Next), \ 00159 (Next) = CONTAINING_RECORD((Current)->ListEntry.Flink, \ 00160 Type, ListEntry) \ 00161 ) 00162 00163 // 00164 // Backwards List Traversing Macros 00165 // 00166 00167 #define FOR_ALL_IN_LIST_BACKWARDS(Type, Head, Current) \ 00168 for((Current) = CONTAINING_RECORD((Head)->Blink, Type, ListEntry); \ 00169 (Head) != &(Current)->ListEntry; \ 00170 (Current) = CONTAINING_RECORD((Current)->ListEntry.Blink, \ 00171 Type, \ 00172 ListEntry) \ 00173 ) 00174 00175 #define FOR_ALL_IN_LIST_SAFE_BACKWARDS(Type, Head, Current, Next) \ 00176 for((Current) = CONTAINING_RECORD((Head)->Blink, Type, ListEntry), \ 00177 (Next) = CONTAINING_RECORD((Current)->ListEntry.Blink, \ 00178 Type, ListEntry); \ 00179 (Head) != &(Current)->ListEntry; \ 00180 (Current) = (Next), \ 00181 (Next) = CONTAINING_RECORD((Current)->ListEntry.Blink, \ 00182 Type, ListEntry) \ 00183 ) 00184 00185 00186 #define FOR_REST_IN_LIST_BACKWARDS(Type, Head, Current) \ 00187 for(; \ 00188 (Head) != &(Current)->ListEntry; \ 00189 (Current) = CONTAINING_RECORD((Current)->ListEntry.Blink, \ 00190 Type, \ 00191 ListEntry) \ 00192 ) 00193 00194 #define FOR_REST_IN_LIST_SAFE_BACKWARDS(Type, Head, Current, Next) \ 00195 for((Next) = CONTAINING_RECORD((Current)->ListEntry.Blink, \ 00196 Type, ListEntry); \ 00197 (Head) != &(Current)->ListEntry; \ 00198 (Current) = (Next), \ 00199 (Next) = CONTAINING_RECORD((Current)->ListEntry.Blink, \ 00200 Type, ListEntry) \ 00201 ) 00202 00203 // 00204 // Misc Macros 00205 // 00206 00207 #define LAST_IN_LIST(ListHead, Entry) \ 00208 ( (Entry)->ListEntry.Flink == ListHead ) 00209 00210 #define FIRST_IN_LIST(ListHead, Entry) \ 00211 ( (Entry)->ListEntry.Blink == ListHead ) 00212 00213 00214 #define RANGE_DISJOINT(a,b) \ 00215 ( ((a)->Start < (b)->Start && (a)->End < (b)->Start) \ 00216 ||((b)->Start < (a)->Start && (b)->End < (a)->Start) ) 00217 00218 #define RANGE_INTERSECT(a,b) \ 00219 !RANGE_DISJOINT((a),(b)) 00220 00221 #define RANGE_LIMITS_DISJOINT(s1,e1,s2,e2) \ 00222 ( ((s1) < (s2) && (e1) < (s2)) \ 00223 ||((s2) < (s1) && (e2) < (s1)) ) 00224 00225 #define RANGE_LIMITS_INTERSECT(s1,e1,s2,e2) \ 00226 !RANGE_LIMITS_DISJOINT((s1),(e1),(s2),(e2)) 00227 00228 #define RANGE_LIST_ENTRY_FROM_LIST_ENTRY(Entry) \ 00229 CONTAINING_RECORD((Entry), RTLP_RANGE_LIST_ENTRY, ListEntry) 00230 00231 #define RANGE_LIST_FROM_LIST_HEAD(Head) \ 00232 CONTAINING_RECORD((Head), RTL_RANGE_LIST, ListHead) 00233 00234 #define FOR_REST_OF_RANGES(_Iterator, _Current, _Forward) \ 00235 for ((_Current) = (PRTL_RANGE)(_Iterator)->Current; \ 00236 (_Current) != NULL; \ 00237 RtlGetNextRange((_Iterator), &(_Current), (_Forward)) \ 00238 ) 00239 00240 // 00241 // VOID 00242 // InsertEntryList( 00243 // PLIST_ENTRY Previous, 00244 // PLIST_ENTRY Entry 00245 // ); 00246 // 00247 00248 #define InsertEntryList(Previous, Entry) { \ 00249 PLIST_ENTRY _EX_Next = (Previous)->Flink; \ 00250 PLIST_ENTRY _EX_Previous = (Previous); \ 00251 (Entry)->Flink = _EX_Next; \ 00252 (Entry)->Blink = _EX_Previous; \ 00253 _EX_Next->Blink = (Entry); \ 00254 _EX_Previous->Flink = (Entry); \ 00255 } 00256 00257 00258 00259 00260 #endif

Generated on Sat May 15 19:41:36 2004 for test by doxygen 1.3.7