celix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Thomas Quartier" <thomas.quart...@student.kuleuven.be>
Subject RE: APR memory dealocation when bundle stops
Date Thu, 10 Apr 2014 14:18:48 GMT
Hi,

This is my code:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>

#include <apr_general.h>

#include "bundle_activator.h"
#include "bundle_context.h"
#include "service_tracker.h"

#include <sys/wait.h>
#include <sys/mman.h>

struct activator_data {
	bool running;
	apr_pool_t *pool;
	apr_thread_t *sender;
};

typedef struct activator_data * activator_data_pt;

static void *APR_THREAD_FUNC my_thread_func(apr_thread_t *thd, void *data) {
	int i = 0;
	int j = 0;
	activator_data_pt act = (activator_data_pt) data;
	while (act->running) {
		printf("my_thread_for_1\n"); 
		j = 0;
		for(i = 0; i<=10000; i++){ 
			j+=rand();
		}
		printf("my_thread_for_1: for until %i\n", j);
		apr_sleep(1000000);
	}
	apr_thread_exit(thd, APR_SUCCESS);
	return NULL;
}

celix_status_t bundleActivator_create(bundle_context_pt context, void
**userData) {
	apr_pool_t *pool;
	celix_status_t status = bundleContext_getMemoryPool(context, &pool);
	if (status == CELIX_SUCCESS) {
		*userData = apr_palloc(pool, sizeof(struct activator_data));
		((activator_data_pt)(*userData))->running = false;
		((activator_data_pt)(*userData))->pool = NULL;
		((activator_data_pt)(*userData))->sender = NULL;
	} else {
		status = CELIX_START_ERROR;
	}
	return CELIX_SUCCESS;
}

celix_status_t bundleActivator_start(void * userData, bundle_context_pt
context) {
	activator_data_pt act = (activator_data_pt) userData;
	apr_pool_t *pool = NULL;
	bundleContext_getMemoryPool(context, &pool);
	act->pool=pool;
	act->running=true;
	apr_thread_create(&act->sender, NULL, my_thread_func, act,
act->pool);
	return CELIX_SUCCESS;
}

celix_status_t bundleActivator_stop(void * userData, bundle_context_pt
context) {
	apr_status_t aprStatusT = 0;
	activator_data_pt act = (activator_data_pt) userData;
	apr_status_t status;
	act->running=false;
	apr_thread_join(&status, act->sender);
	return CELIX_SUCCESS;
}

celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt
context) {
	activator_data_pt act = (activator_data_pt) userData;
	act->sender = 0;
	act = NULL;
	return CELIX_SUCCESS;
}

Kind regards,
Thomas

-----Original Message-----
From: Alexander Broekhuis [mailto:a.broekhuis@gmail.com] 
Sent: donderdag 10 april 2014 15:55
To: celix-dev@incubator.apache.org
Subject: Re: APR memory dealocation when bundle stops

Hello,

Could you send me an example of the code? I'll try to look into it and see
whats going on.


2014-04-10 14:34 GMT+02:00 Thomas Quartier <
thomas.quartier@student.kuleuven.be>:

> Hello,
>
>
>
> I'm testing Celix for my master thesis. I've cross compiled Celix to 
> embedded Linux for an ARM at91sam9260-ek development board using
Buildroot.
> To test the memory footprint of Celix, I have 10 bundles that each 
> start and stop an APR thread in the bundleActivator_start and 
> bundleActivator_stop functions. I start and stop these 10 bundles one 
> by one. In the memory plot, I can see all bundles start but when 
> stopping them, memory is not deallocated. To stop a thread, I set a 
> bool to false and wait (join) for the thread to exit as in the echo 
> example. The execution of the thread and the bundle stops but memory 
> stays allocated. I also tried to use the apr_thread_exit function 
> after the join but that results in a segmentation fault.
>
>
>
>
>
> Kind regards,
>
> Thomas
>
>
>
>
>
>


--
Met vriendelijke groet,

Alexander Broekhuis


Mime
View raw message