Skip to content

Instantly share code, notes, and snippets.

@mkevac
Created July 23, 2018 15:45
Show Gist options
  • Save mkevac/5fdab6830f4b2d3945907b47d1e46a32 to your computer and use it in GitHub Desktop.
Save mkevac/5fdab6830f4b2d3945907b47d1e46a32 to your computer and use it in GitHub Desktop.
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