RETURN_IF_ERROR_FBK(handle == NULL, "fbk hash creation should have succeeded");
tmp = rte_fbk_hash_create(&invalid_params_same_name_2);
- RETURN_IF_ERROR_FBK(tmp == NULL, "fbk hash creation should have succeeded");
- if (tmp != handle) {
- printf("ERROR line %d: hashes should have been the same\n", __LINE__);
- rte_fbk_hash_free(handle);
- rte_fbk_hash_free(tmp);
- return -1;
- }
+ if (tmp != NULL)
+ rte_fbk_hash_free(tmp);
+ RETURN_IF_ERROR_FBK(tmp != NULL, "fbk hash creation should have failed");
- /* we are not freeing tmp or handle here because we need a hash list
+ /* we are not freeing handle here because we need a hash list
* to be not empty for the next test */
/* create a hash in non-empty list - good for coverage */
*/
static int test_hash_creation_with_bad_parameters(void)
{
- struct rte_hash *handle;
+ struct rte_hash *handle, *tmp;
struct rte_hash_parameters params;
handle = rte_hash_create(NULL);
return -1;
}
+ /* test with same name should fail */
+ memcpy(¶ms, &ut_params, sizeof(params));
+ params.name = "same_name";
+ handle = rte_hash_create(¶ms);
+ if (handle == NULL) {
+ printf("Cannot create first hash table with 'same_name'\n");
+ return -1;
+ }
+ tmp = rte_hash_create(¶ms);
+ if (tmp != NULL) {
+ printf("Creation of hash table with same name should fail\n");
+ rte_hash_free(handle);
+ rte_hash_free(tmp);
+ return -1;
+ }
rte_hash_free(handle);
+
printf("# Test successful. No more errors expected\n");
return 0;
static int
test_hash_creation_with_good_parameters(void)
{
- struct rte_hash *handle, *tmp;
+ struct rte_hash *handle;
struct rte_hash_parameters params;
/* create with null hash function - should choose DEFAULT_HASH_FUNC */
memcpy(¶ms, &ut_params, sizeof(params));
- params.name = "same_name";
+ params.name = "name";
params.hash_func = NULL;
handle = rte_hash_create(¶ms);
if (handle == NULL) {
return -1;
}
- /* this test is trying to create a hash with the same name as previous one.
- * this should return a pointer to the hash we previously created.
- * the previous hash isn't freed exactly for the purpose of it being in
- * the hash list.
- */
- memcpy(¶ms, &ut_params, sizeof(params));
- params.name = "same_name";
- tmp = rte_hash_create(¶ms);
-
- /* check if the returned handle is actually equal to the previous hash */
- if (handle != tmp) {
- rte_hash_free(handle);
- rte_hash_free(tmp);
- printf("Creating hash with existing name was successful\n");
- return -1;
- }
-
- /* try creating hash when there already are hashes in the list.
- * the previous hash is not freed to have a non-empty hash list.
- * the other hash that's in the list is still pointed to by "handle" var.
- */
- memcpy(¶ms, &ut_params, sizeof(params));
- params.name = "different_name";
- tmp = rte_hash_create(¶ms);
- if (tmp == NULL) {
- rte_hash_free(handle);
- printf("Creating hash with valid parameters failed\n");
- return -1;
- }
-
- rte_hash_free(tmp);
rte_hash_free(handle);
return 0;
however a custom compare function (not in the jump table) can only
be used in single-process mode.
+* **hash: Fixed return value when allocating an existing hash table.**
+
+ Changed the ``rte_hash*_create()`` functions to return ``NULL`` and set
+ ``rte_errno`` to ``EEXIST`` when the object name already exists. This is
+ the behavior described in the API documentation in the header file.
+ The previous behavior was to return a pointer to the existing object in
+ that case, preventing the caller to know if the object had to be freed
+ or not.
+
* **lpm: Fixed return value when allocating an existing object.**
Changed the ``rte_lpm*_create()`` functions to return ``NULL`` and set