Memory leak on thread removal
Marius Nünnerich
marius at nuenneri.ch
Sat May 16 18:24:11 UTC 2009
On Sat, May 16, 2009 at 19:05, Mikolaj Golub <to.my.trociny at gmail.com> wrote:
>
> On Fri, 15 May 2009 13:48:51 +0200 Marius Nünnerich wrote:
>
> MN> On Tue, May 12, 2009 at 08:27, Mikolaj Golub <to.my.trociny at gmail.com> wrote:
> >> Hi,
> >>
> >> The code below is compiled with -fopenmp and run on FreeBSD6/7 (i386, amd64):
> >>
> >> #include <omp.h>
> >> #include <unistd.h>
> >>
> >> int n = 4, m = 2;
> >>
> >> int main () {
> >> for (;;) {
> >> int i;
> >>
> >> //sleep(2);
> >> #pragma omp parallel for num_threads(m)
> >> for(i = 0; i < 1; i++) {}
> >>
> >> //sleep(2);
> >> #pragma omp parallel for num_threads(n)
> >> for(i = 0; i < 1; i++) {}
> >>
> >> }
> >>
> >> return 0;
> >> }
> >>
> >> During the run the program's virtual memory usage constantly grows. The growth
> >> is observed only when n != m. When running the program with uncommented
> >> sleep() and observing the number of threads with 'top -H' I see in turn 2 or 4
> >> threads. So it looks like memory leak when thread is removed. Should I fill
> >> PR?
>
> It looks like I have found the leak. The problem is in libgomp/team.c.
> gomp_thread_start() does sem_init() but sem_destroy() is never called. This
> patch solves the problem for me:
>
> --- contrib/gcclibs/libgomp/team.c.orig 2009-05-16 17:32:57.000000000 +0300
> +++ contrib/gcclibs/libgomp/team.c 2009-05-16 19:16:37.000000000 +0300
> @@ -164,9 +164,12 @@ new_team (unsigned nthreads, struct gomp
> static void
> free_team (struct gomp_team *team)
> {
> + int i;
> free (team->work_shares);
> gomp_mutex_destroy (&team->work_share_lock);
> gomp_barrier_destroy (&team->barrier);
> + for(i = 1; i < team->nthreads; i++)
> + gomp_sem_destroy (team->ordered_release[i]);
> gomp_sem_destroy (&team->master_release);
> free (team);
> }
>
> I am going to fill PR to gcc mainstream, but should I also register this in
> FreeBSD bugtrack as gcc is part of the base?
>
> BTW, the problem is not observed under Linux. I have not looked in Linux code
> but it looks like sem_init() implementation for Linux does not do memory
> allocation. The memory for the test program below grows under FreeBSD and does
> not under Linux.
>
> #include <semaphore.h>
>
> int
> main(int argc, char *argv[]) {
>
> sem_t sem;
>
> for(;;) { sem_init(&sem, 0, 0);}
>
> return 0;
> }
Wow! Thanks for tracking this down. I think you can file both PR's so
that FreeBSD can include your patch before it comes in via upstream.
>
>
> MN> I can confirm this. I briefly looked through the libgomp code but
> MN> didn't see the leak. Anybody knows good tools how to investigate this?
>
> http://freshmeat.net/projects/lmdbg
>
> This is a small memory leak debugger. It does not provide all functionality
> you can find in more sophisticated tools but is lightweight, portable and
> simple in use. It was very useful when I traced this bug.
Thanks, I'll take a look at it.
More information about the freebsd-hackers
mailing list