summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <sandmann@redhat.com>2009-08-22 00:40:06 -0400
committerSøren Sandmann Pedersen <sandmann@redhat.com>2009-08-22 00:40:06 -0400
commitf61470d0bf5a9473e6faf54b7241126cc217c426 (patch)
treec0ba0b37cb85428b208d25cec1c021ca40f8224e
parentba8d2b59c5fb4dee638cae30001521fb0be4e6bf (diff)
Add array_set_size() methods; port nul_poll to use it
-rw-r--r--TODO2
-rw-r--r--array.c22
-rw-r--r--epoll.c16
-rw-r--r--libnul.h14
4 files changed, 40 insertions, 14 deletions
diff --git a/TODO b/TODO
index 9f40ffc..31da25b 100644
--- a/TODO
+++ b/TODO
@@ -210,7 +210,7 @@ Things from glib:
- gstring.h Should probably be replaced with byte array
(which in turn must get equivalent API to
gstring)
- Is GStringChunk useful?
+ Is GStringChunk useful? probably not
- gthreadpool.h maybe (replace with executor?)
- gasyncqueue.h probably
- G*Array Direct pointers, byte queue
diff --git a/array.c b/array.c
index 5fdd721..aacd911 100644
--- a/array.c
+++ b/array.c
@@ -239,6 +239,22 @@ array_remove (void *data,
return array->data;
}
+static void *
+array_set_size (void *data,
+ const int *magic,
+ gsize n_elements)
+{
+ array_t *array = get_array (data, magic);
+
+ array = realloc_array (array, n_elements);
+
+ array->n_elements = n_elements;
+
+ nul_terminate (array);
+
+ return array->data;
+}
+
static gssize
array_len (const void *data, const int *magic)
{
@@ -306,6 +322,12 @@ nul_garray_remove_fast (nul_ptr_t arr, nul_ptr_t element)
return array_remove (arr, &arr_t_magic, element, TRUE);
}
+nul_ptr_t
+nul_garray_set_size (nul_ptr_t arr, gsize n_elements)
+{
+ return array_set_size (arr, &arr_t_magic, n_elements);
+}
+
/*
* Strings
*/
diff --git a/epoll.c b/epoll.c
index c32d59a..fb0e8cb 100644
--- a/epoll.c
+++ b/epoll.c
@@ -14,7 +14,6 @@ struct FdInfo
struct nul_poll_t
{
int n_fds;
- gsize n_fd_infos;
FdInfo * fd_info;
};
@@ -24,8 +23,7 @@ nul_poll_new (void)
nul_poll_t *nul_poll = g_new0 (nul_poll_t, 1);
nul_poll->n_fds = 0;
- nul_poll->n_fd_infos = 1;
- nul_poll->fd_info = g_new0 (FdInfo, 1);
+ nul_poll->fd_info = nul_array_new (FdInfo);
return nul_poll;
}
@@ -40,10 +38,8 @@ nul_poll_add_fd (nul_poll_t *nul_poll,
mask &= (NUL_POLL_RESERVED - 1);
- while (fd >= nul_poll->n_fd_infos)
- nul_poll->n_fd_infos *= 2;
-
- nul_poll->fd_info = g_renew (FdInfo, nul_poll->fd_info, nul_poll->n_fd_infos);
+ while (fd >= nul_array_len (nul_poll->fd_info))
+ nul_poll->fd_info = nul_array_set_size (nul_poll->fd_info, fd + 1);
nul_poll->n_fds++;
@@ -59,7 +55,9 @@ nul_poll_has_fd (nul_poll_t *nul_poll,
{
g_return_val_if_fail (nul_poll != NULL, FALSE);
- return (fd < nul_poll->n_fd_infos && nul_poll->fd_info[fd].valid);
+ return
+ fd < nul_array_len (nul_poll->fd_info) &&
+ nul_poll->fd_info[fd].valid;
}
gint
@@ -114,7 +112,7 @@ nul_poll_wait (nul_poll_t *nul_poll,
fds = g_new (struct pollfd, nul_poll->n_fds);
j = 0;
- for (i = 0; i < nul_poll->n_fd_infos; ++i)
+ for (i = 0; i < nul_array_len (nul_poll->fd_info); ++i)
{
if (nul_poll->fd_info[i].valid &&
nul_poll->fd_info[i].enabled &&
diff --git a/libnul.h b/libnul.h
index 02cfd98..5a27380 100644
--- a/libnul.h
+++ b/libnul.h
@@ -60,7 +60,8 @@ nul_ptr_t nul_garray_new_prefix (int element_size, int prefix_size) NUL_UR;
nul_ptr_t nul_garray_append (nul_ptr_t array, nul_ptr_t element) NUL_UR;
nul_ptr_t nul_garray_remove (nul_ptr_t array, nul_ptr_t element) NUL_UR;
nul_ptr_t nul_garray_remove_fast (nul_ptr_t array, nul_ptr_t element) NUL_UR;
-gsize nul_garray_len (nul_ptr_t array);
+nul_ptr_t nul_garray_set_size (nul_ptr_t array, gsize n_elements) NUL_UR;
+gsize nul_garray_len (nul_ptr_t array); /* In number of elements */
void nul_garray_free (nul_ptr_t array);
#define nul_array_new(type) _nul_array_new_impl(type)
@@ -69,6 +70,7 @@ void nul_garray_free (nul_ptr_t array);
#define nul_array_remove_fast(array,value) _nul_array_remove_fast_impl(array,value)
#define nul_array_len(array) nul_garray_len(array)
#define nul_array_free(array) nul_garray_free(array)
+#define nul_array_set_size(array,size) nul_garray_set_size(array,size);
#define nul_prefix_array_new(type,member) \
_nul_prefix_array_new_impl(type,member)
@@ -82,6 +84,8 @@ void nul_garray_free (nul_ptr_t array);
_nul_prefix_array_len_impl(array,member)
#define nul_prefix_array_free(array,member) \
_nul_prefix_array_free_impl(array,member)
+#define nul_prefix_array_set_size(array,member,size) \
+ _nul_prefix_array_set_size_impl(array,member,size)
/*
* Strings
@@ -407,12 +411,14 @@ void nul_dbus_invoke (nul_dbus_service_t *service,
nul_garray_len(array); \
})
+#define _nul_prefix_array_set_size_impl(array,member,size) \
+ ({ (void)((array)->member); \
+ nul_garray_set_size(array,size); \
+ })
+
#define _nul_prefix_array_free_impl(array,member) \
({ (void)((array)->member); \
nul_garray_free(array); \
})
-
-
-
#endif