Home | History | Annotate | Line # | Download | only in src
      1 /*
      2  * Copyright  2000 Keith Packard
      3  *
      4  * Permission to use, copy, modify, distribute, and sell this software and its
      5  * documentation for any purpose is hereby granted without fee, provided that
      6  * the above copyright notice appear in all copies and that both that
      7  * copyright notice and this permission notice appear in supporting
      8  * documentation, and that the name of Keith Packard not be used in
      9  * advertising or publicity pertaining to distribution of the software without
     10  * specific, written prior permission.  Keith Packard makes no
     11  * representations about the suitability of this software for any purpose.  It
     12  * is provided "as is" without express or implied warranty.
     13  *
     14  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
     15  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
     16  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
     17  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
     18  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
     19  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
     20  * PERFORMANCE OF THIS SOFTWARE.
     21  */
     22 
     23 #include "xftint.h"
     24 
     25 static Bool _XftConfigInitialized;
     26 
     27 _X_EXPORT Bool
     28 XftInit (_Xconst char *config _X_UNUSED)
     29 {
     30     if (_XftConfigInitialized)
     31 	return True;
     32     _XftConfigInitialized = True;
     33     if (!FcInit ())
     34 	return False;
     35     return True;
     36 }
     37 
     38 _X_EXPORT int
     39 XftGetVersion (void)
     40 {
     41     return XftVersion;
     42 }
     43 
     44 static struct {
     45     const char *name;
     46     int	    alloc_count;
     47     size_t  alloc_mem;
     48     int	    free_count;
     49     size_t  free_mem;
     50 } XftInUse[XFT_MEM_NUM] = {
     51     { "XftDraw",   0, 0, 0, 0 },	/* XFT_MEM_DRAW */
     52     { "XftFont",   0, 0, 0, 0 },	/* XFT_MEM_FONT */
     53     { "XftFtFile", 0, 0, 0, 0 },	/* XFT_MEM_FILE */
     54     { "XftGlyph",  0, 0, 0, 0 },	/* XFT_MEM_GLYPH */
     55 };
     56 
     57 static int  XftAllocCount;
     58 static size_t XftAllocMem;
     59 
     60 static int  XftFreeCount;
     61 static size_t XftFreeMem;
     62 
     63 static const size_t  XftMemNotice = 1*1024*1024;
     64 
     65 static size_t  XftAllocNotify, XftFreeNotify;
     66 
     67 _X_HIDDEN void
     68 XftMemReport (void)
     69 {
     70     int	i;
     71     printf ("Xft Memory Usage:\n");
     72     printf ("\t    Which       Alloc           Free\n");
     73     printf ("\t            count   bytes   count   bytes\n");
     74     for (i = 0; i < XFT_MEM_NUM; i++)
     75 	printf ("\t%9.9s%8d%8lu%8d%8lu\n",
     76 		XftInUse[i].name,
     77 		XftInUse[i].alloc_count, (unsigned long) XftInUse[i].alloc_mem,
     78 		XftInUse[i].free_count, (unsigned long) XftInUse[i].free_mem);
     79     printf ("\t%9.9s%8d%8lu%8d%8lu\n",
     80 	    "Total",
     81 	    XftAllocCount, (unsigned long) XftAllocMem,
     82 	    XftFreeCount, (unsigned long) XftFreeMem);
     83     XftAllocNotify = 0;
     84     XftFreeNotify = 0;
     85 }
     86 
     87 _X_HIDDEN void
     88 XftMemAlloc (int kind, size_t size)
     89 {
     90     if (XftDebug() & XFT_DBG_MEMORY)
     91     {
     92 	XftInUse[kind].alloc_count++;
     93 	XftInUse[kind].alloc_mem += size;
     94 	XftAllocCount++;
     95 	XftAllocMem += size;
     96 	XftAllocNotify += size;
     97 	if (XftAllocNotify > XftMemNotice)
     98 	    XftMemReport ();
     99     }
    100 }
    101 
    102 _X_HIDDEN void
    103 XftMemFree (int kind, size_t size)
    104 {
    105     if (XftDebug() & XFT_DBG_MEMORY)
    106     {
    107 	XftInUse[kind].free_count++;
    108 	XftInUse[kind].free_mem += size;
    109 	XftFreeCount++;
    110 	XftFreeMem += size;
    111 	XftFreeNotify += size;
    112 	if (XftFreeNotify > XftMemNotice)
    113 	    XftMemReport ();
    114     }
    115 }
    116