Created
July 23, 2018 15:48
-
-
Save mkevac/be27ce461dabfd02f6a88440fb17f6ce 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..cd5098e0 100644 | |
--- a/src/meetmaker_gpb.c | |
+++ b/src/meetmaker_gpb.c | |
@@ -130,19 +130,16 @@ 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) { | |
+ 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 +282,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 +387,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..addef187 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,12 +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) { | |
- u->n_custom_parameters = 0; | |
+ if (custom_parameters_enlarge(&u, u->n_custom_parameters + 1) < 0) { | |
return -1; | |
} | |
u->custom_parameters[u->n_custom_parameters].id = id; | |
diff --git a/src/user.c b/src/user.c | |
index a667b77e..7137bc49 100644 | |
--- a/src/user.c | |
+++ b/src/user.c | |
@@ -369,28 +369,23 @@ 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 (n_custom_parameters == 0) { | |
- if ((*user)->n_custom_parameters > 0) { | |
- free((*user)->custom_parameters); | |
- (*user)->custom_parameters = NULL; | |
- } | |
+ if ((*user)->n_custom_parameters >= n_custom_parameters) { | |
return 0; | |
} | |
- (*user)->custom_parameters = realloc((*user)->custom_parameters, sizeof(struct user_custom_parameter_s) * n_custom_parameters); | |
- if (!(*user)->custom_parameters) { | |
+ void *newarray = realloc((*user)->custom_parameters, sizeof(struct user_custom_parameter_s) * n_custom_parameters); | |
+ if (!newarray) { | |
return -1; | |
} | |
- if (n_custom_parameters > (*user)->n_custom_parameters) { | |
- memset((*user)->custom_parameters + (*user)->n_custom_parameters, 0, (n_custom_parameters - (*user)->n_custom_parameters) * sizeof(struct user_custom_parameter_s)); | |
- } | |
+ (*user)->custom_parameters = newarray; | |
+ | |
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 +405,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