malloc(): error: recursive call

Petri Helenius pete at he.iki.fi
Wed May 28 00:25:03 PDT 2003


Alright, here goes:
(it's ugly cut&paste with inadequate includes and stuff but fails as 
expected)
Uncomment the "extra" mutexes and it runs fine.

Complied with:
gcc  -g -O2 -march=pentium   -D_REENTRANT -D_THREAD_SAFE -Wall -Wshadow 
-Wpointer-arith -Wcast-align -Wwrite-strings -Wconversion 
-Waggregate-return -Wstrict-prototypes -Wno-format  -pedantic 
-Wno-long-long -c ttest.c
gcc -static  -g -O2 -march=pentium   -D_REENTRANT -D_THREAD_SAFE -Wall 
-Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wconversion 
-Waggregate-return -Wstrict-prototypes -Wno-format  -pedantic 
-Wno-long-long ttest.o -o ttest   -lkse

libs: # ls -l /usr/lib/libkse*
-r--r--r--  1 root  wheel  229156 May 24 14:57 /usr/lib/libkse.a
lrwxr-xr-x  1 root  wheel      11 May 24 14:57 /usr/lib/libkse.so -> 
libkse.so.1
-r--r--r--  1 root  wheel  121048 May 24 14:57 /usr/lib/libkse.so.1
-r--r--r--  1 root  wheel  243042 May 24 14:57 /usr/lib/libkse_p.a

kernel:
FreeBSD kompak.vuokselantie10.fi 5.1-BETA FreeBSD 5.1-BETA #7: Sat May 
24 10:49:11 GMT 2003     
root at kompak.vuokselantie10.fi:/usr/src/sys/i386/compile/EMTEST  i386

# ./ttest
free spin
free spin
free spin
free spin
free spin
free spin
free spin
free spin
free spin
free spin
free spin
alloc spin
free spin
ttest in free(): error: recursive call
Abort (core dumped)

and the code:
(has more stuff than it needs because it has some debugging  built in)
 

#include <stdio.h>
#include <pthread.h>

#define SLOTS 100000


void rommon_mutex_lock (pthread_mutex_t *mutex, int line)
{
  int retvalue;
  int lastline;

  while (retvalue = pthread_mutex_lock (mutex))
    {
      printf ("%d locking %lx failed, line %d 
(holder:%d)\n",getpid(),mutex,line,lastline);
      usleep (100000);
    }
}

static pthread_mutex_t foom;
static char *foo[SLOTS];

live_poll_sharedmem()
{
  while (1)
    {
      int i;
      printf ("alloc spin\n");
      for ( i = 0 ; i < SLOTS; i++)
        {
/*          rommon_mutex_lock (&foom,__LINE__);*/
          if (!foo[i])
            {
              asprintf (&foo[i],"slot %d",i);
            }
/*          pthread_mutex_unlock (&foom);*/
        }
    }
}

main()
{
  static pthread_t smem_thread;
pthread_mutexattr_t attr;
  int i;

  pthread_mutexattr_init (&attr);
  pthread_mutexattr_settype (&attr,PTHREAD_MUTEX_ERRORCHECK);

  pthread_mutex_init (&foom,&attr);
  pthread_create (&smem_thread,NULL,&live_poll_sharedmem,0);

  while (1)
    {
      printf ("free spin\n");
  for ( i = 0; i < 100000; i++)
    {
/*      rommon_mutex_lock (&foom,__LINE__);*/
      if (foo[i])
        {
          free (foo[i]);
          foo[i] = NULL;
        }
/*      pthread_mutex_unlock (&foom);*/
    }
    }
}


Daniel Eischen wrote:

>On Wed, 28 May 2003, Petri Helenius wrote:
>
>  
>
>>>And what does `ldd libnetsnmp.so.x`, `ldd libfoo.y`, show?
>>>      
>>>
>>They give empty replies.
>>
>>    
>>
>>>What is `ldd yourexecutable` show?
>>>      
>>>
>>It?s usually linked static but if I remove the -static line it says:
>>       libnetsnmp.so.5 => /usr/local/lib/libnetsnmp.so.5 (0x2807f000)
>>        libcrypto.so.3 => /usr/lib/libcrypto.so.3 (0x280fe000)
>>        libpcap.so.2 => /usr/lib/libpcap.so.2 (0x28209000)
>>        libkse.so.1 => /usr/lib/libkse.so.1 (0x28225000)
>>        libc.so.5 => /usr/lib/libc.so.5 (0x28246000)
>>
>>    
>>
>>>malloc is thread safe and we've been using it fine
>>>with all our tests.  I suspect you're using another
>>>library that is using libc_r or something.
>>>      
>>>
>>malloc works for me with for example linuxthreads. So I do believe that
>>the the trigger for malloc locking works, however looking at the code,
>>spinlocks are implemented differently depending on which thread library is
>>linked in.
>>    
>>
>
>Also, you do need a relatively recent kernel.  There are
>a couple of flags in each thread's mailbox that the
>kernel needs to recognize.  This change was committed
>to the kernel around April 21, 2003
>
>  
>




More information about the freebsd-threads mailing list