Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 824763
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 15, 20262026-05-15T03:08:55+00:00 2026-05-15T03:08:55+00:00

1: /* 2: * File: xyn-playlist.c 3: * Author: Andrei Ciobanu 4: * 5:

  • 0
   1:  /*
   2:   * File:   xyn-playlist.c
   3:   * Author: Andrei Ciobanu
   4:   *
   5:   * Created on June 4, 2010, 12:47 PM
   6:   */
   7:   
   8:  #include <dirent.h>
   9:  #include <glib.h>
  10:  #include <stdio.h>
  11:  #include <stdlib.h>
  12:  #include <sys/stat.h>
  13:  #include <unistd.h>
  14:   
  15:  /**
  16:   * Returns a list all the file(paths) from a directory.
  17:   * Returns 'NULL' if a certain error occurs.
  18:   * @param dir_path.
  19:   * @param A list of gchars* indicating what file patterns to detect.
  20:   */
  21:  GSList *xyn_pl_get_files(const gchar *dir_path, GSList *file_patterns) {
  22:      /* Returning list containing file paths */
  23:      GSList *fpaths = NULL;
  24:      /* Used to scan directories for subdirs. Acts like a
  25:       * stack, to avoid recursion. */
  26:      GSList *dirs = NULL;
  27:      /* Current dir */
  28:      DIR *cdir = NULL;
  29:      /* Current dir entries */
  30:      struct dirent *cent = NULL;
  31:      /* File stats */
  32:      struct stat cent_stat;
  33:      /* dir_path duplicate, on the heap */
  34:      gchar *dir_pdup;
  35:   
  36:      if (dir_path == NULL) {
  37:          return NULL;
  38:      }
  39:   
  40:      dir_pdup = g_strdup((const gchar*) dir_path);
  41:      dirs = g_slist_append(dirs, (gpointer) dir_pdup);
  42:      while (dirs != NULL) {
  43:          cdir = opendir((const gchar*) dirs->data);
  44:          if (cdir == NULL) {
  45:              g_slist_free(dirs);
  46:              g_slist_free(fpaths);
  47:              return NULL;
  48:          }
  49:          chdir((const gchar*) dirs->data);
  50:          while ((cent = readdir(cdir)) != NULL) {
  51:              lstat(cent->d_name, &cent_stat);
  52:              if (S_ISDIR(cent_stat.st_mode)) {
  53:                  if (g_strcmp0(cent->d_name, ".") == 0 ||
  54:                          g_strcmp0(cent->d_name, "..") == 0) {
  55:                      /* Skip "." and ".." dirs */
  56:                      continue;
  57:                  }
  58:                  dirs = g_slist_append(dirs,
  59:                          g_strconcat((gchar*) dirs->data, "/", cent->d_name, NULL));
  60:              } else {
  61:                  fpaths = g_slist_append(fpaths,
  62:                          g_strconcat((gchar*) dirs->data, "/", cent->d_name, NULL));
  63:              }
  64:          }
  65:          g_free(dirs->data);
  66:          dirs = g_slist_delete_link(dirs, dirs);
  67:          closedir(cdir);
  68:      }
  69:      return fpaths;
  70:  }
  71:   
  72:  int main(int argc, char** argv) {
  73:      GSList *l = NULL;
  74:      l = xyn_pl_get_files("/home/andrei/Music", NULL);
  75:      g_slist_foreach(l,(GFunc)printf,NULL);
  76:      printf("%d\n",g_slist_length(l));
  77:      g_slist_free(l);
  78:      return (0);
  79:  }
  80:   
  81:   
  82:  -----------------------------------------------------------------------------------------------==15429== 
  83:  ==15429== HEAP SUMMARY:
  84:  ==15429==     in use at exit: 751,451 bytes in 7,263 blocks
  85:  ==15429==   total heap usage: 8,611 allocs, 1,348 frees, 22,898,217 bytes allocated
  86:  ==15429== 
  87:  ==15429== 120 bytes in 1 blocks are possibly lost in loss record 1 of 11
  88:  ==15429==    at 0x4024106: memalign (vg_replace_malloc.c:581)
  89:  ==15429==    by 0x4024163: posix_memalign (vg_replace_malloc.c:709)
  90:  ==15429==    by 0x40969C1: ??? (in /lib/libglib-2.0.so.0.2400.1)
  91:  ==15429==    by 0x40971F6: g_slice_alloc (in /lib/libglib-2.0.so.0.2400.1)
  92:  ==15429==    by 0x40988A5: g_slist_append (in /lib/libglib-2.0.so.0.2400.1)
  93:  ==15429==    by 0x80488F0: xyn_pl_get_files (xyn-playlist.c:41)
  94:  ==15429==    by 0x8048848: main (main.c:18)
  95:  ==15429== 
  96:  ==15429== 129 bytes in 1 blocks are possibly lost in loss record 2 of 11
  97:  ==15429==    at 0x4024F20: malloc (vg_replace_malloc.c:236)
  98:  ==15429==    by 0x4081243: g_malloc (in /lib/libglib-2.0.so.0.2400.1)
  99:  ==15429==    by 0x409B85B: g_strconcat (in /lib/libglib-2.0.so.0.2400.1)
 100:  ==15429==    by 0x80489FE: xyn_pl_get_files (xyn-playlist.c:62)
 101:  ==15429==    by 0x8048848: main (main.c:18)
 102:  ==15429== 
 103:  ==15429== 360 bytes in 3 blocks are possibly lost in loss record 3 of 11
 104:  ==15429==    at 0x4024106: memalign (vg_replace_malloc.c:581)
 105:  ==15429==    by 0x4024163: posix_memalign (vg_replace_malloc.c:709)
 106:  ==15429==    by 0x40969C1: ??? (in /lib/libglib-2.0.so.0.2400.1)
 107:  ==15429==    by 0x4097222: g_slice_alloc (in /lib/libglib-2.0.so.0.2400.1)
 108:  ==15429==    by 0x40988A5: g_slist_append (in /lib/libglib-2.0.so.0.2400.1)
 109:  ==15429==    by 0x80488F0: xyn_pl_get_files (xyn-playlist.c:41)
 110:  ==15429==    by 0x8048848: main (main.c:18)
 111:  ==15429== 
 112:  ==15429== 508 bytes in 1 blocks are still reachable in loss record 4 of 11
 113:  ==15429==    at 0x402425F: calloc (vg_replace_malloc.c:467)
 114:  ==15429==    by 0x408113B: g_malloc0 (in /lib/libglib-2.0.so.0.2400.1)
 115:  ==15429==    by 0x409624D: ??? (in /lib/libglib-2.0.so.0.2400.1)
 116:  ==15429==    by 0x409710C: g_slice_alloc (in /lib/libglib-2.0.so.0.2400.1)
 117:  ==15429==    by 0x40988A5: g_slist_append (in /lib/libglib-2.0.so.0.2400.1)
 118:  ==15429==    by 0x80488F0: xyn_pl_get_files (xyn-playlist.c:41)
 119:  ==15429==    by 0x8048848: main (main.c:18)
 120:  ==15429== 
 121:  ==15429== 508 bytes in 1 blocks are still reachable in loss record 5 of 11
 122:  ==15429==    at 0x402425F: calloc (vg_replace_malloc.c:467)
 123:  ==15429==    by 0x408113B: g_malloc0 (in /lib/libglib-2.0.so.0.2400.1)
 124:  ==15429==    by 0x409626F: ??? (in /lib/libglib-2.0.so.0.2400.1)
 125:  ==15429==    by 0x409710C: g_slice_alloc (in /lib/libglib-2.0.so.0.2400.1)
 126:  ==15429==    by 0x40988A5: g_slist_append (in /lib/libglib-2.0.so.0.2400.1)
 127:  ==15429==    by 0x80488F0: xyn_pl_get_files (xyn-playlist.c:41)
 128:  ==15429==    by 0x8048848: main (main.c:18)
 129:  ==15429== 
 130:  ==15429== 508 bytes in 1 blocks are still reachable in loss record 6 of 11
 131:  ==15429==    at 0x402425F: calloc (vg_replace_malloc.c:467)
 132:  ==15429==    by 0x408113B: g_malloc0 (in /lib/libglib-2.0.so.0.2400.1)
 133:  ==15429==    by 0x4096291: ??? (in /lib/libglib-2.0.so.0.2400.1)
 134:  ==15429==    by 0x409710C: g_slice_alloc (in /lib/libglib-2.0.so.0.2400.1)
 135:  ==15429==    by 0x40988A5: g_slist_append (in /lib/libglib-2.0.so.0.2400.1)
 136:  ==15429==    by 0x80488F0: xyn_pl_get_files (xyn-playlist.c:41)
 137:  ==15429==    by 0x8048848: main (main.c:18)
 138:  ==15429== 
 139:  ==15429== 1,200 bytes in 10 blocks are possibly lost in loss record 7 of 11
 140:  ==15429==    at 0x4024106: memalign (vg_replace_malloc.c:581)
 141:  ==15429==    by 0x4024163: posix_memalign (vg_replace_malloc.c:709)
 142:  ==15429==    by 0x40969C1: ??? (in /lib/libglib-2.0.so.0.2400.1)
 143:  ==15429==    by 0x40971F6: g_slice_alloc (in /lib/libglib-2.0.so.0.2400.1)
 144:  ==15429==    by 0x40988A5: g_slist_append (in /lib/libglib-2.0.so.0.2400.1)
 145:  ==15429==    by 0x8048A0D: xyn_pl_get_files (xyn-playlist.c:61)
 146:  ==15429==    by 0x8048848: main (main.c:18)
 147:  ==15429== 
 148:  ==15429== 2,040 bytes in 1 blocks are still reachable in loss record 8 of 11
 149:  ==15429==    at 0x402425F: calloc (vg_replace_malloc.c:467)
 150:  ==15429==    by 0x408113B: g_malloc0 (in /lib/libglib-2.0.so.0.2400.1)
 151:  ==15429==    by 0x40970AB: g_slice_alloc (in /lib/libglib-2.0.so.0.2400.1)
 152:  ==15429==    by 0x40988A5: g_slist_append (in /lib/libglib-2.0.so.0.2400.1)
 153:  ==15429==    by 0x80488F0: xyn_pl_get_files (xyn-playlist.c:41)
 154:  ==15429==    by 0x8048848: main (main.c:18)
 155:  ==15429== 
 156:  ==15429== 4,320 bytes in 36 blocks are possibly lost in loss record 9 of 11
 157:  ==15429==    at 0x4024106: memalign (vg_replace_malloc.c:581)
 158:  ==15429==    by 0x4024163: posix_memalign (vg_replace_malloc.c:709)
 159:  ==15429==    by 0x40969C1: ??? (in /lib/libglib-2.0.so.0.2400.1)
 160:  ==15429==    by 0x4097222: g_slice_alloc (in /lib/libglib-2.0.so.0.2400.1)
 161:  ==15429==    by 0x40988A5: g_slist_append (in /lib/libglib-2.0.so.0.2400.1)
 162:  ==15429==    by 0x80489D2: xyn_pl_get_files (xyn-playlist.c:58)
 163:  ==15429==    by 0x8048848: main (main.c:18)
 164:  ==15429== 
 165:  ==15429== 56,640 bytes in 472 blocks are possibly lost in loss record 10 of 11
 166:  ==15429==    at 0x4024106: memalign (vg_replace_malloc.c:581)
 167:  ==15429==    by 0x4024163: posix_memalign (vg_replace_malloc.c:709)
 168:  ==15429==    by 0x40969C1: ??? (in /lib/libglib-2.0.so.0.2400.1)
 169:  ==15429==    by 0x4097222: g_slice_alloc (in /lib/libglib-2.0.so.0.2400.1)
 170:  ==15429==    by 0x40988A5: g_slist_append (in /lib/libglib-2.0.so.0.2400.1)
 171:  ==15429==    by 0x8048A0D: xyn_pl_get_files (xyn-playlist.c:61)
 172:  ==15429==    by 0x8048848: main (main.c:18)
 173:  ==15429== 
 174:  ==15429== 685,118 bytes in 6,736 blocks are definitely lost in loss record 11 of 11
 175:  ==15429==    at 0x4024F20: malloc (vg_replace_malloc.c:236)
 176:  ==15429==    by 0x4081243: g_malloc (in /lib/libglib-2.0.so.0.2400.1)
 177:  ==15429==    by 0x409B85B: g_strconcat (in /lib/libglib-2.0.so.0.2400.1)
 178:  ==15429==    by 0x80489FE: xyn_pl_get_files (xyn-playlist.c:62)
 179:  ==15429==    by 0x8048848: main (main.c:18)
 180:  ==15429== 
 181:  ==15429== LEAK SUMMARY:
 182:  ==15429==    definitely lost: 685,118 bytes in 6,736 blocks
 183:  ==15429==    indirectly lost: 0 bytes in 0 blocks
 184:  ==15429==      possibly lost: 62,769 bytes in 523 blocks
 185:  ==15429==    still reachable: 3,564 bytes in 4 blocks
 186:  ==15429==         suppressed: 0 bytes in 0 blocks
 187:  ==15429== 
 188:  ==15429== For counts of detected and suppressed errors, rerun with: -v
 189:  ==15429== ERROR SUMMARY: 7 errors from 7 contexts (suppressed: 17 from 8)
 190:  ----------------------------------------------------------------------------------------------

I am using the above code in order to create a list with all the filepaths in a certain directory. (In my case fts.h or ftw.h are not an option).

I am using GLib as the data structures library. Still I have my doubts in regarding the way GLib is allocating, de-allocating memory ?

When invoking g_slist_free(list) i also free the data contained by the elements ?
Why all those memory leaks appear ?
Is valgrind a suitable tool for profilinf memory issues when using a complex library like GLib ?

LATER EDIT:

If I g_slist_foreach(l,(GFunc)g_free,NULL);, the valgrind report is different, (All the memory leaks from ‘definitely lost’ will move to ‘indirectly lost’). Still I don’t see the point ? Aren’t GLib collections implement a way to be freed ?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-15T03:08:56+00:00Added an answer on May 15, 2026 at 3:08 am

    No, g_slist_free does not free data you store in the list (e.g. strings). It has no way of knowing whether and how you want to free this data. You might store the same pointer in multiple lists. Also, you can store non-pointer types in the list, or types that aren’t allocated with malloc. The collection doesn’t let you provide a destructor function. So you do need to loop through and free your data before freeing the list.

    Also, g_slist can use memory pools, so valgrind may not always give correct results.

    Other types, such as GPtrArray, let you provide a destructor (GDestroyNotify) for element data.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

File formats I would like to play include .wav, .mp3, .midi. I have tried
// File test.cpp #include <my_global.h> #include <algorithm> int main() { return 0; } Compiled
File is sent to the client using Response.writefile and content diposition as inline. When
In file Atomic.aiml, part of the annotated ALICE AIML files , there are a
Good file comparison tools were already discussed to the pain, but my problem is
The .XFDL file extension identifies XFDL Formatted Document files. These belong to the XML-based
How can I check file permissions , without having to run operating system specific
I have an actionscript file that defines a class that I would like to
I think the file that is produced is an .asm file, any idea how
Given a (source) patch file, what's the easiest way to apply this patch on

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.