VirtualBox

source: vbox/trunk/src/VBox/Debugger/DBGCInternal.h@ 64591

Last change on this file since 64591 was 64591, checked in by vboxsync, 8 years ago

Debugger/EmulateCodeview: Start dumping branch tables contained in graphs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.2 KB
Line 
1/* $Id: DBGCInternal.h 64591 2016-11-06 19:15:57Z vboxsync $ */
2/** @file
3 * DBGC - Debugger Console, Internal Header File.
4 */
5
6/*
7 * Copyright (C) 2006-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19#ifndef ___Debugger_DBGCInternal_h
20#define ___Debugger_DBGCInternal_h
21
22
23/*******************************************************************************
24* Header Files *
25*******************************************************************************/
26#include <VBox/dbg.h>
27#include <VBox/err.h>
28
29
30/*******************************************************************************
31* Structures and Typedefs *
32*******************************************************************************/
33
34/**
35 * Debugger console per breakpoint data.
36 */
37typedef struct DBGCBP
38{
39 /** Pointer to the next breakpoint in the list. */
40 struct DBGCBP *pNext;
41 /** The breakpoint identifier. */
42 uint32_t iBp;
43 /** The size of the command. */
44 size_t cchCmd;
45 /** The command to execute when the breakpoint is hit. */
46 char szCmd[1];
47} DBGCBP;
48/** Pointer to a breakpoint. */
49typedef DBGCBP *PDBGCBP;
50
51
52typedef enum DBGCEVTSTATE
53{
54 kDbgcEvtState_Invalid = 0,
55 kDbgcEvtState_Disabled,
56 kDbgcEvtState_Enabled,
57 kDbgcEvtState_Notify
58} DBGCEVTSTATE;
59
60/**
61 * Debugger console per event configuration.
62 */
63typedef struct DBGCEVTCFG
64{
65 /** The event state. */
66 DBGCEVTSTATE enmState;
67 /** The size of the command. */
68 size_t cchCmd;
69 /** The command to execute when the event occurs. */
70 char szCmd[1];
71} DBGCEVTCFG;
72/** Pointer to a event configuration. */
73typedef DBGCEVTCFG *PDBGCEVTCFG;
74/** Pointer to a const event configuration. */
75typedef DBGCEVTCFG const *PCDBGCEVTCFG;
76
77
78/**
79 * Named variable.
80 *
81 * Always allocated from heap in one single block.
82 */
83typedef struct DBGCNAMEDVAR
84{
85 /** The variable. */
86 DBGCVAR Var;
87 /** Its name. */
88 char szName[1];
89} DBGCNAMEDVAR;
90/** Pointer to named variable. */
91typedef DBGCNAMEDVAR *PDBGCNAMEDVAR;
92
93
94/**
95 * Debugger console status
96 */
97typedef enum DBGCSTATUS
98{
99 /** Normal status, .*/
100 DBGC_HALTED
101
102} DBGCSTATUS;
103
104
105/**
106 * Debugger console instance data.
107 */
108typedef struct DBGC
109{
110 /** Command helpers. */
111 DBGCCMDHLP CmdHlp;
112 /** Wrappers for DBGF output. */
113 DBGFINFOHLP DbgfOutputHlp;
114 /** Pointer to backend callback structure. */
115 PDBGCBACK pBack;
116
117 /** Pointer to the current VM. */
118 PVM pVM;
119 /** The user mode handle of the current VM. */
120 PUVM pUVM;
121 /** The ID of current virtual CPU. */
122 VMCPUID idCpu;
123 /** The current address space handle. */
124 RTDBGAS hDbgAs;
125 /** The current debugger emulation. */
126 const char *pszEmulation;
127 /** Pointer to the commands for the current debugger emulation. */
128 PCDBGCCMD paEmulationCmds;
129 /** The number of commands paEmulationCmds points to. */
130 uint32_t cEmulationCmds;
131 /** Pointer to the functions for the current debugger emulation. */
132 PCDBGCFUNC paEmulationFuncs;
133 /** The number of functions paEmulationFuncs points to. */
134 uint32_t cEmulationFuncs;
135 /** Log indicator. (If set we're writing the log to the console.) */
136 bool fLog;
137
138 /** Indicates whether we're in guest (true) or hypervisor (false) register context. */
139 bool fRegCtxGuest;
140 /** Indicates whether the register are terse or sparse. */
141 bool fRegTerse;
142 /** Counter use to suppress the printing of the headers. */
143 uint8_t cPagingHierarchyDumps;
144
145 /** Current disassembler position. */
146 DBGCVAR DisasmPos;
147 /** The flags that goes with DisasmPos. */
148 uint32_t fDisasm;
149 /** Current source position. (flat GC) */
150 DBGCVAR SourcePos;
151 /** Current memory dump position. */
152 DBGCVAR DumpPos;
153 /** Size of the previous dump element. */
154 unsigned cbDumpElement;
155 /** Points to DisasmPos, SourcePos or DumpPos depending on which was
156 * used last. */
157 PCDBGCVAR pLastPos;
158
159 /** Number of variables in papVars. */
160 unsigned cVars;
161 /** Array of global variables.
162 * Global variables can be referenced using the $ operator and set
163 * and unset using command with those names. */
164 PDBGCNAMEDVAR *papVars;
165
166 /** The list of breakpoints. (singly linked) */
167 PDBGCBP pFirstBp;
168
169 /** Software interrupt events. */
170 PDBGCEVTCFG apSoftInts[256];
171 /** Hardware interrupt events. */
172 PDBGCEVTCFG apHardInts[256];
173 /** Selectable events (first few entries are unused). */
174 PDBGCEVTCFG apEventCfgs[DBGFEVENT_END];
175
176 /** Save search pattern. */
177 uint8_t abSearch[256];
178 /** The length of the search pattern. */
179 uint32_t cbSearch;
180 /** The search unit */
181 uint32_t cbSearchUnit;
182 /** The max hits. */
183 uint64_t cMaxSearchHits;
184 /** The address to resume searching from. */
185 DBGFADDRESS SearchAddr;
186 /** What's left of the original search range. */
187 RTGCUINTPTR cbSearchRange;
188
189 /** @name Parsing and Execution
190 * @{ */
191
192 /** Input buffer. */
193 char achInput[2048];
194 /** To ease debugging. */
195 unsigned uInputZero;
196 /** Write index in the input buffer. */
197 unsigned iWrite;
198 /** Read index in the input buffer. */
199 unsigned iRead;
200 /** The number of lines in the buffer. */
201 unsigned cInputLines;
202 /** Indicates that we have a buffer overflow condition.
203 * This means that input is ignored up to the next newline. */
204 bool fInputOverflow;
205 /** Indicates whether or we're ready for input. */
206 bool fReady;
207 /** Scratch buffer position. */
208 char *pszScratch;
209 /** Scratch buffer. */
210 char achScratch[16384];
211 /** Argument array position. */
212 unsigned iArg;
213 /** Array of argument variables. */
214 DBGCVAR aArgs[100];
215
216 /** rc from the last dbgcHlpPrintfV(). */
217 int rcOutput;
218 /** The last character we wrote. */
219 char chLastOutput;
220
221 /** rc from the last command. */
222 int rcCmd;
223 /** @} */
224
225 /** The command history file (not yet implemented). */
226 char *pszHistoryFile;
227 /** The global debugger init script. */
228 char *pszGlobalInitScript;
229 /** The per VM debugger init script. */
230 char *pszLocalInitScript;
231} DBGC;
232/** Pointer to debugger console instance data. */
233typedef DBGC *PDBGC;
234
235/** Converts a Command Helper pointer to a pointer to DBGC instance data. */
236#define DBGC_CMDHLP2DBGC(pCmdHlp) ( (PDBGC)((uintptr_t)(pCmdHlp) - RT_OFFSETOF(DBGC, CmdHlp)) )
237
238
239/**
240 * Chunk of external commands.
241 */
242typedef struct DBGCEXTCMDS
243{
244 /** Number of commands descriptors. */
245 unsigned cCmds;
246 /** Pointer to array of command descriptors. */
247 PCDBGCCMD paCmds;
248 /** Pointer to the next chunk. */
249 struct DBGCEXTCMDS *pNext;
250} DBGCEXTCMDS;
251/** Pointer to chunk of external commands. */
252typedef DBGCEXTCMDS *PDBGCEXTCMDS;
253
254
255/**
256 * Chunk of external functions.
257 */
258typedef struct DBGCEXTFUNCS
259{
260 /** Number of functions descriptors. */
261 uint32_t cFuncs;
262 /** Pointer to array of functions descriptors. */
263 PCDBGCFUNC paFuncs;
264 /** Pointer to the next chunk. */
265 struct DBGCEXTFUNCS *pNext;
266} DBGCEXTFUNCS;
267/** Pointer to chunk of external functions. */
268typedef DBGCEXTFUNCS *PDBGCEXTFUNCS;
269
270
271
272/**
273 * Unary operator handler function.
274 *
275 * @returns 0 on success.
276 * @returns VBox evaluation / parsing error code on failure.
277 * The caller does the bitching.
278 * @param pDbgc Debugger console instance data.
279 * @param pArg The argument.
280 * @param enmCat The desired result category. Can be ignored.
281 * @param pResult Where to store the result.
282 */
283typedef DECLCALLBACK(int) FNDBGCOPUNARY(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
284/** Pointer to a unary operator handler function. */
285typedef FNDBGCOPUNARY *PFNDBGCOPUNARY;
286
287
288/**
289 * Binary operator handler function.
290 *
291 * @returns 0 on success.
292 * @returns VBox evaluation / parsing error code on failure.
293 * The caller does the bitching.
294 * @param pDbgc Debugger console instance data.
295 * @param pArg1 The first argument.
296 * @param pArg2 The 2nd argument.
297 * @param pResult Where to store the result.
298 */
299typedef DECLCALLBACK(int) FNDBGCOPBINARY(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
300/** Pointer to a binary operator handler function. */
301typedef FNDBGCOPBINARY *PFNDBGCOPBINARY;
302
303
304/**
305 * Operator descriptor.
306 */
307typedef struct DBGCOP
308{
309 /** Operator mnemonic. */
310 char szName[4];
311 /** Length of name. */
312 const unsigned cchName;
313 /** Whether or not this is a binary operator.
314 * Unary operators are evaluated right-to-left while binary are left-to-right. */
315 bool fBinary;
316 /** Precedence level. */
317 unsigned iPrecedence;
318 /** Unary operator handler. */
319 PFNDBGCOPUNARY pfnHandlerUnary;
320 /** Binary operator handler. */
321 PFNDBGCOPBINARY pfnHandlerBinary;
322 /** The category of the 1st argument.
323 * Set to DBGCVAR_CAT_ANY if anything goes. */
324 DBGCVARCAT enmCatArg1;
325 /** The category of the 2nd argument.
326 * Set to DBGCVAR_CAT_ANY if anything goes. */
327 DBGCVARCAT enmCatArg2;
328 /** Operator description. */
329 const char *pszDescription;
330} DBGCOP;
331/** Pointer to an operator descriptor. */
332typedef DBGCOP *PDBGCOP;
333/** Pointer to a const operator descriptor. */
334typedef const DBGCOP *PCDBGCOP;
335
336
337
338/** Pointer to symbol descriptor. */
339typedef struct DBGCSYM *PDBGCSYM;
340/** Pointer to const symbol descriptor. */
341typedef const struct DBGCSYM *PCDBGCSYM;
342
343/**
344 * Get builtin symbol.
345 *
346 * @returns 0 on success.
347 * @returns VBox evaluation / parsing error code on failure.
348 * The caller does the bitching.
349 * @param pSymDesc Pointer to the symbol descriptor.
350 * @param pCmdHlp Pointer to the command callback structure.
351 * @param enmType The result type.
352 * @param pResult Where to store the result.
353 */
354typedef DECLCALLBACK(int) FNDBGCSYMGET(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, DBGCVARTYPE enmType, PDBGCVAR pResult);
355/** Pointer to get function for a builtin symbol. */
356typedef FNDBGCSYMGET *PFNDBGCSYMGET;
357
358/**
359 * Set builtin symbol.
360 *
361 * @returns 0 on success.
362 * @returns VBox evaluation / parsing error code on failure.
363 * The caller does the bitching.
364 * @param pSymDesc Pointer to the symbol descriptor.
365 * @param pCmdHlp Pointer to the command callback structure.
366 * @param pValue The value to assign the symbol.
367 */
368typedef DECLCALLBACK(int) FNDBGCSYMSET(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, PCDBGCVAR pValue);
369/** Pointer to set function for a builtin symbol. */
370typedef FNDBGCSYMSET *PFNDBGCSYMSET;
371
372
373/**
374 * Symbol description (for builtin symbols).
375 */
376typedef struct DBGCSYM
377{
378 /** Symbol name. */
379 const char *pszName;
380 /** Get function. */
381 PFNDBGCSYMGET pfnGet;
382 /** Set function. (NULL if readonly) */
383 PFNDBGCSYMSET pfnSet;
384 /** User data. */
385 unsigned uUser;
386} DBGCSYM;
387
388
389/** Selectable debug event kind. */
390typedef enum
391{
392 kDbgcSxEventKind_Plain,
393 kDbgcSxEventKind_Interrupt
394} DBGCSXEVENTKIND;
395
396/**
397 * Selectable debug event name / type lookup table entry.
398 *
399 * This also contains the default setting and an alternative name.
400 */
401typedef struct DBGCSXEVT
402{
403 /** The event type. */
404 DBGFEVENTTYPE enmType;
405 /** The event name. */
406 const char *pszName;
407 /** Alternative event name (optional). */
408 const char *pszAltNm;
409 /** The kind of event. */
410 DBGCSXEVENTKIND enmKind;
411 /** The default state. */
412 DBGCEVTSTATE enmDefault;
413 /** Flags, DBGCSXEVT_F_XXX. */
414 uint32_t fFlags;
415 /** Description for use when reporting the event, optional. */
416 const char *pszDesc;
417} DBGCSXEVT;
418/** Pointer to a constant selectable debug event descriptor. */
419typedef DBGCSXEVT const *PCDBGCSXEVT;
420
421/** @name DBGCSXEVT_F_XXX
422 * @{ */
423#define DBGCSXEVT_F_TAKE_ARG RT_BIT_32(0)
424/** @} */
425
426
427/**
428 * Control flow graph basic block dumper state
429 */
430typedef struct DBGCFLOWBBDUMP
431{
432 /** The basic block referenced. */
433 DBGFFLOWBB hFlowBb;
434 /** Cached start address. */
435 DBGFADDRESS AddrStart;
436 /** Target address. */
437 DBGFADDRESS AddrTarget;
438 /** Width of the basic block in chars. */
439 uint32_t cchWidth;
440 /** Height of the basic block in chars. */
441 uint32_t cchHeight;
442 /** X coordinate of the start. */
443 uint32_t uStartX;
444 /** Y coordinate of the start. */
445 uint32_t uStartY;
446} DBGCFLOWBBDUMP;
447/** Pointer to the control flow graph basic block dump state. */
448typedef DBGCFLOWBBDUMP *PDBGCFLOWBBDUMP;
449
450
451/**
452 * Control flow graph branch table dumper state.
453 */
454typedef struct DBGCFLOWBRANCHTBLDUMP
455{
456 /** The branch table referenced. */
457 DBGFFLOWBRANCHTBL hFlowBranchTbl;
458 /** Cached start address. */
459 DBGFADDRESS AddrStart;
460 /** Width of the branch table in chars. */
461 uint32_t cchWidth;
462 /** Height of the branch table in chars. */
463 uint32_t cchHeight;
464 /** X coordinate of the start. */
465 uint32_t uStartX;
466 /** Y coordinate of the start. */
467 uint32_t uStartY;
468} DBGCFLOWBRANCHTBLDUMP;
469/** Pointer to control flow graph branch table state. */
470typedef DBGCFLOWBRANCHTBLDUMP *PDBGCFLOWBRANCHTBLDUMP;
471
472/*******************************************************************************
473* Internal Functions *
474*******************************************************************************/
475int dbgcBpAdd(PDBGC pDbgc, RTUINT iBp, const char *pszCmd);
476int dbgcBpUpdate(PDBGC pDbgc, RTUINT iBp, const char *pszCmd);
477int dbgcBpDelete(PDBGC pDbgc, RTUINT iBp);
478PDBGCBP dbgcBpGet(PDBGC pDbgc, RTUINT iBp);
479int dbgcBpExec(PDBGC pDbgc, RTUINT iBp);
480
481void dbgcEvalInit(void);
482int dbgcEvalSub(PDBGC pDbgc, char *pszExpr, size_t cchExpr, DBGCVARCAT enmCategory, PDBGCVAR pResult);
483int dbgcEvalCommand(PDBGC pDbgc, char *pszCmd, size_t cchCmd, bool fNoExecute);
484int dbgcEvalScript(PDBGC pDbgc, const char *pszFilename, bool fAnnounce);
485
486int dbgcSymbolGet(PDBGC pDbgc, const char *pszSymbol, DBGCVARTYPE enmType, PDBGCVAR pResult);
487PCDBGCSYM dbgcLookupRegisterSymbol(PDBGC pDbgc, const char *pszSymbol);
488PCDBGCOP dbgcOperatorLookup(PDBGC pDbgc, const char *pszExpr, bool fPreferBinary, char chPrev);
489PCDBGCCMD dbgcCommandLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal);
490PCDBGCFUNC dbgcFunctionLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal);
491
492DECLCALLBACK(int) dbgcOpRegister(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
493DECLCALLBACK(int) dbgcOpAddrFlat(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
494DECLCALLBACK(int) dbgcOpAddrHost(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
495DECLCALLBACK(int) dbgcOpAddrPhys(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
496DECLCALLBACK(int) dbgcOpAddrHostPhys(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
497
498void dbgcInitCmdHlp(PDBGC pDbgc);
499
500void dbgcEventInit(PDBGC pDbgc);
501void dbgcEventTerm(PDBGC pDbgc);
502
503/** Console ASCII screen handle. */
504typedef struct DBGCSCREENINT *DBGCSCREEN;
505/** Pointer to ASCII screen handle. */
506typedef DBGCSCREEN *PDBGCSCREEN;
507
508/**
509 * ASCII screen blit callback.
510 *
511 * @returns VBox status code. Any non VINF_SUCCESS status code will abort the dumping.
512 *
513 * @param psz The string to dump
514 * @param pvUser Opaque user data.
515 */
516typedef DECLCALLBACK(int) FNDGCSCREENBLIT(const char *psz, void *pvUser);
517/** Pointer to a FNDGCSCREENBLIT. */
518typedef FNDGCSCREENBLIT *PFNDGCSCREENBLIT;
519
520/**
521 * ASCII screen supported colors.
522 */
523typedef enum DBGCSCREENCOLOR
524{
525 /** Invalid color. */
526 DBGCSCREENCOLOR_INVALID = 0,
527 /** Default color of the terminal. */
528 DBGCSCREENCOLOR_DEFAULT,
529 /** Black. */
530 DBGCSCREENCOLOR_BLACK,
531 DBGCSCREENCOLOR_BLACK_BRIGHT,
532 /** Red. */
533 DBGCSCREENCOLOR_RED,
534 DBGCSCREENCOLOR_RED_BRIGHT,
535 /** Green. */
536 DBGCSCREENCOLOR_GREEN,
537 DBGCSCREENCOLOR_GREEN_BRIGHT,
538 /** Yellow. */
539 DBGCSCREENCOLOR_YELLOW,
540 DBGCSCREENCOLOR_YELLOW_BRIGHT,
541 /** Blue. */
542 DBGCSCREENCOLOR_BLUE,
543 DBGCSCREENCOLOR_BLUE_BRIGHT,
544 /** Magenta. */
545 DBGCSCREENCOLOR_MAGENTA,
546 DBGCSCREENCOLOR_MAGENTA_BRIGHT,
547 /** Cyan. */
548 DBGCSCREENCOLOR_CYAN,
549 DBGCSCREENCOLOR_CYAN_BRIGHT,
550 /** White. */
551 DBGCSCREENCOLOR_WHITE,
552 DBGCSCREENCOLOR_WHITE_BRIGHT
553} DBGCSCREENCOLOR;
554/** Pointer to a screen color. */
555typedef DBGCSCREENCOLOR *PDBGCSCREENCOLOR;
556
557DECLHIDDEN(int) dbgcScreenAsciiCreate(PDBGCSCREEN phScreen, uint32_t cchWidth, uint32_t cchHeight);
558DECLHIDDEN(void) dbgcScreenAsciiDestroy(DBGCSCREEN hScreen);
559DECLHIDDEN(int) dbgcScreenAsciiBlit(DBGCSCREEN hScreen, PFNDGCSCREENBLIT pfnBlit, void *pvUser, bool fAddColors);
560DECLHIDDEN(int) dbgcScreenAsciiDrawLineVertical(DBGCSCREEN hScreen, uint32_t uX, uint32_t uStartY,
561 uint32_t uEndY, char ch, DBGCSCREENCOLOR enmColor);
562DECLHIDDEN(int) dbgcScreenAsciiDrawLineHorizontal(DBGCSCREEN hScreen, uint32_t uStartX, uint32_t uEndX,
563 uint32_t uY, char ch, DBGCSCREENCOLOR enmColor);
564DECLHIDDEN(int) dbgcScreenAsciiDrawCharacter(DBGCSCREEN hScreen, uint32_t uX, uint32_t uY, char ch,
565 DBGCSCREENCOLOR enmColor);
566DECLHIDDEN(int) dbgcScreenAsciiDrawString(DBGCSCREEN hScreen, uint32_t uX, uint32_t uY, const char *pszText,
567 DBGCSCREENCOLOR enmColor);
568
569/* For tstDBGCParser: */
570int dbgcCreate(PDBGC *ppDbgc, PDBGCBACK pBack, unsigned fFlags);
571int dbgcRun(PDBGC pDbgc);
572int dbgcProcessInput(PDBGC pDbgc, bool fNoExecute);
573void dbgcDestroy(PDBGC pDbgc);
574
575
576/*******************************************************************************
577* Global Variables *
578*******************************************************************************/
579extern const DBGCCMD g_aDbgcCmds[];
580extern const uint32_t g_cDbgcCmds;
581extern const DBGCFUNC g_aDbgcFuncs[];
582extern const uint32_t g_cDbgcFuncs;
583extern const DBGCCMD g_aCmdsCodeView[];
584extern const uint32_t g_cCmdsCodeView;
585extern const DBGCFUNC g_aFuncsCodeView[];
586extern const uint32_t g_cFuncsCodeView;
587extern const DBGCOP g_aDbgcOps[];
588extern const uint32_t g_cDbgcOps;
589extern const DBGCSXEVT g_aDbgcSxEvents[];
590extern const uint32_t g_cDbgcSxEvents;
591
592
593/*******************************************************************************
594* Defined Constants And Macros *
595*******************************************************************************/
596/** Locks the g_pExtCmdsHead and g_pExtFuncsHead lists for reading. */
597#define DBGCEXTLISTS_LOCK_RD() do { } while (0)
598/** Locks the g_pExtCmdsHead and g_pExtFuncsHead lists for writing. */
599#define DBGCEXTLISTS_LOCK_WR() do { } while (0)
600/** UnLocks the g_pExtCmdsHead and g_pExtFuncsHead lists after reading. */
601#define DBGCEXTLISTS_UNLOCK_RD() do { } while (0)
602/** UnLocks the g_pExtCmdsHead and g_pExtFuncsHead lists after writing. */
603#define DBGCEXTLISTS_UNLOCK_WR() do { } while (0)
604
605
606
607#endif
608
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette