Properly cleanup thread-local values for the threads destroying thread_value_t objects
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2009 Tobias Brunner
|
* Copyright (C) 2009-2012 Tobias Brunner
|
||||||
* Hochschule fuer Technik Rapperswil
|
* Hochschule fuer Technik Rapperswil
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -33,6 +33,11 @@ struct private_thread_value_t {
|
|||||||
*/
|
*/
|
||||||
pthread_key_t key;
|
pthread_key_t key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor to cleanup the value of the thread destroying this object
|
||||||
|
*/
|
||||||
|
thread_cleanup_t destructor;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(thread_value_t, set, void,
|
METHOD(thread_value_t, set, void,
|
||||||
@@ -50,11 +55,22 @@ METHOD(thread_value_t, get, void*,
|
|||||||
METHOD(thread_value_t, destroy, void,
|
METHOD(thread_value_t, destroy, void,
|
||||||
private_thread_value_t *this)
|
private_thread_value_t *this)
|
||||||
{
|
{
|
||||||
|
void *val;
|
||||||
|
|
||||||
|
/* the destructor is not called automatically for the thread calling
|
||||||
|
* pthread_key_delete() */
|
||||||
|
if (this->destructor)
|
||||||
|
{
|
||||||
|
val = pthread_getspecific(this->key);
|
||||||
|
if (val)
|
||||||
|
{
|
||||||
|
this->destructor(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
pthread_key_delete(this->key);
|
pthread_key_delete(this->key);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Described in header.
|
* Described in header.
|
||||||
*/
|
*/
|
||||||
@@ -68,6 +84,7 @@ thread_value_t *thread_value_create(thread_cleanup_t destructor)
|
|||||||
.get = _get,
|
.get = _get,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
|
.destructor = destructor,
|
||||||
);
|
);
|
||||||
|
|
||||||
pthread_key_create(&this->key, destructor);
|
pthread_key_create(&this->key, destructor);
|
||||||
|
|||||||
Reference in New Issue
Block a user