2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 15:05:23 +00:00

Use isc_app_run() and isc_app_block() instead of condition variables.

This commit is contained in:
Brian Wellington
2000-09-01 23:43:55 +00:00
parent 5f01e77fc2
commit b266f8fc42

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: nslookup.c,v 1.40 2000/09/01 22:45:16 bwelling Exp $ */ /* $Id: nslookup.c,v 1.41 2000/09/01 23:43:55 bwelling Exp $ */
#include <config.h> #include <config.h>
@@ -26,8 +26,7 @@ extern int h_errno;
#include <isc/app.h> #include <isc/app.h>
#include <isc/buffer.h> #include <isc/buffer.h>
#include <isc/commandline.h> #include <isc/commandline.h>
#include <isc/condition.h> #include <isc/event.h>
#include <isc/mutex.h>
#include <isc/string.h> #include <isc/string.h>
#include <isc/timer.h> #include <isc/timer.h>
#include <isc/util.h> #include <isc/util.h>
@@ -61,6 +60,7 @@ extern int lookup_counter;
extern char fixeddomain[MXNAME]; extern char fixeddomain[MXNAME];
extern int exitcode; extern int exitcode;
extern isc_taskmgr_t *taskmgr; extern isc_taskmgr_t *taskmgr;
extern isc_task_t *global_task;
extern char *progname; extern char *progname;
isc_boolean_t short_form = ISC_TRUE, printcmd = ISC_TRUE, isc_boolean_t short_form = ISC_TRUE, printcmd = ISC_TRUE,
@@ -75,11 +75,10 @@ isc_boolean_t identify = ISC_FALSE,
section_answer = ISC_TRUE, section_authority = ISC_TRUE, section_answer = ISC_TRUE, section_authority = ISC_TRUE,
section_additional = ISC_TRUE, recurse = ISC_TRUE, section_additional = ISC_TRUE, recurse = ISC_TRUE,
defname = ISC_TRUE, aaonly = ISC_FALSE; defname = ISC_TRUE, aaonly = ISC_FALSE;
isc_mutex_t lock;
isc_condition_t cond;
isc_boolean_t busy = ISC_FALSE, in_use = ISC_FALSE; isc_boolean_t busy = ISC_FALSE, in_use = ISC_FALSE;
char defclass[MXRD] = "IN"; char defclass[MXRD] = "IN";
char deftype[MXRD] = "A"; char deftype[MXRD] = "A";
isc_event_t *global_event = NULL;
static const char *rcodetext[] = { static const char *rcodetext[] = {
"NOERROR", "NOERROR",
@@ -146,6 +145,9 @@ static const char *rtypetext[] = {
"optional = "}; /* 41 */ "optional = "}; /* 41 */
static void flush_lookup_list(void);
static void getinput(isc_task_t *task, isc_event_t *event);
static void static void
show_usage(void) { show_usage(void) {
fputs("Usage:\n", stderr); fputs("Usage:\n", stderr);
@@ -153,12 +155,17 @@ show_usage(void) {
void void
dighost_shutdown(void) { dighost_shutdown(void) {
isc_event_t *event = global_event;
flush_lookup_list();
debug("dighost_shutdown()"); debug("dighost_shutdown()");
LOCK(&lock);
busy = ISC_FALSE; if (!in_use) {
debug("signalling out"); isc_app_shutdown();
isc_condition_signal(&cond); return;
UNLOCK(&lock); }
isc_task_send(global_task, &event);
} }
void void
@@ -702,7 +709,7 @@ static void
flush_server_list(void) { flush_server_list(void) {
dig_server_t *s, *ps; dig_server_t *s, *ps;
debug("flush_lookup_list()"); debug("flush_server_list()");
s = ISC_LIST_HEAD(server_list); s = ISC_LIST_HEAD(server_list);
while (s != NULL) { while (s != NULL) {
ps = s; ps = s;
@@ -846,6 +853,20 @@ flush_lookup_list(void) {
} }
} }
static void
getinput(isc_task_t *task, isc_event_t *event) {
UNUSED(task);
if (global_event == NULL)
global_event = event;
isc_app_block();
get_next_command();
isc_app_unblock();
if (ISC_LIST_HEAD(lookup_list) != NULL)
start_lookup();
else
isc_app_shutdown();
}
int int
main(int argc, char **argv) { main(int argc, char **argv) {
isc_result_t result; isc_result_t result;
@@ -854,13 +875,11 @@ main(int argc, char **argv) {
ISC_LIST_INIT(server_list); ISC_LIST_INIT(server_list);
ISC_LIST_INIT(search_list); ISC_LIST_INIT(search_list);
result = isc_app_start();
check_result(result, "isc_app_start");
setup_libs(); setup_libs();
progname = argv[0]; progname = argv[0];
result = isc_mutex_init(&lock);
check_result(result, "isc_mutex_init");
result = isc_condition_init(&cond);
check_result(result, "isc_condition_init");
LOCK(&lock);
parse_args(argc, argv); parse_args(argc, argv);
@@ -872,49 +891,22 @@ main(int argc, char **argv) {
} }
setup_system(); setup_system();
if (in_use) { if (in_use)
busy = ISC_TRUE; result = isc_app_onrun(mctx, global_task, onrun_callback,
start_lookup(); NULL);
while (busy) { else
result = isc_condition_wait(&cond, &lock); result = isc_app_onrun(mctx, global_task, getinput, NULL);
check_result(result, "isc_condition_wait"); check_result(result, "isc_app_onrun");
} in_use = ISC_TF(!in_use);
flush_lookup_list();
in_use = ISC_FALSE;
} else {
show_settings(ISC_FALSE);
in_use = ISC_TRUE;
}
while (in_use) { (void)isc_app_run();
get_next_command();
if (ISC_LIST_HEAD(lookup_list) != NULL) {
busy = ISC_TRUE;
start_lookup();
while (busy) {
result = isc_condition_wait(&cond, &lock);
check_result(result, "isc_condition_wait");
}
debug("out of the condition wait");
flush_lookup_list();
}
}
puts(""); puts("");
debug("done, and starting to shut down"); debug("done, and starting to shut down");
if (global_event != NULL)
isc_event_free(&global_event);
destroy_libs(); destroy_libs();
UNLOCK(&lock);
DESTROYLOCK(&lock);
isc_condition_destroy(&cond);
if (taskmgr != NULL) {
debug("freeing taskmgr");
isc_taskmgr_destroy(&taskmgr);
}
if (isc_mem_debugging != 0)
isc_mem_stats(mctx, stderr);
isc_app_finish(); isc_app_finish();
if (mctx != NULL)
isc_mem_destroy(&mctx);
return (0); return (0);
} }