summaryrefslogtreecommitdiffstats
path: root/PICA_node.c
diff options
context:
space:
mode:
authorme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2012-09-23 19:02:11 +0000
committerme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2012-09-23 19:02:11 +0000
commit035f1d1e2f1810630bf5cf866136c1785f0f3dde (patch)
tree5927da8bef5b11e363fa7951b9101b69344f938b /PICA_node.c
parent1104d283b61a6cfbd762b25f1a3b7eed32ba1f74 (diff)
downloadpica-pica-035f1d1e2f1810630bf5cf866136c1785f0f3dde.tar.gz
pica-pica-035f1d1e2f1810630bf5cf866136c1785f0f3dde.zip
dynamic buffer allocation for client struct
git-svn-id: svn://localhost/project_picapica/trunk@206 fb96df88-216d-11de-830c-f3023f12d8ac
Diffstat (limited to 'PICA_node.c')
-rwxr-xr-xPICA_node.c75
1 files changed, 62 insertions, 13 deletions
diff --git a/PICA_node.c b/PICA_node.c
index b823598..a24e9ba 100755
--- a/PICA_node.c
+++ b/PICA_node.c
@@ -96,6 +96,7 @@ void cclink_list_delete_by_nodelink(struct nodelink *node);
struct client* client_tree_search(unsigned int id);//
struct client *client_list_addnew(struct newconn *nc);
struct PICA_proto_msg* client_wbuf_push(struct client *c,unsigned int msgid,unsigned int size);
+int client_rbuf_grow(struct client *c);
struct PICA_proto_msg* nodelink_wbuf_push(struct nodelink *nl,unsigned int msgid,unsigned int size);
int nodelink_rbuf_grow(struct nodelink *nl);
@@ -1422,7 +1423,13 @@ ci->addr=nc->addr;
SSL_set_fd(ci->ssl_comm,ci->sck_comm);
-//ci->state=PICA_CLSTATE_SENDINGRESP;
+ci->r_buf = calloc(1,DEFAULT_BUF_SIZE);
+if (!ci->r_buf)
+ {
+ free(ci);
+ return 0;
+ }
+ci->buflen_r = DEFAULT_BUF_SIZE;
return ci;
@@ -1452,6 +1459,12 @@ if (client_tree_search(ci->id) == ci)
cclink_list_delete_by_client(ci);
+if (ci->r_buf)
+ free(ci->r_buf);
+
+if (ci->w_buf)
+ free(ci->w_buf);
+
CLOSE(ci->sck_comm);
free(ci);
@@ -1460,20 +1473,52 @@ free(ci);
struct PICA_proto_msg* client_wbuf_push
(struct client *c,unsigned int msgid,unsigned int size)
{
-//Дальнейший вариант - размер буфера w_buf может увеличиться в
-//этой функции путем вызова realloc, если размер сообщения превышает половину
-//текущего размера буфера
-//Если буфер занят меньше, чем на половину, его размер может уменьшаться где-нибудь
-//в другом месте, для экономии памяти
- if (CL_WBUFSIZE - c->w_pos >= size)
+if (!c->w_buf)
+ {
+ c->w_buf = calloc(1,DEFAULT_BUF_SIZE + (size/DEFAULT_BUF_SIZE)*DEFAULT_BUF_SIZE );
+ if (!c->w_buf)
{
- struct PICA_proto_msg *mp=(struct PICA_proto_msg *)(c->w_buf + c->w_pos);
- mp->head[0]=mp->head[1]=msgid;
- c->w_pos+=size;
- return mp;
+ PICA_error("calloc() failed. Out of memory");
+ return 0;
}
- else
+ c->buflen_w = DEFAULT_BUF_SIZE + (size/DEFAULT_BUF_SIZE)*DEFAULT_BUF_SIZE;
+ }
+
+if ((c->buflen_w - c->w_pos) < size)
+ {
+ unsigned char *p;
+ p=realloc(c->w_buf,size + c->w_pos);
+
+ if (p)
+ {
+ c->w_buf=p;
+ c->buflen_w=size + c->w_pos;
+ }
+ else
return 0;
+ }
+
+struct PICA_proto_msg *mp=(struct PICA_proto_msg *)(c->w_buf + c->w_pos);
+mp->head[0]=mp->head[1]=msgid;
+c->w_pos+=size;
+return mp;
+}
+
+int client_rbuf_grow(struct client *c)
+{
+unsigned char *p;
+
+p=realloc(c->r_buf, c->buflen_r + DEFAULT_BUF_SIZE);
+
+if (!p)
+ {
+ PICA_error("realloc() failed");
+ return 0;
+ }
+c->r_buf = p;
+c->buflen_r +=DEFAULT_BUF_SIZE;
+
+return 1;
}
struct nodelink *nodelink_list_addnew(struct newconn *nc)
@@ -1855,7 +1900,7 @@ while (i_ptr)
switch(i_ptr->state)
{
case PICA_CLSTATE_CONNECTED:
- ret=SSL_read(i_ptr->ssl_comm,i_ptr->r_buf+i_ptr->r_pos,CL_RBUFSIZE-i_ptr->r_pos);
+ ret=SSL_read(i_ptr->ssl_comm, i_ptr->r_buf + i_ptr->r_pos, i_ptr->buflen_r - i_ptr->r_pos);
if (!ret)
kill_ptr=i_ptr;
@@ -1875,6 +1920,10 @@ while (i_ptr)
i_ptr->r_pos+=ret;
if(!PICA_processdatastream(i_ptr->r_buf,&(i_ptr->r_pos),i_ptr,_msginfo_comm, MSGINFO_MSGSNUM(_msginfo_comm) ))
kill_ptr=i_ptr;
+
+ if (i_ptr->buflen_r == i_ptr->r_pos)
+ if (!client_rbuf_grow(i_ptr))
+ kill_ptr = i_ptr;
}
break;