Skip to content

Commit 64202ed

Browse files
committedJul 25, 2008
Optimized out some unnecessary memory allocations
1 parent 98f75c8 commit 64202ed

File tree

1 file changed

+62
-50
lines changed

1 file changed

+62
-50
lines changed
 

‎ngx_http_upload_module.c

+62-50
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,12 @@ typedef struct {
9393

9494
typedef struct ngx_http_upload_md5_ctx_s {
9595
MD5_CTX md5;
96-
u_char md5_digest[MD5_DIGEST_LENGTH];
97-
u_char md5_digest_hex[MD5_DIGEST_LENGTH * 2];
96+
u_char md5_digest[MD5_DIGEST_LENGTH * 2];
9897
} ngx_http_upload_md5_ctx_t;
9998

10099
typedef struct ngx_http_upload_sha1_ctx_s {
101100
SHA1_CTX sha1;
102-
u_char sha1_digest[SHA_DIGEST_LENGTH];
103-
u_char sha1_digest_hex[SHA_DIGEST_LENGTH * 2];
101+
u_char sha1_digest[SHA_DIGEST_LENGTH * 2];
104102
} ngx_http_upload_sha1_ctx_t;
105103

106104
/*
@@ -433,6 +431,16 @@ static ngx_http_variable_t ngx_http_upload_aggregate_variables[] = { /* {{{ */
433431

434432
static ngx_str_t ngx_http_upload_empty_field_value = ngx_null_string;
435433

434+
static ngx_str_t ngx_upload_field_part1 = { /* {{{ */
435+
sizeof("\r\nContent-Disposition: form-data; name=\"") - 1,
436+
(u_char*)"\r\nContent-Disposition: form-data; name=\""
437+
}; /* }}} */
438+
439+
static ngx_str_t ngx_upload_field_part2 = { /* {{{ */
440+
sizeof("\"\r\n\r\n") - 1,
441+
(u_char*)"\"\r\n\r\n"
442+
}; /* }}} */
443+
436444
static ngx_int_t /* {{{ ngx_http_upload_handler */
437445
ngx_http_upload_handler(ngx_http_request_t *r)
438446
{
@@ -863,57 +871,55 @@ static ngx_int_t ngx_http_upload_flush_output_buffer(ngx_http_upload_ctx_t *u, u
863871
}
864872
} /* }}} */
865873

866-
static ngx_int_t /* {{{ ngx_http_upload_append_field */
867-
ngx_http_upload_append_field(ngx_http_upload_ctx_t *u, ngx_str_t *name, ngx_str_t *value)
874+
static void /* {{{ ngx_http_upload_append_str */
875+
ngx_http_upload_append_str(ngx_http_upload_ctx_t *u, ngx_buf_t *b, ngx_chain_t *cl, ngx_str_t *s)
868876
{
869-
ngx_int_t len;
870-
ngx_chain_t *cl;
871-
ngx_buf_t *b;
877+
b->start = b->pos = s->data;
878+
b->end = b->last = s->data + s->len;
879+
b->memory = 1;
880+
b->in_file = 0;
881+
b->last_buf = 0;
872882

873-
len = u->first_part ? u->boundary.len - 2 : u->boundary.len;
883+
b->last_in_chain = 0;
874884

875-
len += sizeof("\r\nContent-Disposition: form-data; name=\"") - 1;
885+
cl->buf = b;
886+
cl->next = NULL;
876887

877-
len += name->len;
888+
if(u->chain == NULL) {
889+
u->chain = cl;
890+
u->last = cl;
891+
}else{
892+
u->last->next = cl;
893+
u->last = cl;
894+
}
895+
} /* }}} */
878896

879-
len += sizeof("\"\r\n\r\n") - 1;
897+
static ngx_int_t /* {{{ ngx_http_upload_append_field */
898+
ngx_http_upload_append_field(ngx_http_upload_ctx_t *u, ngx_str_t *name, ngx_str_t *value)
899+
{
900+
ngx_str_t boundary = { u->first_part ? u->boundary.len - 2 : u->boundary.len,
901+
u->first_part ? u->boundary.data + 2 : u->boundary.data };
880902

881-
len += value->len;
903+
ngx_buf_t *b;
904+
ngx_chain_t *cl;
882905

883-
b = ngx_create_temp_buf(u->request->pool, len);
906+
b = ngx_palloc(u->request->pool, 5 * sizeof(ngx_buf_t) + 5 * sizeof(ngx_chain_t));
884907

885908
if (b == NULL) {
886909
return NGX_UPLOAD_NOMEM;
887910
}
888911

889-
cl = ngx_alloc_chain_link(u->request->pool);
890-
if (cl == NULL) {
891-
return NGX_UPLOAD_NOMEM;
892-
}
893-
894-
b->last = ngx_cpymem(b->last, u->first_part ? u->boundary.data + 2 : u->boundary.data,
895-
u->first_part ? u->boundary.len - 2 : u->boundary.len);
912+
cl = (ngx_chain_t *)(b + 5);
896913

897-
b->last = ngx_cpymem(b->last, "\r\nContent-Disposition: form-data; name=\"", sizeof("\r\nContent-Disposition: form-data; name=\"") - 1);
914+
ngx_http_upload_append_str(u, b, cl, &boundary);
898915

899-
b->last = ngx_cpymem(b->last, name->data, name->len);
916+
ngx_http_upload_append_str(u, b + 1, cl + 1, &ngx_upload_field_part1);
900917

901-
b->last = ngx_cpymem(b->last, "\"\r\n\r\n", sizeof("\"\r\n\r\n") - 1);
918+
ngx_http_upload_append_str(u, b + 2, cl + 2, name);
902919

903-
b->last = ngx_cpymem(b->last, value->data, value->len);
904-
905-
b->last_in_chain = 0;
906-
907-
cl->buf = b;
908-
cl->next = NULL;
920+
ngx_http_upload_append_str(u, b + 3, cl + 3, &ngx_upload_field_part2);
909921

910-
if(u->chain == NULL) {
911-
u->chain = cl;
912-
u->last = cl;
913-
}else{
914-
u->last->next = cl;
915-
u->last = cl;
916-
}
922+
ngx_http_upload_append_str(u, b + 4, cl + 4, value);
917923

918924
u->first_part = 0;
919925

@@ -1059,14 +1065,17 @@ ngx_http_upload_md5_variable(ngx_http_request_t *r,
10591065
v->not_found = 0;
10601066

10611067
hex_table = (u_char*)data;
1062-
c = u->md5_ctx->md5_digest_hex;
1068+
c = u->md5_ctx->md5_digest + MD5_DIGEST_LENGTH * 2;
10631069

1064-
for (i = 0; i < MD5_DIGEST_LENGTH; i++) {
1065-
*c++ = hex_table[u->md5_ctx->md5_digest[i] >> 4];
1066-
*c++ = hex_table[u->md5_ctx->md5_digest[i] & 0xf];
1067-
}
1070+
i = MD5_DIGEST_LENGTH;
1071+
1072+
do{
1073+
i--;
1074+
*--c = hex_table[u->md5_ctx->md5_digest[i] & 0xf];
1075+
*--c = hex_table[u->md5_ctx->md5_digest[i] >> 4];
1076+
}while(i != 0);
10681077

1069-
v->data = u->md5_ctx->md5_digest_hex;
1078+
v->data = u->md5_ctx->md5_digest;
10701079
v->len = MD5_DIGEST_LENGTH * 2;
10711080

10721081
return NGX_OK;
@@ -1093,14 +1102,17 @@ ngx_http_upload_sha1_variable(ngx_http_request_t *r,
10931102
v->not_found = 0;
10941103

10951104
hex_table = (u_char*)data;
1096-
c = u->sha1_ctx->sha1_digest_hex;
1105+
c = u->sha1_ctx->sha1_digest + SHA_DIGEST_LENGTH * 2;
10971106

1098-
for (i = 0; i < SHA_DIGEST_LENGTH; i++) {
1099-
*c++ = hex_table[u->sha1_ctx->sha1_digest[i] >> 4];
1100-
*c++ = hex_table[u->sha1_ctx->sha1_digest[i] & 0xf];
1101-
}
1107+
i = SHA_DIGEST_LENGTH;
1108+
1109+
do{
1110+
i--;
1111+
*--c = hex_table[u->sha1_ctx->sha1_digest[i] & 0xf];
1112+
*--c = hex_table[u->sha1_ctx->sha1_digest[i] >> 4];
1113+
}while(i != 0);
11021114

1103-
v->data = u->sha1_ctx->sha1_digest_hex;
1115+
v->data = u->sha1_ctx->sha1_digest;
11041116
v->len = SHA_DIGEST_LENGTH * 2;
11051117

11061118
return NGX_OK;

0 commit comments

Comments
 (0)