2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 06:55:30 +00:00

checkpoint

This commit is contained in:
Bob Halley
1998-08-18 00:29:57 +00:00
parent 3a6202f163
commit 0dbe3d9c27
3 changed files with 91 additions and 68 deletions

View File

@@ -1,4 +1,6 @@
#include "attribute.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
@@ -7,8 +9,11 @@
#include "task.h" #include "task.h"
/*ARGSUSED*/ /*ARGSUSED*/
boolean_t static boolean_t
my_callback(task_t task, void *arg, generic_event_t event) { my_callback(task_t __attribute__((unused)) task,
void *arg,
generic_event_t __attribute__((unused)) event)
{
int i, j; int i, j;
char *name = arg; char *name = arg;
@@ -21,32 +26,17 @@ my_callback(task_t task, void *arg, generic_event_t event) {
} }
/*ARGSUSED*/ /*ARGSUSED*/
boolean_t static boolean_t
my_shutdown(task_t task, void *arg, generic_event_t event) { my_shutdown(task_t __attribute__((unused)) task,
void *arg,
generic_event_t __attribute__((unused)) event)
{
char *name = arg; char *name = arg;
printf("shutdown %s\n", name); printf("shutdown %s\n", name);
return (TRUE); return (TRUE);
} }
generic_event_t
event_allocate(mem_context_t mctx, event_type_t type, event_action_t action,
size_t size) {
generic_event_t event;
if (size < sizeof *event)
return (NULL);
event = mem_get(mctx, size);
if (event == NULL)
return (NULL);
event->mctx = mctx;
event->size = size;
event->type = type;
event->action = action;
return (event);
}
void void
main(int argc, char *argv[]) { main(int argc, char *argv[]) {
mem_context_t mctx = NULL; mem_context_t mctx = NULL;
@@ -65,23 +55,23 @@ main(int argc, char *argv[]) {
INSIST(task_manager_create(mctx, workers, 0, &manager) == workers); INSIST(task_manager_create(mctx, workers, 0, &manager) == workers);
INSIST(task_allocate(manager, "1", my_shutdown, 0, &t1)); INSIST(task_create(manager, "1", my_shutdown, 0, &t1));
INSIST(task_allocate(manager, "2", my_shutdown, 0, &t2)); INSIST(task_create(manager, "2", my_shutdown, 0, &t2));
event = event_allocate(mctx, 1, my_callback, sizeof *event); event = event_get(mctx, 1, my_callback, sizeof *event);
task_send_event(t1, event); task_send_event(t1, event);
event = event_allocate(mctx, 1, my_callback, sizeof *event); event = event_get(mctx, 1, my_callback, sizeof *event);
task_send_event(t2, event); task_send_event(t2, event);
event = event_allocate(mctx, 1, my_callback, sizeof *event); event = event_get(mctx, 1, my_callback, sizeof *event);
task_send_event(t1, event); task_send_event(t1, event);
event = event_allocate(mctx, 1, my_callback, sizeof *event); event = event_get(mctx, 1, my_callback, sizeof *event);
task_send_event(t2, event); task_send_event(t2, event);
event = event_allocate(mctx, 1, my_callback, sizeof *event); event = event_get(mctx, 1, my_callback, sizeof *event);
task_send_event(t1, event); task_send_event(t1, event);
event = event_allocate(mctx, 1, my_callback, sizeof *event); event = event_get(mctx, 1, my_callback, sizeof *event);
task_send_event(t2, event); task_send_event(t2, event);
event = event_allocate(mctx, 1, my_callback, sizeof *event); event = event_get(mctx, 1, my_callback, sizeof *event);
task_send_event(t1, event); task_send_event(t1, event);
event = event_allocate(mctx, 1, my_callback, sizeof *event); event = event_get(mctx, 1, my_callback, sizeof *event);
task_send_event(t2, event); task_send_event(t2, event);
task_shutdown(t1); task_shutdown(t1);

View File

@@ -15,8 +15,6 @@
* SOFTWARE. * SOFTWARE.
*/ */
/* #include "port_before.h" */
#include <sys/types.h> #include <sys/types.h>
#include <stdio.h> #include <stdio.h>
@@ -30,10 +28,8 @@
#include "mutex.h" #include "mutex.h"
#include "memcluster.h" #include "memcluster.h"
/* #include "port_after.h" */
#if !defined(LINT) && !defined(CODECENTER) #if !defined(LINT) && !defined(CODECENTER)
static char rcsid[] __attribute__((unused)) = "$Id: mem.c,v 1.1 1998/08/17 22:05:58 halley Exp $"; static char rcsid[] __attribute__((unused)) = "$Id: mem.c,v 1.2 1998/08/18 00:29:53 halley Exp $";
#endif /* not lint */ #endif /* not lint */
/* /*
@@ -52,16 +48,16 @@ typedef struct {
} *size_info; } *size_info;
struct stats { struct stats {
u_long gets; unsigned long gets;
u_long totalgets; unsigned long totalgets;
u_long blocks; unsigned long blocks;
u_long freefrags; unsigned long freefrags;
}; };
#ifdef MEMCLUSTER_RANGES #ifdef MEMCLUSTER_RANGES
typedef struct range { typedef struct range {
u_char * first; unsigned char * first;
u_char * last; unsigned char * last;
struct range * next; struct range * next;
} range; } range;
#endif #endif
@@ -75,8 +71,8 @@ struct mem_context {
range * ranges; range * ranges;
range * freeranges; range * freeranges;
#else #else
u_char * lowest; unsigned char * lowest;
u_char * highest; unsigned char * highest;
#endif #endif
struct stats * stats; struct stats * stats;
os_mutex_t mutex; os_mutex_t mutex;
@@ -196,12 +192,12 @@ __mem_get(mem_context_t ctx, size_t size) {
int i, frags; int i, frags;
size_t total_size; size_t total_size;
void *new; void *new;
u_char *curr, *next; unsigned char *curr, *next;
u_char *first; unsigned char *first;
#ifdef MEMCLUSTER_RANGES #ifdef MEMCLUSTER_RANGES
range *r; range *r;
#else #else
u_char *last; unsigned char *last;
#endif #endif
if (ctx->basic_blocks == NULL) { if (ctx->basic_blocks == NULL) {
@@ -340,7 +336,7 @@ __mem_get_debug(mem_context_t ctx, size_t size, const char *file, int line) {
void *ptr; void *ptr;
ptr = __mem_get(ctx, size); ptr = __mem_get(ctx, size);
fprintf(stderr, "%s:%d: mem_get(%p, %lu) -> %p\n", file, line, fprintf(stderr, "%s:%d: mem_get(%p, %lu) -> %p\n", file, line,
ctx, (u_long)size, ptr); ctx, (unsigned long)size, ptr);
return (ptr); return (ptr);
} }
@@ -349,7 +345,7 @@ __mem_put_debug(mem_context_t ctx, void *ptr, size_t size, const char *file,
int line) int line)
{ {
fprintf(stderr, "%s:%d: mem_put(%p, %p, %lu)\n", file, line, fprintf(stderr, "%s:%d: mem_put(%p, %p, %lu)\n", file, line,
ctx, ptr, (u_long)size); ctx, ptr, (unsigned long)size);
__mem_put(ctx, ptr, size); __mem_put(ctx, ptr, size);
} }
@@ -383,7 +379,7 @@ mem_stats(mem_context_t ctx, FILE *out) {
int int
mem_valid(mem_context_t ctx, void *ptr) { mem_valid(mem_context_t ctx, void *ptr) {
u_char *cp = ptr; unsigned char *cp = ptr;
int ret; int ret;
#ifdef MEMCLUSTER_RANGES #ifdef MEMCLUSTER_RANGES
range *r; range *r;
@@ -475,14 +471,14 @@ __memget_debug(size_t size, const char *file, int line) {
void *ptr; void *ptr;
ptr = __memget(size); ptr = __memget(size);
fprintf(stderr, "%s:%d: memget(%lu) -> %p\n", file, line, fprintf(stderr, "%s:%d: memget(%lu) -> %p\n", file, line,
(u_long)size, ptr); (unsigned long)size, ptr);
return (ptr); return (ptr);
} }
void void
__memput_debug(void *ptr, size_t size, const char *file, int line) { __memput_debug(void *ptr, size_t size, const char *file, int line) {
fprintf(stderr, "%s:%d: memput(%p, %lu)\n", file, line, fprintf(stderr, "%s:%d: memput(%p, %lu)\n", file, line,
ptr, (u_long)size); ptr, (unsigned long)size);
__memput(ptr, size); __memput(ptr, size);
} }

View File

@@ -1,4 +1,6 @@
#include "attribute.h"
#include <isc/assertions.h> #include <isc/assertions.h>
#include "task.h" #include "task.h"
@@ -24,6 +26,37 @@
#define XTRACE(m) #define XTRACE(m)
#endif #endif
/***
*** Tasks.
***/
void *
event_get(mem_context_t mctx, event_type_t type, event_action_t action,
size_t size) {
generic_event_t event;
if (size < sizeof *event)
return (NULL);
event = mem_get(mctx, size);
if (event == NULL)
return (NULL);
event->mctx = mctx;
event->size = size;
event->type = type;
event->action = action;
return (event);
}
void
event_put(void *target) {
generic_event_t event = target;
mem_put(event->mctx, event, event->size);
}
/*** /***
*** Tasks. *** Tasks.
***/ ***/
@@ -53,9 +86,9 @@ task_free(task_t task) {
} }
boolean_t boolean_t
task_allocate(task_manager_t manager, void *arg, task_create(task_manager_t manager, void *arg,
event_action_t shutdown_action, unsigned int quantum, event_action_t shutdown_action, unsigned int quantum,
task_t *taskp) task_t *taskp)
{ {
task_t task; task_t task;
@@ -105,7 +138,7 @@ task_attach(task_t task, task_t *taskp) {
return (TRUE); return (TRUE);
} }
boolean_t void
task_detach(task_t *taskp) { task_detach(task_t *taskp) {
boolean_t free_task = FALSE; boolean_t free_task = FALSE;
task_manager_t manager; task_manager_t manager;
@@ -132,8 +165,6 @@ task_detach(task_t *taskp) {
task_free(task); task_free(task);
*taskp = NULL; *taskp = NULL;
return (TRUE);
} }
boolean_t boolean_t
@@ -165,7 +196,7 @@ task_send_event(task_t task, generic_event_t event) {
UNLOCK(&task->lock); UNLOCK(&task->lock);
if (discard) { if (discard) {
mem_put(event->mctx, event, event->size); event_put(event);
return (TRUE); return (TRUE);
} }
@@ -213,7 +244,7 @@ task_send_event(task_t task, generic_event_t event) {
return (TRUE); return (TRUE);
} }
boolean_t void
task_shutdown(task_t task) { task_shutdown(task_t task) {
boolean_t was_idle = FALSE; boolean_t was_idle = FALSE;
boolean_t discard = FALSE; boolean_t discard = FALSE;
@@ -239,7 +270,7 @@ task_shutdown(task_t task) {
UNLOCK(&task->lock); UNLOCK(&task->lock);
if (discard) if (discard)
return (TRUE); return;
if (was_idle) { if (was_idle) {
boolean_t need_wakeup = FALSE; boolean_t need_wakeup = FALSE;
@@ -256,10 +287,18 @@ task_shutdown(task_t task) {
if (need_wakeup) if (need_wakeup)
BROADCAST(&manager->work_available); BROADCAST(&manager->work_available);
} }
return (TRUE);
} }
void
task_destroy(task_t *taskp) {
REQUIRE(taskp != NULL);
task_shutdown(*taskp);
task_detach(taskp);
}
/*** /***
*** Task Manager. *** Task Manager.
@@ -403,8 +442,7 @@ void *task_manager_run(void *uap) {
* callback returned. * callback returned.
*/ */
if (event != NULL) if (event != NULL)
mem_put(event->mctx, event, event_put(event);
event->size);
else else
wants_shutdown = TRUE; wants_shutdown = TRUE;
@@ -465,8 +503,7 @@ void *task_manager_run(void *uap) {
event != NULL; event != NULL;
event = next_event) { event = next_event) {
next_event = NEXT(event, link); next_event = NEXT(event, link);
mem_put(event->mctx, event, event_put(event);
event->size);
} }
} }