Browse Source

*** empty log message ***

master rel-1.6
Marc Alexander Lehmann 14 years ago
parent
commit
67ffe0b273
  1. 46
      ev.c
  2. 2
      ev_epoll.c
  3. 4
      ev_kqueue.c
  4. 2
      ev_port.c

46
ev.c

@ -398,23 +398,44 @@ ev_now (EV_P)
}
#endif
#define array_roundsize(type,n) (((n) | 4) & ~3)
int inline_size
array_nextsize (int elem, int cur, int cnt)
{
int ncur = cur + 1;
do
ncur <<= 1;
while (cnt > ncur);
/* if size > 4096, round to 4096 - 4 * longs to accomodate malloc overhead */
if (elem * ncur > 4096)
{
ncur *= elem;
ncur = (ncur + elem + 4095 + sizeof (void *) * 4) & ~4095;
ncur = ncur - sizeof (void *) * 4;
ncur /= elem;
}
return ncur;
}
inline_speed void *
array_realloc (int elem, void *base, int *cur, int cnt)
{
*cur = array_nextsize (elem, *cur, cnt);
return ev_realloc (base, elem * *cur);
}
#define array_needsize(type,base,cur,cnt,init) \
if (expect_false ((cnt) > cur)) \
if (expect_false ((cnt) > (cur))) \
{ \
int newcnt = cur; \
do \
{ \
newcnt = array_roundsize (type, newcnt << 1); \
} \
while ((cnt) > newcnt); \
\
base = (type *)ev_realloc (base, sizeof (type) * (newcnt));\
init (base + cur, newcnt - cur); \
cur = newcnt; \
int ocur_ = (cur); \
(base) = (type *)array_realloc \
(sizeof (type), (base), &(cur), (cnt)); \
init ((base) + (ocur_), (cur) - ocur_); \
}
#if 0
#define array_slim(type,stem) \
if (stem ## max < array_roundsize (stem ## cnt >> 2)) \
{ \
@ -422,6 +443,7 @@ ev_now (EV_P)
base = (type *)ev_realloc (base, sizeof (type) * (stem ## max));\
fprintf (stderr, "slimmed down " # stem " to %d\n", stem ## max);/*D*/\
}
#endif
#define array_free(stem, idx) \
ev_free (stem ## s idx); stem ## cnt idx = stem ## max idx = 0;

2
ev_epoll.c

@ -74,7 +74,7 @@ epoll_poll (EV_P_ ev_tstamp timeout)
if (expect_false (eventcnt == epoll_eventmax))
{
ev_free (epoll_events);
epoll_eventmax = array_roundsize (epoll_events, epoll_eventmax << 1);
epoll_eventmax = array_nextsize (sizeof (struct epoll_event), epoll_eventmax, epoll_eventmax + 1);
epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax);
}
}

4
ev_kqueue.c

@ -83,7 +83,7 @@ kqueue_poll (EV_P_ ev_tstamp timeout)
if (kqueue_changecnt > kqueue_eventmax)
{
ev_free (kqueue_events);
kqueue_eventmax = array_roundsize (struct kevent, kqueue_changecnt);
kqueue_eventmax = array_nextsize (sizeof (struct kevent), kqueue_eventmax, kqueue_changecnt);
kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax);
}
@ -137,7 +137,7 @@ kqueue_poll (EV_P_ ev_tstamp timeout)
if (expect_false (res == kqueue_eventmax))
{
ev_free (kqueue_events);
kqueue_eventmax = array_roundsize (struct kevent, kqueue_eventmax << 1);
kqueue_eventmax = array_nextsize (sizeof (struct kevent), kqueue_eventmax, kqueue_eventmax + 1);
kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax);
}
}

2
ev_port.c

@ -103,7 +103,7 @@ port_poll (EV_P_ ev_tstamp timeout)
if (expect_false (nget == port_eventmax))
{
ev_free (port_events);
port_eventmax = array_roundsize (port_event_t, port_eventmax << 1);
port_eventmax = array_nextsize (sizeof (port_event_t), port_eventmax, port_eventmax + 1);
port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax);
}
}

Loading…
Cancel
Save