Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/isc import isc specific functions from bind9.



details:   https://anonhg.NetBSD.org/src/rev/b5c586e7fc16
branches:  trunk
changeset: 566783:b5c586e7fc16
user:      christos <christos%NetBSD.org@localhost>
date:      Thu May 20 19:34:32 2004 +0000

description:
import isc specific functions from bind9.

diffstat:

 lib/libc/isc/assertions.c |   93 ++++++++
 lib/libc/isc/ev_streams.c |  308 ++++++++++++++++++++++++++++
 lib/libc/isc/ev_timers.c  |  499 ++++++++++++++++++++++++++++++++++++++++++++++
 lib/libc/isc/eventlib_p.h |  221 ++++++++++++++++++++
 4 files changed, 1121 insertions(+), 0 deletions(-)

diffs (truncated from 1137 to 300 lines):

diff -r 9b7c7c874498 -r b5c586e7fc16 lib/libc/isc/assertions.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/isc/assertions.c Thu May 20 19:34:32 2004 +0000
@@ -0,0 +1,93 @@
+/*     $NetBSD: assertions.c,v 1.1.1.1 2004/05/20 19:34:32 christos Exp $      */
+
+/*
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1997,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#if !defined(LINT) && !defined(CODECENTER)
+static const char rcsid[] = "Id: assertions.c,v 1.1.206.1 2004/03/09 08:33:39 marka Exp";
+#endif
+
+#include "port_before.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <isc/assertions.h>
+
+#include "port_after.h"
+
+/*
+ * Forward.
+ */
+
+static void default_assertion_failed(const char *, int, assertion_type,
+                                    const char *, int);
+
+/*
+ * Public.
+ */
+
+assertion_failure_callback __assertion_failed = default_assertion_failed;
+
+void
+set_assertion_failure_callback(assertion_failure_callback f) {
+       if (f == NULL)
+               __assertion_failed = default_assertion_failed;
+       else
+               __assertion_failed = f;
+}
+
+const char *
+assertion_type_to_text(assertion_type type) {
+       const char *result;
+
+       switch (type) {
+       case assert_require:
+               result = "REQUIRE";
+               break;
+       case assert_ensure:
+               result = "ENSURE";
+               break;
+       case assert_insist:
+               result = "INSIST";
+               break;
+       case assert_invariant:
+               result = "INVARIANT";
+               break;
+       default:
+               result = NULL;
+       }
+       return (result);
+}
+
+/*
+ * Private.
+ */
+
+static void
+default_assertion_failed(const char *file, int line, assertion_type type,
+                        const char *cond, int print_errno)
+{
+       fprintf(stderr, "%s:%d: %s(%s)%s%s failed.\n",
+               file, line, assertion_type_to_text(type), cond,
+               (print_errno) ? ": " : "",
+               (print_errno) ? strerror(errno) : "");
+       abort();
+       /* NOTREACHED */
+}
diff -r 9b7c7c874498 -r b5c586e7fc16 lib/libc/isc/ev_streams.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/isc/ev_streams.c Thu May 20 19:34:32 2004 +0000
@@ -0,0 +1,308 @@
+/*     $NetBSD: ev_streams.c,v 1.1.1.1 2004/05/20 19:34:32 christos Exp $      */
+
+/*
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996-1999 by Internet Software Consortium
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* ev_streams.c - implement asynch stream file IO for the eventlib
+ * vix 04mar96 [initial]
+ */
+
+#if !defined(LINT) && !defined(CODECENTER)
+static const char rcsid[] = "Id: ev_streams.c,v 1.2.206.2 2004/03/17 00:29:51 marka Exp";
+#endif
+
+#include "port_before.h"
+#include "fd_setsize.h"
+
+#include <sys/types.h>
+#include <sys/uio.h>
+
+#include <errno.h>
+
+#include <isc/eventlib.h>
+#include <isc/assertions.h>
+#include "eventlib_p.h"
+
+#include "port_after.h"
+
+static int     copyvec(evStream *str, const struct iovec *iov, int iocnt);
+static void    consume(evStream *str, size_t bytes);
+static void    done(evContext opaqueCtx, evStream *str);
+static void    writable(evContext opaqueCtx, void *uap, int fd, int evmask);
+static void    readable(evContext opaqueCtx, void *uap, int fd, int evmask);
+
+struct iovec
+evConsIovec(void *buf, size_t cnt) {
+       struct iovec ret;
+
+       memset(&ret, 0xf5, sizeof ret);
+       ret.iov_base = buf;
+       ret.iov_len = cnt;
+       return (ret);
+}
+
+int
+evWrite(evContext opaqueCtx, int fd, const struct iovec *iov, int iocnt,
+       evStreamFunc func, void *uap, evStreamID *id)
+{
+       evContext_p *ctx = opaqueCtx.opaque;
+       evStream *new;
+       int save;
+
+       OKNEW(new);
+       new->func = func;
+       new->uap = uap;
+       new->fd = fd;
+       new->flags = 0;
+       if (evSelectFD(opaqueCtx, fd, EV_WRITE, writable, new, &new->file) < 0)
+               goto free;
+       if (copyvec(new, iov, iocnt) < 0)
+               goto free;
+       new->prevDone = NULL;
+       new->nextDone = NULL;
+       if (ctx->streams != NULL)
+               ctx->streams->prev = new;
+       new->prev = NULL;
+       new->next = ctx->streams;
+       ctx->streams = new;
+       if (id != NULL)
+               id->opaque = new;
+       return (0);
+ free:
+       save = errno;
+       FREE(new);
+       errno = save;
+       return (-1);
+}
+
+int
+evRead(evContext opaqueCtx, int fd, const struct iovec *iov, int iocnt,
+       evStreamFunc func, void *uap, evStreamID *id)
+{
+       evContext_p *ctx = opaqueCtx.opaque;
+       evStream *new;
+       int save;
+
+       OKNEW(new);
+       new->func = func;
+       new->uap = uap;
+       new->fd = fd;
+       new->flags = 0;
+       if (evSelectFD(opaqueCtx, fd, EV_READ, readable, new, &new->file) < 0)
+               goto free;
+       if (copyvec(new, iov, iocnt) < 0)
+               goto free;
+       new->prevDone = NULL;
+       new->nextDone = NULL;
+       if (ctx->streams != NULL)
+               ctx->streams->prev = new;
+       new->prev = NULL;
+       new->next = ctx->streams;
+       ctx->streams = new;
+       if (id)
+               id->opaque = new;
+       return (0);
+ free:
+       save = errno;
+       FREE(new);
+       errno = save;
+       return (-1);
+}
+
+int
+evTimeRW(evContext opaqueCtx, evStreamID id, evTimerID timer) /*ARGSUSED*/ {
+       evStream *str = id.opaque;
+
+       UNUSED(opaqueCtx);
+
+       str->timer = timer;
+       str->flags |= EV_STR_TIMEROK;
+       return (0);
+}
+
+int
+evUntimeRW(evContext opaqueCtx, evStreamID id) /*ARGSUSED*/ {
+       evStream *str = id.opaque;
+
+       UNUSED(opaqueCtx);
+
+       str->flags &= ~EV_STR_TIMEROK;
+       return (0);
+}
+
+int
+evCancelRW(evContext opaqueCtx, evStreamID id) {
+       evContext_p *ctx = opaqueCtx.opaque;
+       evStream *old = id.opaque;
+
+       /*
+        * The streams list is doubly threaded.  First, there's ctx->streams
+        * that's used by evDestroy() to find and cancel all streams.  Second,
+        * there's ctx->strDone (head) and ctx->strLast (tail) which thread
+        * through the potentially smaller number of "IO completed" streams,
+        * used in evGetNext() to avoid scanning the entire list.
+        */
+
+       /* Unlink from ctx->streams. */
+       if (old->prev != NULL)
+               old->prev->next = old->next;
+       else
+               ctx->streams = old->next;
+       if (old->next != NULL)
+               old->next->prev = old->prev;
+
+       /*
+        * If 'old' is on the ctx->strDone list, remove it.  Update
+        * ctx->strLast if necessary.
+        */
+       if (old->prevDone == NULL && old->nextDone == NULL) {
+               /*
+                * Either 'old' is the only item on the done list, or it's
+                * not on the done list.  If the former, then we unlink it
+                * from the list.  If the latter, we leave the list alone.
+                */
+               if (ctx->strDone == old) {
+                       ctx->strDone = NULL;
+                       ctx->strLast = NULL;
+               }
+       } else {
+               if (old->prevDone != NULL)
+                       old->prevDone->nextDone = old->nextDone;
+               else
+                       ctx->strDone = old->nextDone;
+               if (old->nextDone != NULL)
+                       old->nextDone->prevDone = old->prevDone;
+               else
+                       ctx->strLast = old->prevDone;
+       }
+
+       /* Deallocate the stream. */
+       if (old->file.opaque)
+               evDeselectFD(opaqueCtx, old->file);
+       memput(old->iovOrig, sizeof (struct iovec) * old->iovOrigCount);
+       FREE(old);
+       return (0);
+}



Home | Main Index | Thread Index | Old Index