1 /**************************************************************************
5 Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
7 Contact: SooChan Lim <sc1.lim@samsung.com>
8 Sangjin LEE <lsj119@samsung.com>
10 Permission is hereby granted, free of charge, to any person obtaining a
11 copy of this software and associated documentation files (the
12 "Software"), to deal in the Software without restriction, including
13 without limitation the rights to use, copy, modify, merge, publish,
14 distribute, sub license, and/or sell copies of the Software, and to
15 permit persons to whom the Software is furnished to do so, subject to
16 the following conditions:
18 The above copyright notice and this permission notice (including the
19 next paragraph) shall be included in all copies or substantial portions
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
25 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 **************************************************************************/
37 #include "xorg-server.h"
39 #include <scrnintstr.h>
41 #include <windowstr.h>
45 #include "xdbg_log_int.h"
46 #include "xdbg_types.h"
47 #include "xdbg_log_plist.h"
49 /* for debug message */
50 #define MMEM XDBG_M('M','E','M',0)
53 #define API __attribute__ ((visibility("default")))
56 /*=========================================================================*/
57 /* trace the usage of the pixmaps in xserver */
58 /*=========================================================================*/
60 #define CLIENT_BITS(id) ((id) & RESOURCE_CLIENT_MASK)
61 #define CLIENT_ID(id) ((int)(CLIENT_BITS(id) >> CLIENTOFFSET))
62 #define MAX_HISTORY 10
69 XID refHistorys[MAX_HISTORY];
71 struct xorg_list link;
76 struct xorg_list link;
81 XDbgRefPixmap *pRefPixmap;
82 struct xorg_list link;
83 struct xorg_list refPixmaps;
86 static int init_plist = 0;
87 static struct xorg_list xdbgPixmaps;
88 static struct xorg_list xdbgDrawables;
89 static PixmapPtr pPixRoot = NULL;
90 unsigned int total_size = 0;
91 unsigned int peek_size = 0;
97 {CREATE_PIXMAP_USAGE_SCRATCH, "scratch"},
98 {CREATE_PIXMAP_USAGE_BACKING_PIXMAP, "backing_pixmap"},
99 {CREATE_PIXMAP_USAGE_GLYPH_PICTURE, "glyph_picture"},
100 {CREATE_PIXMAP_USAGE_SHARED, "shared"},
101 {CREATE_PIXMAP_USAGE_OVERLAY, "overlay"},
102 {CREATE_PIXMAP_USAGE_DRI2_FLIP_BACK, "dri2_flip_back"},
103 {CREATE_PIXMAP_USAGE_FB, "fb"},
104 {CREATE_PIXMAP_USAGE_SUB_FB, "sub_fb"},
105 {CREATE_PIXMAP_USAGE_DRI2_BACK, "dri2_back"},
106 {CREATE_PIXMAP_USAGE_DRI3_BACK, "dri3"},
112 _get_pixmap_hint_name (signed int usage_hint)
116 while (pixmap_hint[i].hint)
118 if (pixmap_hint[i].hint == usage_hint)
119 return pixmap_hint[i].str;
126 _findXDbgPixmap (PixmapPtr pPixmap)
128 XDbgPixmap *cur = NULL, *tmp = NULL;
130 xorg_list_for_each_entry_safe (cur, tmp, &xdbgPixmaps, link)
132 if (cur->pPixmap == pPixmap)
139 static XDbgDrawable *
140 _findXDbgDrawable (DrawablePtr pDraw)
142 XDbgDrawable *cur = NULL, *tmp = NULL;
144 xorg_list_for_each_entry_safe (cur, tmp, &xdbgDrawables, link)
146 if (cur->pDraw == pDraw)
153 static XDbgRefPixmap*
154 _findXDbgRefPixmap (XDbgDrawable* pXDbgDrawable, PixmapPtr pPixmap)
156 XDbgRefPixmap *cur = NULL, *tmp = NULL;
158 xorg_list_for_each_entry_safe (cur, tmp, &pXDbgDrawable->refPixmaps, link)
160 if (cur->pPixmap == pPixmap)
168 _addXDbgPixmap (PixmapPtr pPixmap)
170 XDbgPixmap *cur = NULL;
173 cur = _findXDbgPixmap (pPixmap);
176 size = pPixmap->devKind * pPixmap->drawable.height;
177 if (size == cur->size)
180 XDBG_TRACE (MMEM, " Change pixmap(%p) size(%d -> %d)\n",
181 cur->pPixmap, cur->size, size);
183 total_size -= cur->size;
185 cur->hint = _get_pixmap_hint_name (pPixmap->usage_hint);
189 cur = calloc (1, sizeof (XDbgPixmap));
192 cur->pPixmap = pPixmap;
193 cur->size = pPixmap->devKind*pPixmap->drawable.height;
194 cur->hint = _get_pixmap_hint_name (pPixmap->usage_hint);
195 xorg_list_add (&cur->link, &xdbgPixmaps);
198 /* caculate the total_size of pixmaps */
199 total_size += cur->size;
200 if (total_size > peek_size)
201 peek_size = total_size;
203 if (pPixmap->usage_hint == CREATE_PIXMAP_USAGE_FB)
206 XDBG_TRACE (MMEM, "Add pixmap(%p) size:%d, hint:%s\n",
207 cur->pPixmap, cur->size, cur->hint);
211 _removeXDbgPixmap (PixmapPtr pPixmap)
213 XDbgPixmap *cur = NULL;
215 cur = _findXDbgPixmap (pPixmap);
218 XDBG_WARNING (MMEM, "Unknown pixmap XID:0x%x, pPix:%p\n",
219 (unsigned int)pPixmap->drawable.id, pPixmap);
224 XDBG_TRACE (MMEM,"Pixmap(%p) refs:%d\n", cur->pPixmap, cur->refs);
226 /* caculate the total_size of pixmaps */
227 total_size -= cur->size;
229 XDBG_TRACE (MMEM, " Remove pixmap(%p) size:%d, hint:%s\n",
230 cur->pPixmap, cur->size, cur->hint);
232 xorg_list_del(&cur->link);
238 _dumpDraws (char *reply, int *len)
240 XDbgDrawable *cur = NULL, *tmp = NULL;
241 XDbgRefPixmap *p = NULL, *ptmp = NULL;
242 XDbgPixmap *dp = NULL;
244 xorg_list_for_each_entry_safe (cur, tmp, &xdbgDrawables, link)
246 XDBG_REPLY ("[%d] XID:0x%x type:%s %dx%d+%d+%d\n",
247 CLIENT_ID(cur->pDraw->id),
248 (unsigned int)cur->pDraw->id,
249 (cur->pDraw->type == DRAWABLE_WINDOW ? "window":"pixmap"),
250 cur->pDraw->width, cur->pDraw->height, cur->pDraw->x, cur->pDraw->y);
252 xorg_list_for_each_entry_safe (p, ptmp, &cur->refPixmaps, link)
254 dp = _findXDbgPixmap (p->pPixmap);
257 XDBG_REPLY ("\t***[REF_Pixmap] unknown pixmap(%p)\n", p->pPixmap);
261 XDBG_REPLY ("\t[REF_Pixmap] %p, hint:%s, size:%d\n",
262 dp->pPixmap, dp->hint, (unsigned int)dp->size/1024);
268 _dumpPixmaps (char *reply, int *len)
270 XDbgPixmap *cur = NULL, *tmp = NULL;
276 cur = _findXDbgPixmap (pPixRoot);
277 XDBG_RETURN_IF_FAIL (cur != NULL);
278 XDBG_REPLY ("ROOT_Pixmap XID:0x%x pixmap(%p) hint:%s(0x%x) size:%d\n",
279 (unsigned int)cur->pPixmap->drawable.id, pPixRoot,
280 cur->hint, cur->pPixmap->usage_hint,
281 (unsigned int)cur->size/1024);
284 xorg_list_for_each_entry_safe (cur, tmp, &xdbgPixmaps, link)
286 if (cur->pPixmap == pPixRoot)
289 if (cur->pPixmap->drawable.id || cur->refs == 0)
291 client_id = CLIENT_ID(cur->pPixmap->drawable.id);
292 if (cur->pPixmap->drawable.id)
294 XDBG_REPLY ("[%d] XID:0x%x %dx%d hint:%s(0x%x) size:%d refs:%d\n",
295 client_id, (unsigned int)cur->pPixmap->drawable.id,
296 cur->pPixmap->drawable.width, cur->pPixmap->drawable.height,
297 cur->hint, cur->pPixmap->usage_hint,
298 (unsigned int)cur->size/1024, cur->refs);
302 XDBG_REPLY ("[%d] Pixmap:%p %dx%d hint:%s(0x%x) size:%d refs:%d\n",
303 client_id, cur->pPixmap,
304 cur->pPixmap->drawable.width, cur->pPixmap->drawable.height,
305 cur->hint, cur->pPixmap->usage_hint,
306 (unsigned int)cur->size/1024, cur->refs);
311 XDBG_REPLY ("\t[RefHistory] ");
312 for (i = 0; i < cur->numHistory; i++)
314 XDBG_REPLY ("0x%x ", (unsigned int)cur->refHistorys[i]);
323 CreatePixmapProcPtr fnCreatePixmap;
324 DestroyPixmapProcPtr fnDestroyPixmap;
325 ModifyPixmapHeaderProcPtr fnModifyPixmap;
326 SetWindowPixmapProcPtr fnSetWindowPixmap;
327 DestroyWindowProcPtr fnDestroyWindow;
330 XDbgLogCreatePixmap (ScreenPtr pScreen, int width, int height,
331 int depth, unsigned usage_hint)
333 PixmapPtr pPixmap = NULL;
335 pScreen->CreatePixmap = fnCreatePixmap;
336 pPixmap = pScreen->CreatePixmap(pScreen, width, height, depth, usage_hint);
337 pScreen->CreatePixmap = XDbgLogCreatePixmap;
340 _addXDbgPixmap (pPixmap);
346 XDbgLogModifyPixmapHeader (PixmapPtr pPixmap, int width, int height,
347 int depth, int bitsPerPixel, int devKind, pointer pPixData)
350 ScreenPtr pScreen = pPixmap->drawable.pScreen;
352 pScreen->ModifyPixmapHeader = fnModifyPixmap;
353 ret = pScreen->ModifyPixmapHeader (pPixmap, width, height,
354 depth, bitsPerPixel, devKind, pPixData);
355 pScreen->ModifyPixmapHeader = XDbgLogModifyPixmapHeader;
357 _addXDbgPixmap (pPixmap);
363 XDbgLogDestroyPixmap (PixmapPtr pPixmap)
367 ScreenPtr pScreen = pPixmap->drawable.pScreen;
369 if (pPixmap->refcnt == 1)
370 _removeXDbgPixmap (pPixmap);
372 pScreen->DestroyPixmap = fnDestroyPixmap;
373 ret = pScreen->DestroyPixmap(pPixmap);
374 pScreen->DestroyPixmap = XDbgLogDestroyPixmap;
380 XDbgLogSetWindowPixmap (WindowPtr pWin, PixmapPtr pPixmap)
382 ScreenPtr pScreen = (ScreenPtr) pWin->drawable.pScreen;
383 WindowPtr pParent = pWin->parent;
384 XDbgDrawable *d = NULL;
385 XDbgPixmap *p = NULL;
386 XDbgRefPixmap *p_ref = NULL;
388 pScreen->SetWindowPixmap = fnSetWindowPixmap;
389 pScreen->SetWindowPixmap (pWin, pPixmap);
390 pScreen->SetWindowPixmap = XDbgLogSetWindowPixmap;
392 if (pParent && pPixmap != pScreen->GetWindowPixmap(pParent))
395 p = _findXDbgPixmap (pPixmap);
398 XDBG_WARNING (MMEM, "Unknown pixmap(%p) hint:%s\n",
399 pPixmap, _get_pixmap_hint_name(pPixmap->usage_hint));
403 d = _findXDbgDrawable (&pWin->drawable);
406 d = calloc (1, sizeof(XDbgDrawable));
409 XDBG_WARNING (MMEM, "%s:%d: Failed to allocate memory\n",
410 __FUNCTION__, __LINE__);
413 d->pDraw = &pWin->drawable;
414 xorg_list_init (&d->refPixmaps);
415 xorg_list_add (&d->link, &xdbgDrawables);
416 XDBG_TRACE (MMEM, " Add window(0x%x)\n", (unsigned int)pWin->drawable.id);
421 XDBG_TRACE (MMEM, " Unset WinPixmap win(0x%x), pixmap(%p) hint:%s\n",
422 (unsigned int)pWin->drawable.id, p->pPixmap, p->hint);
423 xorg_list_del (&d->pRefPixmap->link);
424 XDbgPixmap * pix = _findXDbgPixmap (d->pRefPixmap->pPixmap);
425 if (pix) pix->refs--;
426 free (d->pRefPixmap);
427 d->pRefPixmap = NULL;
430 p_ref = calloc (1, sizeof(XDbgRefPixmap));
433 XDBG_WARNING (MMEM, "%s:%d: Failed to allocate memory to pixmap\n",
434 __FUNCTION__, __LINE__);
438 p_ref->pPixmap = pPixmap;
439 xorg_list_init (&p_ref->link);
440 xorg_list_add (&p_ref->link, &d->refPixmaps);
441 d->pRefPixmap = p_ref;
444 if (p->numHistory >= MAX_HISTORY)
445 memmove(p->refHistorys, &(p->refHistorys[1]), --(p->numHistory));
446 p->refHistorys[p->numHistory++] = pWin->drawable.id;
448 XDBG_TRACE (MMEM, " Set WinPixmap win(0x%x), pixmap(%p) hint:%s\n",
449 (unsigned int)pWin->drawable.id, p->pPixmap, p->hint);
454 d = _findXDbgDrawable (&pWin->drawable);
457 if (d && d->pRefPixmap)
459 p = _findXDbgPixmap (d->pRefPixmap->pPixmap);
465 XDBG_WARNING (MMEM, "pixmap(%p), refs(%d)\n",
466 __FUNCTION__, __LINE__, p->pPixmap, p->refs);
469 XDBG_TRACE (MMEM,"Unset WinPixmap win(0x%x): pixmap(%p) to NULL\n",
470 (unsigned int)pWin->drawable.id, d->pRefPixmap->pPixmap);
472 p_ref = _findXDbgRefPixmap (d, d->pRefPixmap->pPixmap);
475 xorg_list_del (&d->pRefPixmap->link);
476 free (d->pRefPixmap);
479 XDBG_WARNING (MMEM, "Unknown refpixmap : WinPixmap win(0x%x) pixmap(%p) \n",
480 (unsigned int)pWin->drawable.id, d->pRefPixmap->pPixmap);
482 d->pRefPixmap = NULL;
484 if (xorg_list_is_empty (&d->refPixmaps))
486 xorg_list_del (&d->link);
494 XDbgLogDestroyWindow (WindowPtr pWindow)
497 ScreenPtr pScreen = pWindow->drawable.pScreen;
498 XDbgDrawable *d = NULL;
499 XDbgPixmap *p = NULL;
500 XDbgRefPixmap *pos = NULL, *tmp = NULL;
502 pScreen->DestroyWindow = fnDestroyWindow;
503 ret = pScreen->DestroyWindow (pWindow);
504 pScreen->DestroyWindow = XDbgLogDestroyWindow;
506 d = _findXDbgDrawable (&pWindow->drawable);
509 XDBG_TRACE (MMEM, "Remove drawable(0x%x)\n",
510 (unsigned int)pWindow->drawable.id);
512 xorg_list_for_each_entry_safe (pos, tmp, &d->refPixmaps, link)
514 p = _findXDbgPixmap (pos->pPixmap);
518 XDBG_TRACE (MMEM, "Remove ref_pixmap(%p), dbgPixmap(%p)\n",
521 xorg_list_del (&pos->link);
525 xorg_list_del (&d->link);
533 xDbgLogPListInit (ScreenPtr pScreen)
537 xorg_list_init (&xdbgPixmaps);
538 xorg_list_init (&xdbgDrawables);
540 fnSetWindowPixmap = pScreen->SetWindowPixmap;
541 fnDestroyWindow = pScreen->DestroyWindow;
542 fnCreatePixmap = pScreen->CreatePixmap;
543 fnModifyPixmap = pScreen->ModifyPixmapHeader;
544 fnDestroyPixmap = pScreen->DestroyPixmap;
546 pScreen->CreatePixmap = XDbgLogCreatePixmap;
547 pScreen->DestroyPixmap = XDbgLogDestroyPixmap;
548 pScreen->ModifyPixmapHeader = XDbgLogModifyPixmapHeader;
549 pScreen->SetWindowPixmap = XDbgLogSetWindowPixmap;
550 pScreen->DestroyWindow = XDbgLogDestroyWindow;
554 xDbgLogPListDeinit (ScreenPtr pScreen)
559 xDbgLogPListDrawAddRefPixmap (DrawablePtr pDraw, PixmapPtr pRefPixmap)
561 XDbgDrawable *d = NULL;
562 XDbgPixmap *p = NULL;
563 XDbgRefPixmap *p_ref = NULL;
565 XDBG_RETURN_IF_FAIL (pDraw != NULL);
566 XDBG_RETURN_IF_FAIL (pRefPixmap != NULL);
568 d = _findXDbgDrawable (pDraw);
569 p = _findXDbgPixmap (pRefPixmap);
572 XDBG_WARNING (MMEM, "%s:%d : Unknown pixmap XID:0x%x, pPix:%p\n",
573 __FUNCTION__, __LINE__,
574 (unsigned int)pRefPixmap->drawable.id, pRefPixmap);
580 d = calloc (1, sizeof(XDbgDrawable));
583 XDBG_WARNING (MMEM, "%s:%d: Failed to allocate memory\n",
584 __FUNCTION__, __LINE__);
588 xorg_list_init (&d->refPixmaps);
589 xorg_list_add (&d->link, &xdbgDrawables);
591 XDBG_TRACE (MMEM, " Add window(0x%x)\n", (unsigned int)pDraw->id);
594 p_ref =_findXDbgRefPixmap (d, pRefPixmap);
598 p_ref = calloc (1, sizeof(XDbgRefPixmap));
601 XDBG_WARNING (MMEM, "%s:%d: Failed to allocate memory\n",
602 __FUNCTION__, __LINE__);
605 p_ref->pPixmap = pRefPixmap;
606 xorg_list_init (&p_ref->link);
607 xorg_list_add (&p_ref->link, &d->refPixmaps);
610 if (p->numHistory < (MAX_HISTORY-1))
611 p->refHistorys[p->numHistory++] = pDraw->id;
613 if (pDraw->type == DRAWABLE_WINDOW)
614 XDBG_TRACE (MMEM, " Add RefPixmap win(0x%x), pixmap(%p) hint:%s\n",
615 (unsigned int)pDraw->id, p->pPixmap, p->hint);
617 XDBG_TRACE (MMEM, " Add RefPixmap pix(0x%x), pixmap(%p) hint:%s\n",
618 (unsigned int)pDraw->id, p->pPixmap, p->hint);
622 xDbgLogPListDrawRemoveRefPixmap (DrawablePtr pDraw, PixmapPtr pRefPixmap)
624 XDbgDrawable *d = NULL;
625 XDbgRefPixmap *p_ref = NULL;
626 XDbgPixmap *p = NULL;
628 p = _findXDbgPixmap (pRefPixmap);
631 if (p && p->refs > 0)
633 XDBG_ERROR (MMEM, "Error:%s:%d null draw pixmap(%p)\n",
634 __FUNCTION__, __LINE__, pRefPixmap);
639 d = _findXDbgDrawable (pDraw);
642 XDBG_WARNING (MMEM, "%s:%d : Unknown drawable XID:0x%x, pPix:%p\n",
643 __FUNCTION__, __LINE__, (unsigned int)pDraw->id, pRefPixmap);
647 p_ref = _findXDbgRefPixmap (d, pRefPixmap);
650 XDBG_WARNING (MMEM, "%s:%d : Unknown refpixmap XID:0x%x, pPix:%p\n",
651 __FUNCTION__, __LINE__, (unsigned int)pDraw->id, pRefPixmap);
655 xorg_list_del (&p_ref->link);
660 if (xorg_list_is_empty (&d->refPixmaps))
662 xorg_list_del(&d->link);
666 if (pDraw->type == DRAWABLE_WINDOW)
667 XDBG_TRACE (MMEM, " Remove RefPixmap win(0x%x), pixmap(%p) hint:%s\n",
668 (unsigned int)pDraw->id, pRefPixmap,
669 _get_pixmap_hint_name(pRefPixmap->usage_hint));
671 XDBG_TRACE (MMEM, " Remove RefPixmap pix(0x%x), pixmap(%p) hint:%s\n",
672 (unsigned int)pDraw->id, pRefPixmap,
673 _get_pixmap_hint_name(pRefPixmap->usage_hint));
678 xDbgLogPList (char *reply, int *len)
682 XDBG_REPLY ("plist is not supported.\n");
686 XDBG_REPLY ("\n\n====================================\n");
687 XDBG_REPLY (" Total:%d, Peek:%d\n", (unsigned int)total_size/1024, (unsigned int)peek_size/1024);
688 XDBG_REPLY ( "====================================\n");
690 XDBG_REPLY ("== WINDOWS ==\n");
691 XDbgDrawable *dd = NULL, *ddtmp = NULL;
692 XDbgRefPixmap *rp = NULL, *rptmp = NULL;
693 XDbgPixmap *dp = NULL;
695 xorg_list_for_each_entry_safe (dd, ddtmp, &xdbgDrawables, link)
697 XDBG_REPLY ("[%d] XID:0x%x type:%s %dx%d+%d+%d\n",
698 CLIENT_ID(dd->pDraw->id),
699 (unsigned int)dd->pDraw->id,
700 (dd->pDraw->type == DRAWABLE_WINDOW ? "window":"pixmap"),
701 dd->pDraw->width, dd->pDraw->height, dd->pDraw->x, dd->pDraw->y);
703 xorg_list_for_each_entry_safe (rp, rptmp, &dd->refPixmaps, link)
705 dp = _findXDbgPixmap (rp->pPixmap);
708 XDBG_REPLY ("\t***[REF_Pixmap] unknown pixmap(%p)\n", rp->pPixmap);
712 XDBG_REPLY ("\t[REF_Pixmap] %p, hint:%s, size:%d\n",
713 dp->pPixmap, dp->hint, (unsigned int)dp->size/1024);
719 XDBG_REPLY ( "== PIXMAPS ==\n");
720 XDbgPixmap *cur = NULL, *tmp = NULL;
726 cur = _findXDbgPixmap (pPixRoot);
727 XDBG_RETURN_IF_FAIL (cur != NULL);
728 XDBG_REPLY ("ROOT_Pixmap XID:0x%x pixmap(%p) hint:%s(0x%x) size:%d\n",
729 (unsigned int)cur->pPixmap->drawable.id, pPixRoot,
730 cur->hint, cur->pPixmap->usage_hint,
731 (unsigned int)cur->size/1024);
734 xorg_list_for_each_entry_safe (cur, tmp, &xdbgPixmaps, link)
736 if (cur->pPixmap == pPixRoot)
739 if (cur->pPixmap->drawable.id || cur->refs == 0)
741 client_id = CLIENT_ID(cur->pPixmap->drawable.id);
742 if (cur->pPixmap->drawable.id)
744 XDBG_REPLY ("[%d] XID:0x%x %dx%d hint:%s(0x%x) size:%d refs:%d\n",
745 client_id, (unsigned int)cur->pPixmap->drawable.id,
746 cur->pPixmap->drawable.width, cur->pPixmap->drawable.height,
747 cur->hint, cur->pPixmap->usage_hint,
748 (unsigned int)cur->size/1024, cur->refs);
752 XDBG_REPLY ("[%d] Pixmap:%p %dx%d hint:%s(0x%x) size:%d refs:%d\n",
753 client_id, cur->pPixmap,
754 cur->pPixmap->drawable.width, cur->pPixmap->drawable.height,
755 cur->hint, cur->pPixmap->usage_hint,
756 (unsigned int)cur->size/1024, cur->refs);
761 XDBG_REPLY ("\t[RefHistory] ");
762 for (i = 0; i < cur->numHistory; i++)
764 XDBG_REPLY ("0x%x ", (unsigned int)cur->refHistorys[i]);