mailing list of musl libc
 help / color / mirror / code / Atom feed
* [RFC] malloc + threads = memleak?
@ 2018-02-09 14:33 Roman Yeryomin
  2018-02-09 15:00 ` Rich Felker
  0 siblings, 1 reply; 2+ messages in thread
From: Roman Yeryomin @ 2018-02-09 14:33 UTC (permalink / raw)
  To: musl

[-- Attachment #1: Type: text/plain, Size: 377 bytes --]

Hello!

I have a very easy reproducible memory leak here when using
malloc/free in two threads.
Attaching a simple test.
thread() here is calling pthread_create():
https://github.com/yeryomin/liba/blob/master/liba.c#L181

Do I misunderstand something or is it a bug?
This can be avoided by wrapping malloc into locks but not sure if
that's the fix you want...


Regards,
Roman

[-- Attachment #2: musl-test.c --]
[-- Type: text/x-csrc, Size: 1426 bytes --]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>

#include <liba.h>

#define PIDPATH		"/tmp"
#define NAME		argv[0]
#define TIMER		30

#define SIZE		10000

int timer = TIMER;
int counter = 0;

void thread42( int *thr )
{
	int i;
	void* allocs[SIZE];

	while (1) {
		for ( i = 0; i < SIZE; i++ )
			allocs[i] = malloc(1500);
		
		syslog( LOG_INFO, "%i: %ld\n", *thr, time(NULL) );

		for ( i = 0; i < SIZE; i++ )
			free(allocs[i]);
	}
}

void reset_timer( int sig )
{
	/* temporarily ingnore interrupts */
	signal( sig, SIG_IGN );
	counter++;
	syslog( LOG_INFO, "%i HUP received, resetting timer (was %i)...",
				counter, timer );
	timer = TIMER;
	/* reenable interrupt */
	a_signal( sig, reset_timer );
}

int main( int argc, char **argv )
{
	int pid = daemonize( PIDPATH, NAME );
	int thr1 = 1;
	int thr2 = 2;

	/* register sighup handler for daemon */
	a_signal( SIGHUP, reset_timer );

	/* start two malloc threads */
	thread( "thread42-1", &thread42, &thr1 );
	thread( "thread42-2", &thread42, &thr2 );

	/* daemon stuff */
	syslog( LOG_INFO, "Working hard..." );
	while ( timer > 0 ) {
		sleep(1);
		timer--;
		if ( timer < 5 )
			syslog( LOG_INFO, "Dying in %i...", timer + 1 );
	}

	/* cleanup, if ever get here */
	syslog( LOG_INFO, "Exiting %s (%i)...", a_daemon_name, pid );
	unlink( a_daemon_pidfile );
	exit(EXIT_SUCCESS);
}

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [RFC] malloc + threads = memleak?
  2018-02-09 14:33 [RFC] malloc + threads = memleak? Roman Yeryomin
@ 2018-02-09 15:00 ` Rich Felker
  0 siblings, 0 replies; 2+ messages in thread
From: Rich Felker @ 2018-02-09 15:00 UTC (permalink / raw)
  To: musl

On Fri, Feb 09, 2018 at 04:33:38PM +0200, Roman Yeryomin wrote:
> Hello!
> 
> I have a very easy reproducible memory leak here when using
> malloc/free in two threads.
> Attaching a simple test.
> thread() here is calling pthread_create():
> https://github.com/yeryomin/liba/blob/master/liba.c#L181
> 
> Do I misunderstand something or is it a bug?
> This can be avoided by wrapping malloc into locks but not sure if
> that's the fix you want...

I haven't looked at this in detail yet, but I suspect this is a known
issue that I thought was hard to hit, and that you've just found a
reliable way to reproduce. I'll investigate more in a bit. I think it
may turn out to be impossible to fix without either making malloc
noticably slower or overhauling the whole malloc implementation (which
is planned but I'm not ready to do yet).

Thanks for the report; this looks like it will be useful even if
disappointing.

Rich


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-02-09 15:00 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-02-09 14:33 [RFC] malloc + threads = memleak? Roman Yeryomin
2018-02-09 15:00 ` Rich Felker

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).