0

I have a user level thread library and I changed a benchmark program to use mythreads instead of pthreads, but it always gets stuck somewhere in the code where there is a malloc or free function.

this is output of gdb:

^C
Program received signal SIGINT, Interrupt.
__lll_lock_wait_private ()
    at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
95  ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory.
(gdb) where
#0  __lll_lock_wait_private ()
    at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
#1  0x00007ffff7569bb3 in _int_free (av=0x7ffff78adc00 <main_arena>, 
    p=0x6f1f40, have_lock=0) at malloc.c:3929
#2  0x00007ffff756d89c in __GI___libc_free (mem=<optimized out>)
    at malloc.c:2950
#3  0x000000000040812d in mbuffer_free (m=m@entry=0x6a7660) at mbuffer.c:209
#4  0x00000000004038a8 in write_chunk_to_file (chunk=0x6a7610, 
    fd=<optimized out>) at encoder.c:279
#5  Reorder (targs=0x7fffffffab60, 
    targs@entry=<error reading variable: value has been optimized out>)
    at encoder.c:1292
#6  0x000000000040b069 in wrapper_function (func=<optimized out>, 
    arg=<optimized out>) at gtthread.c:75
#7  0x00007ffff7532620 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#8  0x0000000000000000 in ?? ()
(gdb) 

and here is some code

mbuffer.c
208    if(ref==0) {
209        pausee();
210        free(m->mcb->ptr);
211        resume();
212        m->mcb->ptr=NULL;
213        free(m->mcb);
214        m->mcb=NULL;
215    }

pausee and resume functions

void pausee(){
    //printf("pauseeing\n");
    sigemptyset(&mask);
    sigaddset(&mask, SIGPROF);   // block SIGPROF...
    if (sigprocmask(SIG_BLOCK, &mask, &orig_mask) < 0) {
        perror ("sigprocmask");
        exit(1);
    }
}
void resume(){
    //printf("restarting\n");
    sigemptyset(&mask);
    sigaddset(&mask, SIGPROF);   // unblock SIGPROF...
    if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0) {
        perror ("sigprocmask");
        exit(1);
    }
}

I'm not sure if it's related to my problem or not, but for scheduling of the threads I use SIGPROF signal and a handler function. I tried blocking SIGPROF before every malloc/free function but It had no effect.

I don't have any concurrent threads, only one thread runs at a time.

any help or idea would be very much appreciated.

zmeftah
  • 148
  • 1
  • 2
  • 10
  • And your corresponding code looks like? – bish Jul 26 '15 at 06:21
  • code for which part exactly? I inserted some code of the place where it gets stuck, It could be anywhere where there is a malloc/free code. @bish – zmeftah Jul 26 '15 at 07:26
  • Do you use `clone`? See [http://stackoverflow.com/questions/13736088/why-realloc-deadlock-after-clone-syscall/13736412#13736412](http://stackoverflow.com/questions/13736088/why-realloc-deadlock-after-clone-syscall/13736412#13736412) – 4566976 Jul 26 '15 at 08:55
  • no I don't use clone anywhere @4566976 – zmeftah Jul 26 '15 at 09:29

1 Answers1

0

as your code mbuffer.c, there is no mistake.I suggest you get a test of mbuffer.c for except your guess.

Liyuan Liu
  • 172
  • 2
  • this benchmark program works fine with pthreads. but when I use my own ULT library it might get stuck on any of the malloc/free functions in the code, not just mbuffer.c but also other files and functions. – zmeftah Jul 26 '15 at 10:11