Changeset 5022

Faster cw_slinfactory_feed() implementation.

cw_slinfactory_feed() used an O(N) list insert. Now it uses O(1), at
the cost of an extra pointer and integer in struct cw_slinfactory.

Committed by:  karvan
Date:  Jul 01 2008 * 20:34 (5 months ago)

Affected files:

callweaver/branches/karvan/corelib/slinfactory.c (unified diff)

r4723r5022
4343 {
4444 memset(sf, 0, sizeof(struct cw_slinfactory));
4545 sf->offset = sf->hold;
46 sf->queue = NULL;
46 sf->queue.head = sf->queue.tail = NULL;
4747 cw_mutex_init(&(sf->lock));
4848 }
4949
------
5757 sf->trans = NULL;
5858 }
5959
60 while ((f = sf->queue))
60 while ((f = sf->queue.head))
6161 {
62 sf->queue = f->next;
62 sf->queue.head = f->next;
6363 cw_fr_free(f);
6464 }
6565 cw_mutex_destroy(&(sf->lock));
------
6969 int cw_slinfactory_feed(struct cw_slinfactory *sf, struct cw_frame *f)
7070 {
7171 struct cw_frame *frame;
72 struct cw_frame *frame_ptr;
7372
7473 if (f == NULL)
7574 return 0;
------
104103 }
105104 if (frame)
106105 {
107 int x = 0;
106 int x = ++sf->queue.count;
108107
109108 frame->next = NULL;
110109
111 for (frame_ptr = sf->queue; frame_ptr && frame_ptr->next; frame_ptr=frame_ptr->next)
112 x++;
113 if (frame_ptr)
114 frame_ptr->next = frame;
115 else
116 sf->queue = frame;
110 if (sf->queue.tail)
111 sf->queue.tail->next = frame;
112 else
113 sf->queue.head = frame;
114 sf->queue.tail = frame;
117115 frame->next = NULL;
118116 sf->size += frame->datalen;
119117 cw_mutex_unlock(&(sf->lock));
------
161159 continue;
162160 }
163161
164 if (sofar >= bytes || (frame_ptr = sf->queue) == NULL)
162 if (sofar >= bytes || (frame_ptr = sf->queue.head) == NULL)
165163 break;
166164
167 sf->queue = frame_ptr->next;
165 sf->queue.head = frame_ptr->next;
166 if (NULL == sf->queue.head)
167 sf->queue.tail = NULL;
168 --sf->queue.count;
168169 frame_data = frame_ptr->data;
169170
170171 if (frame_ptr->datalen <= ineed)

callweaver/branches/karvan/include/callweaver/slinfactory.h (unified diff)

r4723r5022
3535 #endif
3636
3737 struct cw_slinfactory {
38 struct cw_frame *queue;
38 struct {
39 struct cw_frame *head;
40 struct cw_frame *tail;
41 unsigned count;
42 } queue;
3943 struct cw_trans_pvt *trans;
4044 short hold[1280];
4145 short *offset;