-
-
Save mkevac/0261ecc771d3352439ee9676d12b2a23 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/importer.c b/src/importer.c | |
index bf005b19..ef68bd5a 100644 | |
--- a/src/importer.c | |
+++ b/src/importer.c | |
@@ -74,7 +74,7 @@ static int importer___user_add(struct importer_s *importer, struct user_s **u_, | |
return 0; | |
} | |
- if (0 > user_item_allocate(u_, user->n_custom_parameters)) { | |
+ if (0 > user_item_allocate(u_)) { | |
importer->no_memory_for_user ++; | |
return -1; | |
} | |
@@ -150,6 +150,11 @@ static int importer___user_add(struct importer_s *importer, struct user_s **u_, | |
u->language_id = user->language_id; | |
} | |
+ if (0 > custom_parameters_enlarge(&u, user->n_custom_parameters)) { | |
+ zlog_error("no mem"); | |
+ return -1; | |
+ } | |
+ | |
for (unsigned i = 0; i < user->n_custom_parameters; i++) { | |
u->custom_parameters[i].id = user->custom_parameters[i]->id; | |
u->custom_parameters[i].value = user->custom_parameters[i]->value; | |
diff --git a/src/meetmaker_gpb.c b/src/meetmaker_gpb.c | |
index 709150ad..b7428506 100644 | |
--- a/src/meetmaker_gpb.c | |
+++ b/src/meetmaker_gpb.c | |
@@ -130,19 +130,17 @@ gpbrpc_method_result_t meetmaker__user_update(gpbrpc_request_t *rctx, Badoo__Mee | |
} | |
} | |
- if (request->n_custom_parameters > u->n_custom_parameters) { | |
- if (custom_parameters_realloc(&u, request->n_custom_parameters) < 0) { | |
- u->n_custom_parameters = 0; | |
- return res_no_mem(rctx); | |
- } | |
- u->n_custom_parameters = request->n_custom_parameters; | |
+ /* preallocate memory if needed */ | |
+ if (custom_parameters_enlarge(&u, request->n_custom_parameters) < 0) { | |
+ u->n_custom_parameters = 0; | |
+ return res_no_mem(rctx); | |
} | |
- } | |
- for (unsigned i = 0; i < request->n_custom_parameters; i++) { | |
- update_engine__user_custom_parameter_upd(update_ctx, u, | |
- request->custom_parameters[i]->id, | |
- request->custom_parameters[i]->value); | |
+ for (unsigned i = 0; i < request->n_custom_parameters; i++) { | |
+ update_engine__user_custom_parameter_upd(update_ctx, u, | |
+ request->custom_parameters[i]->id, | |
+ request->custom_parameters[i]->value); | |
+ } | |
} | |
if (request->has_gender) { | |
@@ -285,7 +283,7 @@ static int add_new_user(update_t *update_ctx, struct city_s *city, Badoo__Meetma | |
{ | |
struct user_s *u; | |
- if (0 > user_item_allocate(&u, request->n_custom_parameters)) { | |
+ if (0 > user_item_allocate(&u)) { | |
return -1; | |
} | |
@@ -390,10 +388,16 @@ static int add_new_user(update_t *update_ctx, struct city_s *city, Badoo__Meetma | |
u->rating_int = user_rating_compute(u); | |
- for (unsigned i = 0; i < request->n_custom_parameters; i++) { | |
- u->custom_parameters[i].id = request->custom_parameters[i]->id; | |
- u->custom_parameters[i].value = request->custom_parameters[i]->value; | |
- u->n_custom_parameters++; | |
+ { | |
+ if (0 > custom_parameters_enlarge(&u, request->n_custom_parameters)) { | |
+ return -1; | |
+ } | |
+ | |
+ for (unsigned i = 0; i < request->n_custom_parameters; i++) { | |
+ u->custom_parameters[i].id = request->custom_parameters[i]->id; | |
+ u->custom_parameters[i].value = request->custom_parameters[i]->value; | |
+ u->n_custom_parameters++; | |
+ } | |
} | |
if (0 > user_refs_add(update_ctx, u, city)) { | |
diff --git a/src/update_engine.c b/src/update_engine.c | |
index f368b078..55f4f830 100644 | |
--- a/src/update_engine.c | |
+++ b/src/update_engine.c | |
@@ -2819,7 +2819,6 @@ int update_engine__user_custom_parameter_upd(update_t *upd, struct user_s *u, ui | |
} | |
int cpindex = -1; | |
- int freeindex = -1; | |
for (unsigned i = 0; i < u->n_custom_parameters; i++) { | |
if (u->custom_parameters[i].id == id) { | |
@@ -2830,11 +2829,6 @@ int update_engine__user_custom_parameter_upd(update_t *upd, struct user_s *u, ui | |
} | |
cpindex = i; | |
} | |
- /* this is possible when we add several new params at once with one realloc() */ | |
- if (u->custom_parameters[i].id == 0) { | |
- freeindex = i; | |
- break; | |
- } | |
} | |
if (cpindex >= 0) { // custom parameter with this id is found | |
@@ -2843,11 +2837,8 @@ int update_engine__user_custom_parameter_upd(update_t *upd, struct user_s *u, ui | |
} | |
u->custom_parameters[cpindex].value = value_new; | |
- } else if (freeindex != -1) { | |
- u->custom_parameters[freeindex].id = id; | |
- u->custom_parameters[freeindex].value = value_new; | |
} else { | |
- if (custom_parameters_realloc(&u, u->n_custom_parameters + 1) < 0) { | |
+ if (custom_parameters_enlarge(&u, u->n_custom_parameters + 1) < 0) { | |
u->n_custom_parameters = 0; | |
return -1; | |
} | |
diff --git a/src/user.c b/src/user.c | |
index a667b77e..474e9c30 100644 | |
--- a/src/user.c | |
+++ b/src/user.c | |
@@ -369,8 +369,12 @@ void user_refs_remove(update_t *upd, struct user_s *u) | |
u->is_deleted = 1; | |
} | |
-int custom_parameters_realloc(struct user_s **user, size_t n_custom_parameters) | |
+int custom_parameters_enlarge(struct user_s **user, size_t n_custom_parameters) | |
{ | |
+ if ((*user)->n_custom_parameters >= n_custom_parameters) { | |
+ return 0; | |
+ } | |
+ | |
if (n_custom_parameters == 0) { | |
if ((*user)->n_custom_parameters > 0) { | |
free((*user)->custom_parameters); | |
@@ -390,7 +394,7 @@ int custom_parameters_realloc(struct user_s **user, size_t n_custom_parameters) | |
return 0; | |
} | |
-int user_item_allocate(struct user_s **ret_p, size_t n_custom_parameters) | |
+int user_item_allocate(struct user_s **ret_p) | |
{ | |
struct user_s *user; | |
@@ -410,11 +414,6 @@ int user_item_allocate(struct user_s **ret_p, size_t n_custom_parameters) | |
return -1; | |
} | |
- if (custom_parameters_realloc(&user, n_custom_parameters) < 0) { | |
- user->n_custom_parameters = 0; | |
- return -1; | |
- } | |
- | |
INIT_LIST_HEAD(&(user->city_list)); | |
if (0 > user___vote_storage_init_func(&user->votes_out)) { | |
diff --git a/src/user.h b/src/user.h | |
index a43bec49..2e624cbb 100644 | |
--- a/src/user.h | |
+++ b/src/user.h | |
@@ -222,8 +222,9 @@ struct user_s { | |
-int user_item_allocate(struct user_s **ret_p, size_t n_custom_parameters); | |
-int custom_parameters_realloc(struct user_s **user, size_t n_custom_parameters); | |
+int user_item_allocate(struct user_s **ret_p); | |
+int custom_parameters_enlarge(struct user_s **user, size_t n_custom_parameters); | |
+ | |
void user_item_free(struct user_s *u); /* unused */ | |
size_t user_slabs_mem_usage(); | |
int user_refs_add(update_t *update_ctx, struct user_s *u, struct city_s *city); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment