#include <pthread.h>
+typedef struct {
+ pthread_mutex_t mutex;
+} rlm_stats_mutable_t;
+
/*
* @todo - MULTI_PROTOCOL - make this protocol agnostic.
* Perhaps keep stats in a hash table by (request->dict, request->code) ?
*/
typedef struct {
- pthread_mutex_t mutex;
+ rlm_stats_mutable_t *mutable;
fr_dict_attr_t const *type_da; //!< FreeRADIUS-Stats4-Type
fr_dict_attr_t const *ipv4_da; //!< FreeRADIUS-Stats4-IPv4-Address
fr_dict_attr_t const *ipv6_da; //!< FreeRADIUS-Stats4-IPv6-Address
* Loop over all of the other thread instances, locking
* them, and adding their statistics in.
*/
- pthread_mutex_lock(&t->inst->mutex);
+ pthread_mutex_lock(&t->inst->mutable->mutex);
for (other = fr_dlist_head(&t->inst->list);
other != NULL;
other = fr_dlist_next(&t->inst->list, other)) {
pthread_mutex_unlock(&other->mutex);
}
- pthread_mutex_unlock(&t->inst->mutex);
+ pthread_mutex_unlock(&t->inst->mutable->mutex);
}
t->last_global_update = request->async->recv_time;
- pthread_mutex_lock(&inst->mutex);
+ pthread_mutex_lock(&inst->mutable->mutex);
for (i = 0; i < FR_RADIUS_CODE_MAX; i++) {
inst->stats[i] += t->stats[i];
t->stats[i] = 0;
}
- pthread_mutex_unlock(&inst->mutex);
+ pthread_mutex_unlock(&inst->mutable->mutex);
RETURN_MODULE_UPDATED;
}
*
* The copy helps minimize mutex contention.
*/
- pthread_mutex_lock(&inst->mutex);
+ pthread_mutex_lock(&inst->mutable->mutex);
for (i = 0; i < FR_RADIUS_CODE_MAX; i++) {
inst->stats[i] += t->stats[i];
t->stats[i] = 0;
}
memcpy(&local_stats, inst->stats, sizeof(inst->stats));
- pthread_mutex_unlock(&inst->mutex);
+ pthread_mutex_unlock(&inst->mutable->mutex);
vp = NULL;
break;
TALLOC_FREE(t->src);
return -1;
}
- pthread_mutex_init(&t->mutex, 0);
- pthread_mutex_lock(&inst->mutex);
+ pthread_mutex_lock(&inst->mutable->mutex);
fr_dlist_insert_head(&inst->list, t);
- pthread_mutex_unlock(&inst->mutex);
+ pthread_mutex_unlock(&inst->mutable->mutex);
return 0;
}
rlm_stats_t *inst = t->inst;
int i;
- pthread_mutex_lock(&inst->mutex);
+ pthread_mutex_lock(&inst->mutable->mutex);
for (i = 0; i < FR_RADIUS_CODE_MAX; i++) {
inst->stats[i] += t->stats[i];
}
fr_dlist_remove(&inst->list, t);
- pthread_mutex_unlock(&inst->mutex);
+ pthread_mutex_unlock(&inst->mutable->mutex);
pthread_mutex_destroy(&t->mutex);
return 0;
{
rlm_stats_t *inst = talloc_get_type_abort(mctx->mi->data, rlm_stats_t);
- pthread_mutex_init(&inst->mutex, NULL);
+ MEM(inst->mutable = talloc_zero(NULL, rlm_stats_mutable_t));
+ pthread_mutex_init(&inst->mutable->mutex, NULL);
fr_dlist_init(&inst->list, rlm_stats_thread_t, entry);
return 0;
{
rlm_stats_t *inst = talloc_get_type_abort(mctx->mi->data, rlm_stats_t);
- pthread_mutex_destroy(&inst->mutex);
+ pthread_mutex_destroy(&inst->mutable->mutex);
+ talloc_free(inst->mutable);
/* free things here */
return 0;