CodeCodeCode
CodeCodeCode

Reputation: 469

Memory Leak handling while terminating thread in C

I am writing here a C pgm, which creates a thread and process it. To avoid the memory leak by the thread I am using the pthread_cleanup_push and pthread_cleanup_pop function, and calling pthread_exit at last on the thread function. While running the program I get following error.

I believe some memory allocation/ free issue is there. Please help me out, how can I safely terminate the thread with no memory leak. Below is my program :-

struct str_thrd_data
{
        SQLHANDLE hstmt;
        int rc;
        bool thrd_completed_flag;
};

void * str_in_thread_call(void *in_str_arg)
{
        int thrd_rc;
        struct str_thrd_data *str_arg;
        str_arg = in_str_arg;

        pthread_cleanup_push(free, str_arg);
        thrd_rc = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
        if (thrd_rc != 0)
               handle_error_en(thrd_rc, "pthread_setcancelstate");

        thrd_rc = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
        if (thrd_rc != 0)
               handle_error_en(thrd_rc, "pthread_setcancelstate");

        printf("\n*********************Normal Thread termination withing timelimit %d\n",str_arg->rc);
        str_arg->thrd_completed_flag = true;
        sleep(1);
        pthread_cleanup_pop(1);
        pthread_exit(1);
}

int main()
{
        printf("\nPJH: New THread created.\n");
        pthread_attr_t tattr;
        pthread_t th;
        size_t mysize = 1;

        struct str_thrd_data atd;

        atd.hstmt = hstmt;
        atd.rc= rc;
        atd.thrd_completed_flag = false;

        thrd_rc = pthread_attr_init(&tattr);
        thrd_rc = pthread_attr_setstacksize(&tattr, mysize);
        thrd_rc = pthread_create(&th, &tattr, &str_in_thread_call, &atd);
        if (thrd_rc != 0)
               handle_error_en(thrd_rc, "pthread_create");

        while(timeout !=0)
        {
                printf("%d Value of rc=%d\n",timeout, atd.rc);
                if(atd.rc != 999) break;
                timeout--;
                usleep(10000);
        }
        rc = atd.rc;
}

Below is the error message I get, when running the program:-

*** glibc detected *** ./myprocessname: free(): invalid pointer: 0xbc8d9f34 ***  
======= Backtrace: =========  
/lib/libc.so.6[0x5e0c65]  
/lib/libc.so.6(cfree+0x59)[0x5e4c59]  
./dcs[0x80a828a]  
/lib/libpthread.so.0[0x7c4912]  
/lib/libc.so.6(clone+0x5e)[0x64c60e]  
======= Memory map: ========  
00558000-00573000 r-xp 00000000 fd:00 393227                             /lib/ld-2.5.so  
00573000-00574000 r--p 0001a000 fd:00 393227                             /lib/ld-2.5.so  
00574000-00575000 rw-p 0001b000 fd:00 393227                             /lib/ld-2.5.so  
00577000-006ce000 r-xp 00000000 fd:00 393228                             /lib/libc-2.5.so  
006ce000-006d0000 r--p 00156000 fd:00 393228                             /lib/libc-2.5.so  
006d0000-006d1000 rw-p 00158000 fd:00 393228                             /lib/libc-2.5.so  
006d1000-006d4000 rw-p 006d1000 00:00 0  
006d6000-006fd000 r-xp 00000000 fd:00 393234                             /lib/libm-2.5.so  
006fd000-006fe000 r--p 00026000 fd:00 393234                             /lib/libm-2.5.so  
006fe000-006ff000 rw-p 00027000 fd:00 393234                             /lib/libm-2.5.so  
007a1000-007a8000 r-xp 00000000 fd:00 393417                             /lib/librt-2.5.so  
007a8000-007a9000 r--p 00007000 fd:00 393417                             /lib/librt-2.5.so  
007a9000-007aa000 rw-p 00008000 fd:00 393417                             /lib/librt-2.5.so  
007bf000-007d5000 r-xp 00000000 fd:00 393230                             /lib/libpthread-2.5.so  
007d5000-007d6000 r--p 00015000 fd:00 393230                             /lib/libpthread-2.5.so  
007d6000-007d7000 rw-p 00016000 fd:00 393230                             /lib/libpthread-2.5.so  
007d7000-007d9000 rw-p 007d7000 00:00 0  
007db000-007e6000 r-xp 00000000 fd:00 393252                             /lib/libgcc_s-4.1.20080825.so.1  
007e6000-007e7000 rw-p 0000a000 fd:00 393252                             /lib/libgcc_s-4.1.2-20080825.so.1  
007e9000-007ec000 r-xp 00000000 fd:00 393237                             /lib/libdl-2.5.so  
007ec000-007ed000 r--p 00002000 fd:00 393237                             /lib/libdl-2.5.so    
007ed000-007ee000 rw-p 00003000 fd:00 393237                             /lib/libdl-2.5.so  
00acd000-00adf000 r-xp 00000000 fd:00 393296                             /lib/libz.so.1.2.3  
00adf000-00ae0000 rw-p 00011000 fd:00 393296                             /lib/libz.so.1.2.3  
08048000-0810c000 r-xp 00000000 fd:01 1517776                            /home/myprocessname  
0810c000-08185000 rw-p 000c3000 fd:01 1517776                            /home/myprocessname  
08185000-08215000 rw-p 08185000 00:00 0  
0857b000-08aee000 rw-p 0857b000 00:00 0                                  [heap]  
1ffea000-1ffeb000 ---p 1ffea000 00:00 0  
1ffeb000-3f3eb000 rwxp 1ffeb000 00:00 0  
3f3eb000-3f42c000 rw-p 3f3eb000 00:00 0  
3f42c000-3f44c000 rw-s 00000000 00:09 1570996267                         /SYSV00000000 (deleted)  
3f44c000-3f48c000 rw-p 3f44c000 00:00 0  
3f48c000-3f4ac000 rw-s 00000000 00:09 1570963498                         /SYSV00000000 (deleted)  
3f4ac000-3f4cc000 rw-s 00000000 00:09 1570930729                         /SYSV00000000 (deleted)  
3f4cc000-3f58c000 rw-p 3f4cc000 00:00 0  
3f58c000-3f5ac000 rw-s 00000000 00:09 1570897960                         /SYSV00000000 (deleted)  
3f5ac000-3f62c000 rw-p 3f5ac000 00:00 0  
3f62c000-3f64c000 rw-s 00000000 00:09 1570865191                         /SYSV00000000 (deleted)  
3f64c000-3f6cc000 rw-p 3f64c000 00:00 0  
3f6cc000-3f6ec000 rw-s 00000000 00:09 1570832422                         /SYSV00000000 (deleted)  
3f6ec000-3f70c000 rw-s 00000000 00:09 1570799653                         /SYSV00000000 (deleted)  
3f70c000-3f72c000 rw-s 00000000 00:09 1570766884                         /SYSV00000000 (deleted)  
3f72c000-3f8ec000 rw-p 3f72c000 00:00 0  
3f8ec000-3f8ed000 ---p 3f8ec000 00:00 0  
3f8ed000-5eced000 rwxp 3f8ed000 00:00 0  
5eced000-5ecee000 ---p 5eced000 00:00 0  
5ecee000-7e0ee000 rwxp 5ecee000 00:00 0Aborted (core dumped)  

Upvotes: 1

Views: 411

Answers (2)

Some programmer dude
Some programmer dude

Reputation: 409176

You're trying to free memory on the stack for the main function. That will of course not work.

In your pthread_create call you use &atd, this will return a pointer to the atd structure on the stack of the main function. This memory can not, and should not, be freed by you.

Upvotes: 2

Akaks
Akaks

Reputation: 461

One more problem whith above code is thrd_rc = pthread_attr_setstacksize(&tattr, mysize); this mysize should be multiple of system page size otherwise function will fail.

Upvotes: 1

Related Questions