X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Ftracker.c;h=909a04845c1770bef7d6d1be62cba1594d75f4da;hp=af527b4fd03b5f7a2fd441b71c225ad1f1df8495;hb=2d97a0067600335f07eecb2c1d9ba68fc164583e;hpb=0dda67289b8a86fd3f117d644f00f2985d399208 diff --git a/src/bin/lttng-sessiond/tracker.c b/src/bin/lttng-sessiond/tracker.c index af527b4fd..909a04845 100644 --- a/src/bin/lttng-sessiond/tracker.c +++ b/src/bin/lttng-sessiond/tracker.c @@ -27,6 +27,7 @@ #include #include #include +#include #define FALLBACK_USER_BUFLEN 16384 #define FALLBACK_GROUP_BUFLEN 16384 @@ -60,53 +61,42 @@ static int match_tracker_key(struct cds_lfht_node *node, const void *key) tracker_node = caa_container_of( node, struct lttng_tracker_list_node, ht_node); - if (tracker_node->id.type != tracker_key->type) { - return 0; - } - switch (tracker_node->id.type) { - case LTTNG_ID_ALL: - return 1; - case LTTNG_ID_VALUE: - if (tracker_node->id.value != tracker_key->value) { - return 0; - } - break; - case LTTNG_ID_STRING: - if (strcmp(tracker_node->id.string, tracker_key->string) != 0) { - return 0; - } - break; - default: - return 0; - } - return 1; + + return lttng_tracker_id_is_equal(tracker_node->id, tracker_key); } static unsigned long hash_tracker_key( const struct lttng_tracker_id *tracker_key) { unsigned long key_hash = 0; + int value; + const char *string; + enum lttng_tracker_id_type type; + + /* We do not care for invalid state during hash computation */ + type = lttng_tracker_id_get_type(tracker_key); + (void) lttng_tracker_id_get_value(tracker_key, &value); + (void) lttng_tracker_id_get_string(tracker_key, &string); - switch (tracker_key->type) { + switch (type) { case LTTNG_ID_ALL: break; case LTTNG_ID_VALUE: key_hash ^= hash_key_ulong( - (void *) (unsigned long) tracker_key->value, - lttng_ht_seed); + (void *) (unsigned long) value, lttng_ht_seed); break; case LTTNG_ID_STRING: - key_hash ^= hash_key_str(tracker_key->string, lttng_ht_seed); + key_hash ^= hash_key_str(string, lttng_ht_seed); break; case LTTNG_ID_UNKNOWN: break; } - key_hash ^= hash_key_ulong((void *) (unsigned long) tracker_key->type, - lttng_ht_seed); + key_hash ^= hash_key_ulong( + (void *) (unsigned long) type, lttng_ht_seed); return key_hash; } -static struct lttng_tracker_id *lttng_tracker_list_lookup( +static struct lttng_tracker_id **lttng_tracker_list_lookup( const struct lttng_tracker_list *tracker_list, const struct lttng_tracker_id *key) { @@ -130,7 +120,7 @@ static void destroy_list_node_rcu(struct rcu_head *head) struct lttng_tracker_list_node *n = caa_container_of( head, struct lttng_tracker_list_node, rcu_head); - free(n->id.string); + lttng_tracker_id_destroy(n->id); free(n); } @@ -161,14 +151,15 @@ static void lttng_tracker_list_reset(struct lttng_tracker_list *tracker_list) int lttng_tracker_list_add(struct lttng_tracker_list *tracker_list, const struct lttng_tracker_id *_id) { - struct lttng_tracker_id *id; - struct lttng_tracker_list_node *n; + struct lttng_tracker_id **id; + struct lttng_tracker_list_node *n = NULL; int ret; - if (_id->type == LTTNG_ID_ALL) { + if (lttng_tracker_id_get_type(_id) == LTTNG_ID_ALL) { /* Track all, so remove each individual item. */ lttng_tracker_list_reset(tracker_list); - return LTTNG_OK; + ret = LTTNG_OK; + goto error; } rcu_read_lock(); id = lttng_tracker_list_lookup(tracker_list, _id); @@ -178,28 +169,26 @@ int lttng_tracker_list_add(struct lttng_tracker_list *tracker_list, */ rcu_read_unlock(); if (id) { - return LTTNG_ERR_ID_TRACKED; + ret = LTTNG_ERR_ID_TRACKED; + goto error; } n = zmalloc(sizeof(*n)); if (!n) { - return LTTNG_ERR_NOMEM; + ret = LTTNG_ERR_NOMEM; + goto error; } - n->id = *_id; - if (_id->type == LTTNG_ID_STRING) { - n->id.string = strdup(_id->string); - if (!n->id.string) { - ret = LTTNG_ERR_NOMEM; - goto error; - } - } else { - n->id.string = NULL; + + n->id = lttng_tracker_id_copy(_id); + if (!n->id) { + ret = LTTNG_ERR_NOMEM; + goto error; } cds_list_add_tail(&n->list_node, &tracker_list->list_head); tracker_list->state = LTTNG_TRACK_LIST; rcu_read_lock(); - cds_lfht_add(tracker_list->ht, hash_tracker_key(&n->id), &n->ht_node); + cds_lfht_add(tracker_list->ht, hash_tracker_key(n->id), &n->ht_node); rcu_read_unlock(); return LTTNG_OK; @@ -217,10 +206,10 @@ int lttng_tracker_list_remove(struct lttng_tracker_list *tracker_list, const struct lttng_tracker_id *_id) { enum lttng_error_code ret = LTTNG_OK; - struct lttng_tracker_id *id; + struct lttng_tracker_id **id; struct lttng_tracker_list_node *n; - if (_id->type == LTTNG_ID_ALL) { + if (lttng_tracker_id_get_type(_id) == LTTNG_ID_ALL) { /* Untrack all. */ lttng_tracker_list_reset(tracker_list); /* Set state to "track none". */ @@ -380,14 +369,26 @@ int lttng_tracker_id_lookup_string(enum lttng_tracker_type tracker_type, const struct lttng_tracker_id *id, int *result) { - switch (id->type) { + enum lttng_tracker_id_status status; + int value; + const char *string; + + switch (lttng_tracker_id_get_type(id)) { case LTTNG_ID_ALL: *result = -1; return LTTNG_OK; case LTTNG_ID_VALUE: + status = lttng_tracker_id_get_value(id, &value); + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + return LTTNG_ERR_INVALID; + } *result = id->value; return LTTNG_OK; case LTTNG_ID_STRING: + status = lttng_tracker_id_get_string(id, &string); + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + return LTTNG_ERR_INVALID; + } switch (tracker_type) { case LTTNG_TRACKER_PID: case LTTNG_TRACKER_VPID: @@ -396,11 +397,11 @@ int lttng_tracker_id_lookup_string(enum lttng_tracker_type tracker_type, case LTTNG_TRACKER_UID: case LTTNG_TRACKER_VUID: DBG("Lookup of tracker UID/VUID by name."); - return lttng_lookup_user(id->string, result); + return lttng_lookup_user(string, result); case LTTNG_TRACKER_GID: case LTTNG_TRACKER_VGID: DBG("Lookup of tracker GID/VGID by name."); - return lttng_lookup_group(id->string, result); + return lttng_lookup_group(string, result); default: return LTTNG_ERR_INVALID; } @@ -412,14 +413,15 @@ int lttng_tracker_id_lookup_string(enum lttng_tracker_type tracker_type, /* * Protected by session mutex held by caller. - * On success, _ids and the strings it contains must be freed by caller. + * On success, _ids and the ids it contains must be freed by the caller. */ ssize_t lttng_tracker_id_get_list(const struct lttng_tracker_list *tracker_list, - struct lttng_tracker_id **_ids) + struct lttng_tracker_id ***_ids) { struct lttng_tracker_list_node *n; ssize_t count = 0, i = 0, retval = 0; - struct lttng_tracker_id *ids; + struct lttng_tracker_id **ids; + enum lttng_tracker_id_status status; switch (tracker_list->state) { case LTTNG_TRACK_LIST: @@ -435,14 +437,10 @@ ssize_t lttng_tracker_id_get_list(const struct lttng_tracker_list *tracker_list, } cds_list_for_each_entry ( n, &tracker_list->list_head, list_node) { - ids[i].type = n->id.type; - ids[i].value = n->id.value; - if (ids[i].type == LTTNG_ID_STRING) { - ids[i].string = strdup(n->id.string); - if (!ids[i].string) { - retval = -LTTNG_ERR_NOMEM; - goto error; - } + ids[i] = lttng_tracker_id_copy(n->id); + if (!ids[i]) { + retval = -LTTNG_ERR_NOMEM; + goto error; } i++; } @@ -456,7 +454,13 @@ ssize_t lttng_tracker_id_get_list(const struct lttng_tracker_list *tracker_list, retval = -LTTNG_ERR_NOMEM; goto end; } - ids->type = LTTNG_TRACK_ALL; + ids[0] = lttng_tracker_id_create(); + status = lttng_tracker_id_set_all(ids[0]); + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ERR("Invalid tracker id for track all"); + retval = -LTTNG_ERR_INVALID; + goto error; + } *_ids = ids; retval = 1; break; @@ -469,21 +473,19 @@ end: return retval; error: - for (i = 0; i < count; i++) { - free(ids[i].string); - } + lttng_tracker_ids_destroy(ids, count); free(ids); return retval; } int lttng_tracker_id_set_list(struct lttng_tracker_list *tracker_list, - struct lttng_tracker_id *_ids, + struct lttng_tracker_id **_ids, size_t count) { size_t i; lttng_tracker_list_reset(tracker_list); - if (count == 1 && _ids[0].type == LTTNG_ID_ALL) { + if (count == 1 && lttng_tracker_id_get_type(_ids[0])) { /* Track all. */ return LTTNG_OK; } @@ -493,7 +495,7 @@ int lttng_tracker_id_set_list(struct lttng_tracker_list *tracker_list, return LTTNG_OK; } for (i = 0; i < count; i++) { - struct lttng_tracker_id *id = &_ids[i]; + struct lttng_tracker_id *id = _ids[i]; int ret; ret = lttng_tracker_list_add(tracker_list, id);