summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ev.c46
-rw-r--r--ev_epoll.c2
-rw-r--r--ev_kqueue.c4
-rw-r--r--ev_port.c2
4 files changed, 38 insertions, 16 deletions
diff --git a/ev.c b/ev.c
index 8cb6141..87ae810 100644
--- a/ev.c
+++ b/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;
diff --git a/ev_epoll.c b/ev_epoll.c
index 54a4ccb..38fd304 100644
--- a/ev_epoll.c
+++ b/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);
}
}
diff --git a/ev_kqueue.c b/ev_kqueue.c
index afd3f9c..4fd649f 100644
--- a/ev_kqueue.c
+++ b/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);
}
}
diff --git a/ev_port.c b/ev_port.c
index db3bae5..169181d 100644
--- a/ev_port.c
+++ b/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);
}
}