MOD aaa-12 解决内存泄漏的问题

SOL    解决内存泄漏的问题
修改人:zhangliang
检视人:zhangliang
This commit is contained in:
zhanglianghy 2019-09-05 17:24:19 +08:00
parent 3f77c1401c
commit 57cf457c77
11 changed files with 76 additions and 38 deletions

View File

@ -48,4 +48,5 @@ void rpc_return_error(rpc_conn *conn, ret_code err_code, char* err_message);
void rpc_send_message(rpc_conn *conn); void rpc_send_message(rpc_conn *conn);
void rpc_conn_freeiovdata(rpc_conn *c, pointer data1, pointer data2, pointer data3);
#endif /* RPC_CONN_H_ */ #endif /* RPC_CONN_H_ */

View File

@ -29,6 +29,6 @@ rpc_request* rpc_request_copy_head(rpc_request *req);
rpc_parse_result rpc_request_parse(rpc_conn *c, rpc_request **req); rpc_parse_result rpc_request_parse(rpc_conn *c, rpc_request **req);
void rpc_request_format(const rpc_request *request, rpc_conn *c); ret_code rpc_request_format(const rpc_request *request, rpc_conn *c);
#endif /* RPC_REQUEST_H_ */ #endif /* RPC_REQUEST_H_ */

View File

@ -45,6 +45,12 @@
__func__, __LINE__, ##__VA_ARGS__); \ __func__, __LINE__, ##__VA_ARGS__); \
} while (0) } while (0)
#define rpc_json_print(json_obj) \
do { \
char *print_str = cJSON_Print(json_obj); \
rpc_log_info("json input:\n %s\n", print_str); \
free(print_str); \
} while (0)
#define ASSERT_RETCONN_VOID(conn,ret) \ #define ASSERT_RETCONN_VOID(conn,ret) \
do { \ do { \

View File

@ -409,7 +409,7 @@ ret_code br_config_json_parse(pointer input, uint *conf_type, char *br_name)
json_obj = cJSON_Parse(input); json_obj = cJSON_Parse(input);
ASSERT_PTR(json_obj, RET_NULLP); ASSERT_PTR(json_obj, RET_NULLP);
rpc_log_info("json input:\n %s\n", cJSON_Print(json_obj)); rpc_json_print(json_obj);
s2j_create_struct_obj(br_config, br_config_string_t); s2j_create_struct_obj(br_config, br_config_string_t);
@ -555,7 +555,7 @@ ret_code br_if_config_json_parse(pointer input, uint *conf_type, br_config_t *br
json_obj = cJSON_Parse(input); json_obj = cJSON_Parse(input);
ASSERT_PTR(json_obj, RET_NULLP); ASSERT_PTR(json_obj, RET_NULLP);
rpc_log_info("json input:\n %s\n", cJSON_Print(json_obj)); rpc_json_print(json_obj);
s2j_create_struct_obj(br_if_conf, br_if_config_string_t); s2j_create_struct_obj(br_if_conf, br_if_config_string_t);
@ -971,7 +971,7 @@ ret_code br_fdb_config_json_parse(pointer input, uint *conf_type, br_fdb_config_
json_obj = cJSON_Parse(input); json_obj = cJSON_Parse(input);
ASSERT_PTR(json_obj, RET_NULLP); ASSERT_PTR(json_obj, RET_NULLP);
rpc_log_info("json input:\n %s\n", cJSON_Print(json_obj)); rpc_json_print(json_obj);
s2j_create_struct_obj(br_fdb_conf, br_fdb_string_t); s2j_create_struct_obj(br_fdb_conf, br_fdb_string_t);

View File

@ -72,7 +72,7 @@ ret_code ip_config_json_parse(pointer input, uint *conf_type, ip_config_t *confi
return RET_INPUTERR; return RET_INPUTERR;
} }
rpc_log_info("json input:\n %s \n", cJSON_Print(json_obj)); rpc_json_print(json_obj);
s2j_create_struct_obj(ip_config, ip_config_string_t); s2j_create_struct_obj(ip_config, ip_config_string_t);
@ -119,7 +119,7 @@ ret_code ip_config_json_parse_array(pointer input, uint *conf_type,
return RET_INPUTERR; return RET_INPUTERR;
} }
rpc_log_info("json input:%s \n", cJSON_Print(json_obj)); rpc_json_print(json_obj);
iCount = cJSON_GetArraySize(json_obj); iCount = cJSON_GetArraySize(json_obj);
@ -228,12 +228,12 @@ ret_code ip_config_format_json_array(ip_config_t *config_buff,
return RET_NOMEM; return RET_NOMEM;
} }
cJSON_AddItemToArray(json_array, json_obj);
s2j_json_set_basic_element(json_obj, ip_config, string, ifname); s2j_json_set_basic_element(json_obj, ip_config, string, ifname);
s2j_json_set_basic_element(json_obj, ip_config, int, family); s2j_json_set_basic_element(json_obj, ip_config, int, family);
s2j_json_set_basic_element(json_obj, ip_config, string, ipaddr); s2j_json_set_basic_element(json_obj, ip_config, string, ipaddr);
s2j_json_set_basic_element(json_obj, ip_config, int, prefixlen); s2j_json_set_basic_element(json_obj, ip_config, int, prefixlen);
cJSON_AddItemToArray(json_array, json_obj);
} }

View File

@ -75,13 +75,13 @@ ret_code routing_to_json(int count, routing_t *buff_total, pointer output, int *
cJSON_AddNumberToObject(json_obj,"metric",buff_total[i].metric); cJSON_AddNumberToObject(json_obj,"metric",buff_total[i].metric);
cJSON_AddItemToArray(json_array, json_obj); cJSON_AddItemToArray(json_array, json_obj);
rpc_log_info("json_obj: %s\n",cJSON_Print(json_obj)); rpc_json_print(json_obj);
} }
cJSON_AddItemToObject(ret_root,"route",json_array); cJSON_AddItemToObject(ret_root,"route",json_array);
} }
rpc_log_info("check: %s\n",cJSON_Print(ret_root)); rpc_json_print(ret_root);
json_routing = cJSON_PrintUnformatted(ret_root); json_routing = cJSON_PrintUnformatted(ret_root);
*output_len = strlen(json_routing) + 1; *output_len = strlen(json_routing) + 1;
@ -107,7 +107,7 @@ ret_code routing_json_parse(pointer input, uint *conf_type, routing_t *conf_buff
return RET_EMPTY_STRING; return RET_EMPTY_STRING;
} }
rpc_log_info("json input:\n %s \n", cJSON_Print(json_obj)); rpc_json_print(json_obj);
operate = cJSON_GetObjectItem(json_obj,"operate"); operate = cJSON_GetObjectItem(json_obj,"operate");

View File

@ -311,7 +311,7 @@ ret_code authfree_config_json_parse_array(pointer input, uint *conf_type, freeau
return RET_INPUTERR; return RET_INPUTERR;
} }
rpc_log_info("json input:%s \n", cJSON_Print(cjson)); rpc_json_print(cjson);
/*获取免认证规则的data部分 */ /*获取免认证规则的data部分 */
data = cJSON_GetObjectItem(cjson, "data"); data = cJSON_GetObjectItem(cjson, "data");

View File

@ -292,12 +292,7 @@ ret_code rpc_client_call_async(rpc_client* client, char* service_name,
rpc_log_dbg("rpc_client_call_async:send_message\n"); rpc_log_dbg("rpc_client_call_async:send_message\n");
//write data //write data
rpc_request_format(req, conn); ret = rpc_request_format(req, conn);
if(conn->sfd == -1 || rpc_client_send(conn) == FALSE)
{
ret = RET_SENDERR;
}
pthread_mutex_unlock(&th->mutex); pthread_mutex_unlock(&th->mutex);

View File

@ -424,6 +424,29 @@ void rpc_conn_addiov(rpc_conn *c, pointer data, size_t data_len) {
c->iovused++; c->iovused++;
} }
void rpc_conn_freeiovdata(rpc_conn *c, pointer data1, pointer data2, pointer data3) {
int i = 0;
if(c == NULL || data1 == NULL
|| data2 == NULL || data3 == NULL){
return;
}
for(i = 0; i < c->iovused; i++){
if(c->iov[i].iov_base == data1
|| c->iov[i].iov_base == data2
|| c->iov[i].iov_base == data3){
c->iov[i].iov_base = NULL;
}
}
rpc_free(data1);
rpc_free(data2);
rpc_free(data3);
c->iovused = 0;
}
boolean rpc_client_send(rpc_conn *conn) { boolean rpc_client_send(rpc_conn *conn) {
struct msghdr m; struct msghdr m;
boolean ret = TRUE; boolean ret = TRUE;
@ -460,7 +483,7 @@ boolean rpc_client_send(rpc_conn *conn) {
} }
} }
//TODO free resource //TODO free resource
conn->iovused = 0; //conn->iovused = 0;
return ret; return ret;
} }
@ -492,34 +515,37 @@ void rpc_send_message(rpc_conn *conn) {
} else { } else {
perror("failed to write"); perror("failed to write");
rpc_conn_close(conn); rpc_conn_close(conn);
return;
} }
} else { } else {
break; break;
} }
} }
//TODO free resource //TODO free resource
conn->iovused = 0; //conn->iovused = 0;
} }
static inline void rpc_send_response(rpc_conn *conn, ret_code code, static inline void rpc_send_response(rpc_conn *conn, ret_code code,
pointer output, int output_len) { pointer output, int output_len) {
//status line //status line
char *data; char *data1, *data2, *data3;
data = rpc_vsprintf("%s %d %s\n", RPC_VERSION, (int) code, rpc_code_format( data1 = rpc_vsprintf("%s %d %s\n", RPC_VERSION, (int) code, rpc_code_format(
code)); code));
rpc_conn_addiov(conn, data, strlen(data)); rpc_conn_addiov(conn, data1, strlen(data1));
//seq //seq
data = rpc_vsprintf("seq:%d\n", conn->curr_seq); data2 = rpc_vsprintf("seq:%d\n", conn->curr_seq);
rpc_conn_addiov(conn, data, strlen(data)); rpc_conn_addiov(conn, data2, strlen(data2));
//body-len //body-len
data = rpc_vsprintf("body-len:%d\n\n", output_len); data3 = rpc_vsprintf("body-len:%d\n\n", output_len);
rpc_conn_addiov(conn, data, strlen(data)); rpc_conn_addiov(conn, data3, strlen(data3));
//body //body
if (output) { if (output) {
rpc_conn_addiov(conn, output, output_len); rpc_conn_addiov(conn, output, output_len);
} }
rpc_log_dbg("rpc_send_response: %s\n", data); rpc_log_dbg("rpc_send_response: %s\n", data3);
rpc_send_message(conn); rpc_send_message(conn);
rpc_conn_freeiovdata(conn, data1, data2, data3);
} }
void rpc_return(rpc_conn *conn, pointer output, int output_len) { void rpc_return(rpc_conn *conn, pointer output, int output_len) {

View File

@ -160,23 +160,33 @@ rpc_parse_result rpc_request_parse(rpc_conn *c, rpc_request **req) {
return RPC_Parse_Error; return RPC_Parse_Error;
} }
void rpc_request_format(const rpc_request *request, rpc_conn *c) { ret_code rpc_request_format(const rpc_request *request, rpc_conn *c) {
ret_code ret = RET_OK;
char *data1, *data2, *data3;
assert(request !=NULL); assert(request !=NULL);
assert(c != NULL); assert(c != NULL);
char *data;
//request line //request line
data = rpc_vsprintf("CALL %s@%s %s\n", request->method_name, data1 = rpc_vsprintf("CALL %s@%s %s\n", request->method_name,
request->service_name, RPC_VERSION); request->service_name, RPC_VERSION);
rpc_conn_addiov(c, data, strlen(data)); rpc_conn_addiov(c, data1, strlen(data1));
//seq //seq
data = rpc_vsprintf("seq:%d\n", request->seq); data2 = rpc_vsprintf("seq:%d\n", request->seq);
rpc_conn_addiov(c, data, strlen(data)); rpc_conn_addiov(c, data2, strlen(data2));
//body len //body len
data = rpc_vsprintf("body-len:%d\n\n", request->input_len); data3 = rpc_vsprintf("body-len:%d\n\n", request->input_len);
rpc_conn_addiov(c, data, strlen(data)); rpc_conn_addiov(c, data3, strlen(data3));
rpc_log_dbg("request data:%s\n", data); rpc_log_dbg("request data:%s\n", data3);
//body //body
if (request->input) if (request->input)
rpc_conn_addiov(c, request->input, request->input_len); rpc_conn_addiov(c, request->input, request->input_len);
if(c->sfd == -1 || rpc_client_send(c) == FALSE)
{
ret = RET_SENDERR;
}
rpc_conn_freeiovdata(c, data1, data2, data3);
return ret;
} }

View File

@ -422,7 +422,7 @@ static void* thread_write_hander(void* data) {
//write data //write data
rpc_request_format(req, conn); rpc_request_format(req, conn);
rpc_client_send(conn); //rpc_client_send(conn);
} }
} }
return NULL; return NULL;