POSIX Thread - Memory leak


 
Thread Tools Search this Thread
Top Forums Programming POSIX Thread - Memory leak
# 1  
Old 05-02-2008
POSIX Thread - Memory leak

Hi all!

I am implementing an http server in c++ using the posix thread, but i am having a memory leak and i cannot find the reason.

I have already commented out the section that initializes the threads and i found out, the problem is when i initialize/run the threads.

In the threads i have already checked for every possible point to free the memory, but even inserting delete xxxx didnt work....

I am closing the socket, deleting its reference when not needed anymore, deleting every variable i am using to handle the data.... and so on...

Here is:

My main calls the pthread_create and passes as argument a pointer to a pthread_t. The main is responsible for this variable (creation and deleting).
Inside the thread i cast the argument (void*) to a (pthread_t *), i am using also two mutex (as global variables), accepting a connection (socket server), receiving data and responding, closing the connection.
The socket variable i am using as a pointer, cause i can delete after using it. Therefore, the leak is not related to the socket, i think...

But despite doing all of this when running the http server each new connection adds 8kb of memory to the used memory...
Each connection means a new thread....

I cannot find the bug, can anyone please help me?

Thanks in advance!

The code is down here:


Code:
#include <iostream>
#include "ServerSocket.h"
#include "SocketException.h"
#include <string>
#include <pthread.h>
#define MAX_CONNECTIONS 5
#define DEBUG

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; //to keep one thread for each connection
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER; //to change the variable nThreads
int nThreads = 0;

using namespace std;

// Create the socket
ServerSocket server ( 8080 );
/*
//-------creating
  m_sock = socket ( AF_INET,
		    SOCK_STREAM,
		    0 );

  if ( ! (m_sock != -1) )
    return false;

  // TIME_WAIT - argh
  int on = 1;
  if ( setsockopt ( m_sock, SOL_SOCKET, SO_REUSEADDR, ( const char* ) &on, sizeof ( on ) ) == -1 )
    throw SocketException ( "Could not create server socket." );
//--------end creating

//--------start binding
  m_addr.sin_family = AF_INET;
  m_addr.sin_addr.s_addr = INADDR_ANY;
  m_addr.sin_port = htons ( port );

  int bind_return = ::bind ( m_sock,
			     ( struct sockaddr * ) &m_addr,
			     sizeof ( m_addr ) );

  if ( bind_return == -1 )
    {
      throw SocketException ( "Could not bind to port." );
    }

//--------end binding
//--------start listening
int listen_return = ::listen ( m_sock, MAXCONNECTIONS );

  if ( listen_return == -1 )
    {
      throw SocketException ( "Could not listen to socket." );
    }
//--------end binding
*/

enum thread_status
{
	INIT = 0
	,RUNNING
	,FINISHED
};

struct threads
{
	pthread_t	*thread;
	thread_status	status;
	int		id;
};

void *listen( void * ptr )
{
	threads *stThread = (threads*) ptr; //casting
	stThread->status = RUNNING; //changing status
	//creating new socket
	ServerSocket *new_sock = new ServerSocket();
	/*
	//do nothing
	ServerSocket(){};
	*/
	try
	{
		pthread_mutex_lock( &mutex1 );	
		server.accept ( *new_sock );
		/*
		int addr_length = sizeof ( m_addr );
		new_socket.m_sock = ::accept ( m_sock, ( sockaddr * ) &m_addr, ( socklen_t * ) &addr_length );
		*/
		pthread_mutex_unlock( &mutex1 );
		try
		{
			std::string data;
			(*new_sock) >> data; //receive data
			data = "<html><body>The content of the body element is displayed in your browser.<img src=\"http://www.google.com.br/intl/en/images/about_logo.gif\">thread</body></html>";
			(*new_sock) << data;//send data
			new_sock->close(); //closing socket
			/*
			::close ( m_sock );
			*/
		}
		catch ( SocketException& ex )
		{
			cout << strThread << "Exception was caught:" << ex.description() << "\nExiting.\n" << endl;
		}
	}
	catch ( SocketException& e )
	{
		cout << strThread << "Exception was caught:" << e.description() << "\nExiting.\n" << endl;
	}
	pthread_mutex_lock( &mutex2 );
	if( nThreads > 0 )
		nThreads--;
	pthread_mutex_unlock( &mutex2 );
	if( new_sock )
		delete new_sock;
	stThread->status = FINISHED;
	pthread_exit(NULL);
}

int main ( int argc, int argv[] )
{
  threads stThreads[MAX_CONNECTIONS];
  for( int i = 0; i < MAX_CONNECTIONS; i++ )
  {
  	stThreads[i].status = INIT;
  	stThreads[i].id = i;
  }
  int threadsIndex = 0; // an index to the circular vector of stThreads
  
  while( true )
  {
  	if( nThreads < MAX_CONNECTIONS )
  	{
		pthread_mutex_lock( &mutex2 );
		nThreads++;
		pthread_mutex_unlock( &mutex2 );
		for( int i = 0; i < MAX_CONNECTIONS; i++ )
		{
			if( stThreads[i].status == FINISHED )
			{
				threadsIndex = i; //the thread to be created must be at the position 'i'
				delete stThreads[i].thread; //cleaning the thread
				stThreads[i].status = INIT; //changing its status
				break;
			}
		}
		stThreads[threadsIndex].thread = new pthread_t; //create the thread
		pthread_create(stThreads[threadsIndex].thread, 0, listen, &stThreads[threadsIndex] );
		threadsIndex++;
  	}
  	usleep(100);
  }
  pthread_exit(NULL);
}

# 2  
Old 05-08-2008
Bug Ok found it!

Hello all!

I found the cause for it..

Quote:
Note - When there is no explicit synchronization to prevent it, a newly created, detached thread can die and have its thread ID reassigned to another new thread before its creator returns from pthread_create(). For nondetached (PTHREAD_CREATE_JOINABLE) threads, it is very important that some thread join with it after it terminates -- otherwise the resources of that thread are not released for use by new threads. This commonly results in a memory leak. So when you do not want a thread to be joined, create it as a detached thread.
(from Further Threads Programming:Thread Attributes (POSIX))

When i initialized the threadattr whit the parameter PTHREAD_CREATE_DETACHED there was no memory leak anymore!
!!!!!
SmilieSmilieSmilieSmilieSmilieSmilie


*just to remember that this socket implementation is not a good one for producing, since it creates one thread per each new connection accepted...
The best way to implemented is to limit a maximum number of connections.
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Web Development

Finding Cause of Memory Leak

Hi We have just got a dedicated server with Fasthosts, O/S is Linux CentOS 6 64 bit. It was a fresh install and I have just moved one WordPress site onto there. The problem is we seem to be getting a memory leak (that's what Fasthosts said) and the database (I think) keeps crashing, so we... (3 Replies)
Discussion started by: Pokeyzx
3 Replies

2. Programming

Help regarding memory leak in this C program

I have written this code in C which reads a very large collection of text files and does some processing. The problem with this code is that there are memory leaks which I am not able to figure out as to where the problem is. When I run this code, and see the memory usage using top command, then I... (7 Replies)
Discussion started by: shoaibjameel123
7 Replies

3. Programming

POSIX Thread Help

I want to create a program that creates 2 child process, and each of them creates 2 threads, and each thread prints its thread id. I0ve allread done that the outuput isn't the outuput i want. When a run the following comand "$./a.out | sort -u | wc -l" I have the folowing output 2 $: It should... (3 Replies)
Discussion started by: pharaoh
3 Replies

4. Red Hat

Memory leak

Hi all I am using RED HAT 5.4, and i am getting memory uses problem. when i use "sync;echo 3 > /proc/sys/vm/drop_cache" command the memory will release after 2,3 hour memory show 95%. pls suggest right way. thanks (37 Replies)
Discussion started by: reply.ravi
37 Replies

5. Programming

Memory Leak

Hi, I am trying a database server which keeps a B+ plus tree structure and works on it. I am trying to find the memory used/leak while executing this process. I check the memory leak by using ps uax command. When i execute a delete query i am sure that my code frees up the existing... (9 Replies)
Discussion started by: kumaran_5555
9 Replies

6. IP Networking

memory leak?

Hi All, my client server application can work in two modes: 1) one direction - only client sends msgs to server 2) two directions - server gives 'answers' to client. when program run in the first mode it looks OK, but when server answers to client than client's application exit its... (2 Replies)
Discussion started by: lenna
2 Replies

7. UNIX for Advanced & Expert Users

POSIX thread runs out of memory

i am creating threads in my program using the POSIX interface. when the thread starts executing i run out of memory and get a core dump. i have tried to increase the threads stack size using pthread_attr_setstacksize, but of no use since i guess the dynamic memory is allocated on the heap and... (1 Reply)
Discussion started by: aniketkadu2002
1 Replies

8. Programming

leak memory when thread exit

In our concurrent tcp server program, once the connection comes, the program create a thread to process acception. When the client exit, the server closed socket and the thread exited, the problem is the memory can not release normally. The code looks like the followings: main() { ... (1 Reply)
Discussion started by: Frank2004
1 Replies

9. Programming

about virtual memory and memory leak

Hi, First of all I appreciate this group very much for its informative discussions and posts. Here is my question. I have one process whose virtual memory size increases linearly from 6MB to 12MB in 20 minutes. Does that mean my process has memory leaks? In what cases does the... (4 Replies)
Discussion started by: shriashishpatil
4 Replies
Login or Register to Ask a Question