summaryrefslogtreecommitdiff
path: root/src/libstrongswan/threading/thread_value.c
diff options
context:
space:
mode:
authorYves-Alexis Perez <corsac@debian.org>2013-01-02 14:18:20 +0100
committerYves-Alexis Perez <corsac@debian.org>2013-01-02 14:18:20 +0100
commitc1343b3278cdf99533b7902744d15969f9d6fdc1 (patch)
treed5ed3dc5677a59260ec41cd39bb284d3e94c91b3 /src/libstrongswan/threading/thread_value.c
parentb34738ed08c2227300d554b139e2495ca5da97d6 (diff)
downloadvyos-strongswan-c1343b3278cdf99533b7902744d15969f9d6fdc1.tar.gz
vyos-strongswan-c1343b3278cdf99533b7902744d15969f9d6fdc1.zip
Imported Upstream version 5.0.1
Diffstat (limited to 'src/libstrongswan/threading/thread_value.c')
-rw-r--r--src/libstrongswan/threading/thread_value.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/libstrongswan/threading/thread_value.c b/src/libstrongswan/threading/thread_value.c
index 3fa70acb2..190b7434f 100644
--- a/src/libstrongswan/threading/thread_value.c
+++ b/src/libstrongswan/threading/thread_value.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Tobias Brunner
+ * Copyright (C) 2009-2012 Tobias Brunner
* Hochschule fuer Technik Rapperswil
*
* 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;
+ /**
+ * Destructor to cleanup the value of the thread destroying this object
+ */
+ thread_cleanup_t destructor;
+
};
METHOD(thread_value_t, set, void,
@@ -50,11 +55,22 @@ METHOD(thread_value_t, get, void*,
METHOD(thread_value_t, destroy, void,
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);
free(this);
}
-
/**
* Described in header.
*/
@@ -68,6 +84,7 @@ thread_value_t *thread_value_create(thread_cleanup_t destructor)
.get = _get,
.destroy = _destroy,
},
+ .destructor = destructor,
);
pthread_key_create(&this->key, destructor);