mirror of
git://git.code.sf.net/p/dhcpd-pools/code
synced 2025-12-16 15:57:00 +00:00
make range allocation dynamic
This is a test fix after commit
5cbe8d07fb
to see what can be done. Truth is that not much. I could fix how
ranges are allocated, but the fact there is pointers to shared
networks and network names reallocating the memory spaces is not
really going to work. The only way to truly fix this issue is to
create better data structures. As you can expect that is a major
change, and will take some time to implement.
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
parent
f6880ed5f4
commit
b492802dfa
6 changed files with 33 additions and 17 deletions
|
|
@ -13,7 +13,7 @@
|
||||||
**
|
**
|
||||||
** You should have received a copy of the GNU General Public License
|
** You should have received a copy of the GNU General Public License
|
||||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef DEFAULTS_H
|
#ifndef DEFAULTS_H
|
||||||
# define DEFAULTS_H 1
|
# define DEFAULTS_H 1
|
||||||
|
|
@ -22,15 +22,12 @@
|
||||||
static const int MAXLEN = 1024;
|
static const int MAXLEN = 1024;
|
||||||
|
|
||||||
/* Total number of characters in all shared network names */
|
/* Total number of characters in all shared network names */
|
||||||
static const int SHARED_NETWORKS_NAMES = 65536;
|
static const unsigned int SHARED_NETWORKS_NAMES = 65536;
|
||||||
|
|
||||||
/* Maximum number of shared networks */
|
/* Maximum number of shared networks */
|
||||||
static const int SHARED_NETWORKS = 8192;
|
static const unsigned int SHARED_NETWORKS = 8192;
|
||||||
|
|
||||||
/* Maximum number of ranges */
|
/* Maximum number of ranges */
|
||||||
static const unsigned int RANGES = 65536;
|
unsigned int RANGES;
|
||||||
|
|
||||||
/* Merge sort split size */
|
#endif /* DEFAULTS_H */
|
||||||
static const int MIN_MERGE_SIZE = 8;
|
|
||||||
|
|
||||||
#endif /* DEFAULTS_H */
|
|
||||||
|
|
|
||||||
|
|
@ -213,6 +213,7 @@ int main(int argc, char **argv)
|
||||||
/* Global allocations, counter resets etc */
|
/* Global allocations, counter resets etc */
|
||||||
int prepare_memory()
|
int prepare_memory()
|
||||||
{
|
{
|
||||||
|
RANGES = 64;
|
||||||
num_ranges = num_shared_networks = 0;
|
num_ranges = num_shared_networks = 0;
|
||||||
shared_networks =
|
shared_networks =
|
||||||
safe_malloc(sizeof(struct shared_network_t) * SHARED_NETWORKS);
|
safe_malloc(sizeof(struct shared_network_t) * SHARED_NETWORKS);
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,7 @@ void *safe_malloc(const size_t size)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
void *safe_realloc(void *ptr, const size_t size);
|
||||||
char *safe_strdup(const char *str) __attribute__ ((nonnull(1)));
|
char *safe_strdup(const char *str) __attribute__ ((nonnull(1)));
|
||||||
void print_version(void) __attribute__ ((noreturn));
|
void print_version(void) __attribute__ ((noreturn));
|
||||||
void usage(int status) __attribute__ ((noreturn));
|
void usage(int status) __attribute__ ((noreturn));
|
||||||
|
|
|
||||||
|
|
@ -386,9 +386,14 @@ char *parse_config(int is_include, char *config_file,
|
||||||
range_p->backups = 0;
|
range_p->backups = 0;
|
||||||
range_p->shared_net = shared_p;
|
range_p->shared_net = shared_p;
|
||||||
num_ranges++;
|
num_ranges++;
|
||||||
if (RANGES < num_ranges) {
|
if (RANGES < num_ranges + 1) {
|
||||||
errx(EXIT_FAILURE,
|
RANGES *= 2;
|
||||||
"parse_config: increase default.h RANGES and recompile.");
|
ranges =
|
||||||
|
safe_realloc(ranges,
|
||||||
|
sizeof(struct
|
||||||
|
range_t) *
|
||||||
|
RANGES);
|
||||||
|
range_p = ranges + num_ranges;
|
||||||
}
|
}
|
||||||
newclause = true;
|
newclause = true;
|
||||||
break;
|
break;
|
||||||
|
|
@ -429,13 +434,14 @@ char *parse_config(int is_include, char *config_file,
|
||||||
errx(EXIT_FAILURE,
|
errx(EXIT_FAILURE,
|
||||||
"parse_config: increase default.h SHARED_NETWORKS_NAMES and recompile");
|
"parse_config: increase default.h SHARED_NETWORKS_NAMES and recompile");
|
||||||
}
|
}
|
||||||
if (SHARED_NETWORKS < num_shared_networks) {
|
if (SHARED_NETWORKS <
|
||||||
/* FIXME: make this go
|
num_shared_networks + 2) {
|
||||||
|
/* FIXME: make this
|
||||||
* away by reallocationg
|
* away by reallocationg
|
||||||
* more space. */
|
* more space. */
|
||||||
errx(EXIT_FAILURE,
|
errx(EXIT_FAILURE,
|
||||||
"parse_config: increase default.h SHARED_NETWORKS and recompile");
|
"parse_config: increase default.h SHARED_NETWORKS and recompile");
|
||||||
}
|
}
|
||||||
argument = 0;
|
argument = 0;
|
||||||
braces_shared = braces;
|
braces_shared = braces;
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
14
src/other.c
14
src/other.c
|
|
@ -41,7 +41,6 @@ extern char *malloc();
|
||||||
void *safe_malloc(const size_t size)
|
void *safe_malloc(const size_t size)
|
||||||
{
|
{
|
||||||
void *ret = malloc(size);
|
void *ret = malloc(size);
|
||||||
|
|
||||||
if (ret == NULL) {
|
if (ret == NULL) {
|
||||||
err(EXIT_FAILURE,
|
err(EXIT_FAILURE,
|
||||||
"safe_malloc: cannot allocate %lu bytes: ", size);
|
"safe_malloc: cannot allocate %lu bytes: ", size);
|
||||||
|
|
@ -50,6 +49,17 @@ void *safe_malloc(const size_t size)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Simple memory reallocation wrapper */
|
||||||
|
void *safe_realloc(void *ptr, const size_t size)
|
||||||
|
{
|
||||||
|
void *ret = realloc(ptr, size);
|
||||||
|
|
||||||
|
if (!ret && size)
|
||||||
|
err(EXIT_FAILURE,
|
||||||
|
"safe_realloc: cannot allocate %zu bytes", size);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Simple strdup wrapper */
|
/* Simple strdup wrapper */
|
||||||
char *safe_strdup(const char *str)
|
char *safe_strdup(const char *str)
|
||||||
{
|
{
|
||||||
|
|
@ -108,7 +118,7 @@ void print_version(void)
|
||||||
"This is free software: you are free to change and redistribute it.\n");
|
"This is free software: you are free to change and redistribute it.\n");
|
||||||
fprintf(stdout,
|
fprintf(stdout,
|
||||||
"There is NO WARRANTY, to the extent permitted by law.\n");
|
"There is NO WARRANTY, to the extent permitted by law.\n");
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void usage(int status)
|
void usage(int status)
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,6 @@
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
|
|
||||||
#include "dhcpd-pools.h"
|
#include "dhcpd-pools.h"
|
||||||
#include "defaults.h"
|
|
||||||
|
|
||||||
/* Sort functions for range sorting */
|
/* Sort functions for range sorting */
|
||||||
int intcomp(const void *x, const void *y)
|
int intcomp(const void *x, const void *y)
|
||||||
|
|
@ -167,6 +166,8 @@ void mergesort_ranges(struct range_t *orig, int size, struct range_t *temp)
|
||||||
{
|
{
|
||||||
int left, right, i;
|
int left, right, i;
|
||||||
struct range_t hold;
|
struct range_t hold;
|
||||||
|
/* Merge sort split size */
|
||||||
|
static const int MIN_MERGE_SIZE = 8;
|
||||||
|
|
||||||
if (size < MIN_MERGE_SIZE) {
|
if (size < MIN_MERGE_SIZE) {
|
||||||
for (left = 0; left < size; left++) {
|
for (left = 0; left < size; left++) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue