pkgsrc-Bugs archive

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

Re: pkg/42345



The following reply was made to PR pkg/42345; it has been noted by GNATS.

From: Rumko <rumcic%gmail.com@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: 
Subject: Re: pkg/42345
Date: Wed, 15 Sep 2010 15:13:10 +0200

 --nextPart6213344.iNP4UXOa43
 Content-Type: multipart/mixed;
   boundary="Boundary-01=_mZMkMrzoA4aXdcv"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 --Boundary-01=_mZMkMrzoA4aXdcv
 Content-Type: text/plain;
   charset="utf-8"
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: inline
 
 An updated patch attached, since I have been informed, that the one from th=
 e=20
 PR does not apply cleanly anymore.
 =2D-=20
 Regards,
 Rumko
 
 --Boundary-01=_mZMkMrzoA4aXdcv
 Content-Type: text/plain;
   charset="iso 8859-15";
   name="0001-Make-pftop-compile-on-DragonFly.patch"
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: attachment;
        filename="0001-Make-pftop-compile-on-DragonFly.patch"
 
 =46rom ab589609cc5518ac895cea005a93ed23c12e5bcb Mon Sep 17 00:00:00 2001
 =46rom: Rumko <rumcic%gmail.com@localhost>
 Date: Sun, 5 Sep 2010 01:31:42 +0200
 Subject: [PATCH] Make pftop compile on DragonFly.
 
 Some changes taken from FreeBSD's ports.
 =2D--
  sysutils/pftop/distinfo         |   10 +-
  sysutils/pftop/patches/patch-aa |   10 +-
  sysutils/pftop/patches/patch-ad |   40 ++--
  sysutils/pftop/patches/patch-ag |   98 ++++++-
  sysutils/pftop/patches/patch-ah |   25 ++-
  sysutils/pftop/patches/patch-aj |   36 +++
  sysutils/pftop/patches/patch-ak |  532 +++++++++++++++++++++++++++++++++++=
 ++++
  7 files changed, 707 insertions(+), 44 deletions(-)
  create mode 100644 sysutils/pftop/patches/patch-aj
  create mode 100644 sysutils/pftop/patches/patch-ak
 
 diff --git a/sysutils/pftop/distinfo b/sysutils/pftop/distinfo
 index c5f7d34..9ccd118 100644
 =2D-- a/sysutils/pftop/distinfo
 +++ b/sysutils/pftop/distinfo
 @@ -3,12 +3,14 @@ $NetBSD: distinfo,v 1.5 2006/03/06 23:02:07 peter Exp $
  SHA1 (pftop-0.7.tar.gz) =3D 651afa532cfc8cf59c3598704deb9bf3788ac9e9
  RMD160 (pftop-0.7.tar.gz) =3D 0e0c09e5feeb07deba8b540233dcb946ba0b4508
  Size (pftop-0.7.tar.gz) =3D 59765 bytes
 =2DSHA1 (patch-aa) =3D ffae9a5ab95b793fa8b677a58a2b69644da37de2
 +SHA1 (patch-aa) =3D ff5c522223472188933a6ccbe9725190dc8ec1b5
  SHA1 (patch-ab) =3D 9e54f7d6f6e6c4c54f924b86080359efea9ba369
  SHA1 (patch-ac) =3D 4d5ffc354258fb39c0a4655457b0c78e4f5709cb
 =2DSHA1 (patch-ad) =3D 658c26cef386c31fbed99a138be0a94bc9ca1278
 +SHA1 (patch-ad) =3D ca20a6cd1dd61aab5b41e6ee22b08dee7741a542
  SHA1 (patch-ae) =3D 54619b846899a7c4f260191a772e41e1c07c178c
  SHA1 (patch-af) =3D 59b907b20fa215b3f0a1e690c9c71d2f7077e322
 =2DSHA1 (patch-ag) =3D ea63b7e7a0ec078a0369b6a416a790538fa0a87d
 =2DSHA1 (patch-ah) =3D b634d591b0fefdbf272970253eb2789a6d1cd6c2
 +SHA1 (patch-ag) =3D 7b3b0a9d7ac73df9c258ae27a8c75e6556574ee8
 +SHA1 (patch-ah) =3D 16540a8a23be6bd94b35758ba8c9a6c0809b2688
  SHA1 (patch-ai) =3D 629c1668eab0d819e590fb62b7afa6c85709fd15
 +SHA1 (patch-aj) =3D a2f03707b59ca390ed460ab7be0ae8299526b655
 +SHA1 (patch-ak) =3D 4b3d9401989e0591d3baf3c1ca744ea6f57fee6c
 diff --git a/sysutils/pftop/patches/patch-aa b/sysutils/pftop/patches/patch=
 =2Daa
 index ab3dac7..4c2fb78 100644
 =2D-- a/sysutils/pftop/patches/patch-aa
 +++ b/sysutils/pftop/patches/patch-aa
 @@ -1,20 +1,22 @@
  $NetBSD$
 =20
 =2D--- Makefile.old    2007-11-07 07:34:18.000000000 +0100
 =2D+++ Makefile        2008-06-15 00:43:41.000000000 +0200
 +--- Makefile.orig     2007-11-07 07:34:18 +0100
 ++++ Makefile  2009-11-17 00:59:26 +0100
  @@ -6,17 +6,21 @@
  =20
   PROG=3D      pftop
   SRCS=3D      pftop.c cache.c engine.c
  -SRCS+=3D     sf-gencode.c sf-grammer.y sf-scanner.l pcap-nametoaddr.c
 +-SRCS+=3D  bpf_optimize.c bpf_filter.c bpf_dump.c bpf_image.c
  +SRCS+=3D     sf-gencode.c sf-grammer.c sf-scanner.l pcap-nametoaddr.c
 =2D SRCS+=3D  bpf_optimize.c bpf_filter.c bpf_dump.c bpf_image.c
 ++SRCS+=3D  bpf_optimize.c
   MAN=3D       pftop.8
  =20
  +CLEANFILES+=3D sf-grammer.c
  +
   CFLAGS+=3D -Wall -DOS_LEVEL=3D${OSLEVEL}
 =2D LDADD+=3D -lcurses
 +-LDADD+=3D -lcurses
 ++LDADD+=3D -lcurses -lpcap
  =20
  +NOGCCERROR=3Dyes
  +
 diff --git a/sysutils/pftop/patches/patch-ad b/sysutils/pftop/patches/patch=
 =2Dad
 index e2adc54..4502504 100644
 =2D-- a/sysutils/pftop/patches/patch-ad
 +++ b/sysutils/pftop/patches/patch-ad
 @@ -1,8 +1,16 @@
  $NetBSD$
 =20
 =2D--- engine.c.old    2008-06-14 17:38:55.000000000 +0200
 =2D+++ engine.c        2008-06-15 12:41:47.000000000 +0200
 =2D@@ -22,7 +22,10 @@
 +--- engine.c.orig     2007-11-07 07:35:44 +0100
 ++++ engine.c  2009-11-17 00:31:46 +0100
 +@@ -18,11 +18,18 @@
 +=20
 +=20
 + #include <sys/types.h>
 ++#ifdef __DragonFly__
 ++#include "queue.h"
 ++#else
 + #include <sys/queue.h>
 ++#endif
  =20
   #include <ctype.h>
   #include <curses.h>
 @@ -13,7 +21,7 @@ $NetBSD$
   #include <stdlib.h>
   #include <string.h>
   #include <unistd.h>
 =2D@@ -33,6 +36,10 @@
 +@@ -33,6 +40,10 @@
   #define MIN(a,b) (((a)<(b))?(a):(b))
   #endif
  =20
 @@ -24,7 +32,7 @@ $NetBSD$
   /* circular linked list of views */
   CIRCLEQ_HEAD(view_list, view_ent) view_head =3D
                                  CIRCLEQ_HEAD_INITIALIZER(view_head);
 =2D@@ -55,9 +62,6 @@
 +@@ -55,9 +66,6 @@
  =20
   volatile sig_atomic_t gotsig_close =3D 0;
   volatile sig_atomic_t gotsig_resize =3D 0;
 @@ -34,7 +42,7 @@ $NetBSD$
  =20
   SCREEN *screen;
  =20
 =2D@@ -105,7 +109,6 @@
 +@@ -105,7 +113,6 @@
  =20
   int
   tbprintf(char *format, ...)
 @@ -42,7 +50,7 @@ $NetBSD$
   {
        int len;
        va_list arg;
 =2D@@ -482,7 +485,6 @@
 +@@ -482,7 +489,6 @@
        v =3D ve->view;
   =09
        if ((curr_view !=3D NULL) && (curr_mgr !=3D v->mgr)) {
 @@ -50,7 +58,7 @@ $NetBSD$
                if (v->mgr !=3D NULL && v->mgr->select_fn !=3D NULL)
                        v->mgr->select_fn();
        }
 =2D@@ -491,7 +493,6 @@
 +@@ -491,7 +497,6 @@
        curr_view =3D v;
        curr_mgr =3D v->mgr;
        field_setup();
 @@ -58,7 +66,7 @@ $NetBSD$
   }
  =20
   void
 =2D@@ -905,12 +906,6 @@
 +@@ -905,12 +910,6 @@
   }
  =20
   void
 @@ -71,7 +79,7 @@ $NetBSD$
   setup_term(int dmax)
   {
        max_disp =3D dmax;
 =2D@@ -941,8 +936,9 @@
 +@@ -941,8 +940,9 @@
                keypad(stdscr, TRUE);
                intrflush(stdscr, FALSE);
  =20
 @@ -82,7 +90,7 @@ $NetBSD$
        }
  =20
        if (dmax =3D=3D 0)
 =2D@@ -970,7 +966,6 @@
 +@@ -970,7 +970,6 @@
        }
        curr_message =3D NULL;
        curr_cmd =3D cmd;
 @@ -90,7 +98,7 @@ $NetBSD$
        return prev;
   }
  =20
 =2D@@ -987,7 +982,6 @@
 +@@ -987,7 +986,6 @@
  =20
   int
   msgprintf(char *format, ...)
 @@ -98,7 +106,7 @@ $NetBSD$
   {
        static char buf[1024];
        int len;
 =2D@@ -1085,28 +1079,21 @@
 +@@ -1085,28 +1083,21 @@
        if (curr_message !=3D NULL) {
                if (ch > 0) {
                        curr_message =3D NULL;
 @@ -127,7 +135,7 @@ $NetBSD$
                break;
        case 'v':
                /* FALLTHROUGH */
 =2D@@ -1124,49 +1111,40 @@
 +@@ -1124,49 +1115,40 @@
                /* FALLTHROUGH */
        case CTRL_N:
                dispstart++;
 @@ -178,7 +186,7 @@ $NetBSD$
                set_view_hotkey(ch);
   }
  =20
 =2D@@ -1177,43 +1155,15 @@
 +@@ -1177,43 +1159,15 @@
        signal(SIGINT, sig_close);
        signal(SIGQUIT, sig_close);
        signal(SIGWINCH, sig_resize);
 @@ -223,7 +231,7 @@ $NetBSD$
                if (gotsig_close)
                        break;
                if (gotsig_resize) {
 =2D@@ -1221,13 +1171,31 @@
 +@@ -1221,13 +1175,31 @@
                                endwin();
                        setup_term(max_disp);
                        gotsig_resize =3D 0;
 diff --git a/sysutils/pftop/patches/patch-ag b/sysutils/pftop/patches/patch=
 =2Dag
 index 160ebb2..9731eab 100644
 =2D-- a/sysutils/pftop/patches/patch-ag
 +++ b/sysutils/pftop/patches/patch-ag
 @@ -1,8 +1,8 @@
  $NetBSD$
 =20
 =2D--- pftop.c.old     2008-06-14 17:41:08.000000000 +0200
 =2D+++ pftop.c 2008-06-15 12:42:06.000000000 +0200
 =2D@@ -40,7 +40,11 @@
 +--- pftop.c.orig      2007-11-07 07:36:46 +0100
 ++++ pftop.c   2009-11-16 23:37:03 +0100
 +@@ -40,21 +40,41 @@
   #include <netinet/in.h>
   #define TCPSTATES
   #include <netinet/tcp_fsm.h>
 @@ -14,7 +14,29 @@ $NetBSD$
   #include <arpa/inet.h>
  =20
   #ifdef HAVE_ALTQ
 =2D@@ -55,6 +59,7 @@
 ++#ifdef __DragonFly__
 ++#include <net/altq/altq.h>
 ++#include <net/altq/altq_cbq.h>
 ++#include <net/altq/altq_priq.h>
 ++#include <net/altq/altq_hfsc.h>
 ++#else
 + #include <altq/altq.h>
 + #include <altq/altq_cbq.h>
 + #include <altq/altq_priq.h>
 + #include <altq/altq_hfsc.h>
 + #endif
 +=20
 ++#ifdef ALTQT_FAIRQ
 ++#ifdef __DragonFly__
 ++#include <net/altq/altq_fairq.h>
 ++#else
 ++#include <altq/altq_fairq.h>
 ++#endif
 ++#endif
 ++#endif
 ++
 + #include <ctype.h>
 + #include <curses.h>
   #include <err.h>
   #include <errno.h>
   #include <fcntl.h>
 @@ -22,7 +44,17 @@ $NetBSD$
   #include <netdb.h>
   #include <signal.h>
   #include <stdio.h>
 =2D@@ -736,7 +741,7 @@
 +@@ -371,6 +391,9 @@
 +      class_stats_t           cbq_stats;
 +      struct priq_classstats  priq_stats;
 +      struct hfsc_classstats  hfsc_stats;
 ++#ifdef ALTQT_FAIRQ
 ++     struct fairq_classstats fairq_stats;
 ++#endif
 + };
 +=20
 + struct queue_stats {
 +@@ -736,7 +759,7 @@
        } else {
                num_states =3D 0;
                for (n =3D 0; n<num_states_all; n++)
 @@ -31,7 +63,7 @@ $NetBSD$
                            sizeof(pf_state_t), sizeof(pf_state_t)) > 0)
                                state_ord[num_states++] =3D n;
        }
 =2D@@ -828,7 +833,7 @@
 +@@ -828,7 +851,7 @@
                tbprintf(" PAUSED");
  =20
        if (rawmode)
 @@ -40,7 +72,7 @@ $NetBSD$
        else
                mvprintw(0, 0, "%s", tmp_buf);
  =20
 =2D@@ -843,7 +848,10 @@
 +@@ -843,7 +866,10 @@
                len =3D columns - strlen(tmp_buf);
                if (len < 0)
                        len =3D 0;
 @@ -52,7 +84,7 @@ $NetBSD$
        }
  =20
        tb_end();
 =2D@@ -1244,7 +1252,6 @@
 +@@ -1244,7 +1270,6 @@
                FLD_ANCHOR->max_width =3D mx;
                FLD_ANCHOR->norm_width =3D nx;
                field_setup();
 @@ -60,7 +92,7 @@ $NetBSD$
        }
   }
   #endif
 =2D@@ -1279,7 +1286,6 @@
 +@@ -1279,7 +1304,6 @@
                        FLD_LABEL->norm_width =3D nw;
                        FLD_LABEL->max_width =3D mw;
                        field_setup();
 @@ -68,7 +100,45 @@ $NetBSD$
                }
        }
   #endif
 =2D@@ -2041,11 +2047,9 @@
 +@@ -1924,6 +1948,10 @@
 +          node->altq.scheduler =3D=3D ALTQT_HFSC
 +              )
 +              print_fld_bw(FLD_BANDW, (double)node->altq.bandwidth);
 ++#ifdef ALTQT_FAIRQ
 ++     if (node->altq.scheduler =3D=3D ALTQT_FAIRQ)
 ++             print_fld_bw(FLD_BANDW, (double)node->altq.bandwidth);
 ++#endif
 + =09
 +      if (node->altq.priority !=3D DEFAULT_PRIORITY)
 +              print_fld_uint(FLD_PRIO,
 +@@ -1992,6 +2020,26 @@
 +                                      
node->qstats_last.data.hfsc_stats.xmit_cnt.bytes, interval);
 +              }
 +              break;
 ++#ifdef ALTQT_FAIRQ
 ++     case ALTQT_FAIRQ:
 ++             print_fld_str(FLD_SCHED, "fairq");
 ++             print_fld_size(FLD_PKTS,
 ++                             node->qstats.data.fairq_stats.xmit_cnt.packets);
 ++             print_fld_size(FLD_BYTES,
 ++                             node->qstats.data.fairq_stats.xmit_cnt.bytes);
 ++             print_fld_size(FLD_DROPP,
 ++                             node->qstats.data.fairq_stats.drop_cnt.packets);
 ++             print_fld_size(FLD_DROPB,
 ++                             node->qstats.data.fairq_stats.drop_cnt.bytes);
 ++             print_fld_size(FLD_QLEN, node->qstats.data.fairq_stats.qlength);
 ++             if (interval > 0) {
 ++                     pps =3D 
calc_pps(node->qstats.data.fairq_stats.xmit_cnt.packets,
 ++                                     
node->qstats_last.data.fairq_stats.xmit_cnt.packets, interval);
 ++                     bps =3D 
calc_rate(node->qstats.data.fairq_stats.xmit_cnt.bytes,
 ++                                     
node->qstats_last.data.fairq_stats.xmit_cnt.bytes, interval);
 ++             }
 ++             break;
 ++#endif
 +      }
 +=20
 +      /* if (node->altq.scheduler !=3D ALTQT_HFSC && interval > 0) { */
 +@@ -2041,11 +2089,9 @@
        if (cachestates) {
                show_field(FLD_SI);
                show_field(FLD_SP);
 @@ -80,7 +150,7 @@ $NetBSD$
        }
        field_setup();
   }
 =2D@@ -2105,8 +2109,10 @@
 +@@ -2105,8 +2151,10 @@
        line++;
        mvprintw(line++, 6, "press any key to continue ...");
  =20
 @@ -93,7 +163,7 @@ $NetBSD$
   }
  =20
  =20
 =2D@@ -2142,7 +2148,6 @@
 +@@ -2142,7 +2190,6 @@
        del =3D atoi(cmdbuf);
        if (del > 0) {
                delay =3D del;
 @@ -101,7 +171,7 @@ $NetBSD$
        }
   }
  =20
 =2D@@ -2175,7 +2180,6 @@
 +@@ -2175,7 +2222,6 @@
                /* FALLTHROUGH */
        case 'h':
                show_help();
 @@ -109,7 +179,7 @@ $NetBSD$
                break;
        case 'n':
                command_set(&cm_count, NULL);
 =2D@@ -2349,8 +2353,6 @@
 +@@ -2349,8 +2395,6 @@
        if (rawmode && countmax =3D=3D 0)
                countmax =3D 1;
  =20
 diff --git a/sysutils/pftop/patches/patch-ah b/sysutils/pftop/patches/patch=
 =2Dah
 index b251a94..5c65301 100644
 =2D-- a/sysutils/pftop/patches/patch-ah
 +++ b/sysutils/pftop/patches/patch-ah
 @@ -1,13 +1,14 @@
  $NetBSD$
 =20
 =2D--- sf-gencode.c.old        2008-06-14 17:44:52.000000000 +0200
 =2D+++ sf-gencode.c    2008-06-15 01:19:43.000000000 +0200
 =2D@@ -32,8 +32,11 @@
 +--- sf-gencode.c.orig 2007-11-07 07:34:18 +0100
 ++++ sf-gencode.c      2009-11-17 01:03:45 +0100
 +@@ -32,8 +32,12 @@
   #include <netinet/in.h>
   #include <netinet/if_ether.h>
  =20
  -#include <net/if_pflog.h>
  +#ifdef __DragonFly__
 ++#include <sys/param.h>
  +#include <net/pf/pfvar.h>
  +#else
   #include <net/pfvar.h>
 @@ -15,7 +16,7 @@ $NetBSD$
  =20
   #include <netdb.h>
   #include <stdlib.h>
 =2D@@ -44,7 +47,7 @@
 +@@ -44,7 +48,7 @@
  =20
   #define INET6
  =20
 @@ -24,7 +25,19 @@ $NetBSD$
   #include <pcap-namedb.h>
   #include "sf-gencode.h"
  =20
 =2D@@ -733,13 +736,17 @@
 +@@ -60,7 +64,11 @@
 + static char sf_errbuf[PFTOP_ERRBUF_SIZE];
 +=20
 + /* VARARGS */
 ++#ifdef __DragonFly__
 ++void
 ++#else
 + __dead void
 ++#endif
 + sf_error(const char *fmt, ...)
 + {
 +      va_list ap;
 +@@ -733,13 +741,17 @@
                b1 =3D gen_proto(IPPROTO_ESP);
                break;
  =20
 @@ -42,7 +55,7 @@ $NetBSD$
  =20
        default:
                sf_error("Unknown protocol abbreviation");
 =2D@@ -1560,7 +1567,7 @@
 +@@ -1560,7 +1572,7 @@
                /* NOTREACHED */
        }
  =20
 diff --git a/sysutils/pftop/patches/patch-aj b/sysutils/pftop/patches/patch=
 =2Daj
 new file mode 100644
 index 0000000..6e568df
 =2D-- /dev/null
 +++ b/sysutils/pftop/patches/patch-aj
 @@ -0,0 +1,36 @@
 +--- sf-gencode.h.orig 2009-11-16 23:47:42 +0100
 ++++ sf-gencode.h      2009-11-16 23:47:54 +0100
 +@@ -169,8 +169,13 @@
 + struct arth  *gen_loadexpire(void);
 +=20
 + void bpf_optimize(struct block **);
 ++#ifdef __DragonFly__
 ++void bpf_error(const char *, ...)
 ++    __attribute__((volatile, __format__ (printf, 1, 2)));
 ++#else
 + __dead void bpf_error(const char *, ...)
 +     __attribute__((volatile, __format__ (printf, 1, 2)));
 ++#endif
 +=20
 + void finish_parse(struct block *);
 + char *sdup(const char *);
 +@@ -184,11 +189,19 @@
 + #define JT(b)  ((b)->et.succ)
 + #define JF(b)  ((b)->ef.succ)
 +=20
 ++#ifdef __DragonFly__
 ++void sf_error(const char *fmt, ...);
 ++#else
 + __dead void sf_error(const char *fmt, ...);
 ++#endif
 + const char *sf_get_error(void);
 + int sf_compile(struct bpf_program *, char *, int, bpf_u_int32);
 + void sf_freecode(struct bpf_program *);
 ++#ifdef __DragonFly__
 ++void bpf_dump(const struct bpf_program *, int);
 ++#else
 + void bpf_dump(struct bpf_program *, int);
 ++#endif
 +=20
 + extern int no_optimize;
 +=20
 diff --git a/sysutils/pftop/patches/patch-ak b/sysutils/pftop/patches/patch=
 =2Dak
 new file mode 100644
 index 0000000..a12c430
 =2D-- /dev/null
 +++ b/sysutils/pftop/patches/patch-ak
 @@ -0,0 +1,532 @@
 +Taken from FreeBSD ports.
 +
 +--- /dev/null 2009-11-17 00:30:11 +0100
 ++++ queue.h   2009-11-17 00:31:32 +0100
 +@@ -0,0 +1,527 @@
 ++/*   $OpenBSD: queue.h,v 1.32 2007/04/30 18:42:34 pedro Exp $        */
 ++/*   $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $       */
 ++
 ++/*
 ++ * Copyright (c) 1991, 1993
 ++ *   The Regents of the University of California.  All rights reserved.
 ++ *
 ++ * Redistribution and use in source and binary forms, with or without
 ++ * modification, are permitted provided that the following conditions
 ++ * are met:
 ++ * 1. Redistributions of source code must retain the above copyright
 ++ *    notice, this list of conditions and the following disclaimer.
 ++ * 2. Redistributions in binary form must reproduce the above copyright
 ++ *    notice, this list of conditions and the following disclaimer in the
 ++ *    documentation and/or other materials provided with the distribution.
 ++ * 3. Neither the name of the University nor the names of its contributors
 ++ *    may be used to endorse or promote products derived from this softwa=
 re
 ++ *    without specific prior written permission.
 ++ *
 ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PUR=
 POSE
 ++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIAB=
 LE
 ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUEN=
 TIAL
 ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, ST=
 RICT
 ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY =
 WAY
 ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 ++ * SUCH DAMAGE.
 ++ *
 ++ *   @(#)queue.h     8.5 (Berkeley) 8/20/94
 ++ */
 ++
 ++#ifndef      _QUEUE_H_
 ++#define      _QUEUE_H_
 ++
 ++/*
 ++ * This file defines five types of data structures: singly-linked lists,=
 =20
 ++ * lists, simple queues, tail queues, and circular queues.
 ++ *
 ++ *
 ++ * A singly-linked list is headed by a single forward pointer. The elemen=
 ts
 ++ * are singly linked for minimum space and pointer manipulation overhead =
 at
 ++ * the expense of O(n) removal for arbitrary elements. New elements can be
 ++ * added to the list after an existing element or at the head of the list.
 ++ * Elements being removed from the head of the list should use the explic=
 it
 ++ * macro for this purpose for optimum efficiency. A singly-linked list may
 ++ * only be traversed in the forward direction.  Singly-linked lists are i=
 deal
 ++ * for applications with large datasets and few or no removals or for
 ++ * implementing a LIFO queue.
 ++ *
 ++ * A list is headed by a single forward pointer (or an array of forward
 ++ * pointers for a hash table header). The elements are doubly linked
 ++ * so that an arbitrary element can be removed without a need to
 ++ * traverse the list. New elements can be added to the list before
 ++ * or after an existing element or at the head of the list. A list
 ++ * may only be traversed in the forward direction.
 ++ *
 ++ * A simple queue is headed by a pair of pointers, one the head of the
 ++ * list and the other to the tail of the list. The elements are singly
 ++ * linked to save space, so elements can only be removed from the
 ++ * head of the list. New elements can be added to the list before or after
 ++ * an existing element, at the head of the list, or at the end of the
 ++ * list. A simple queue may only be traversed in the forward direction.
 ++ *
 ++ * A tail queue is headed by a pair of pointers, one to the head of the
 ++ * list and the other to the tail of the list. The elements are doubly
 ++ * linked so that an arbitrary element can be removed without a need to
 ++ * traverse the list. New elements can be added to the list before or
 ++ * after an existing element, at the head of the list, or at the end of
 ++ * the list. A tail queue may be traversed in either direction.
 ++ *
 ++ * A circle queue is headed by a pair of pointers, one to the head of the
 ++ * list and the other to the tail of the list. The elements are doubly
 ++ * linked so that an arbitrary element can be removed without a need to
 ++ * traverse the list. New elements can be added to the list before or aft=
 er
 ++ * an existing element, at the head of the list, or at the end of the lis=
 t.
 ++ * A circle queue may be traversed in either direction, but has a more
 ++ * complex end of list detection.
 ++ *
 ++ * For details on the use of these macros, see the queue(3) manual page.
 ++ */
 ++
 ++#if defined(QUEUE_MACRO_DEBUG) || (defined(_KERNEL) && defined(DIAGNOSTIC=
 ))
 ++#define _Q_INVALIDATE(a) (a) =3D ((void *)-1)
 ++#else
 ++#define _Q_INVALIDATE(a)
 ++#endif
 ++
 ++/*
 ++ * Singly-linked List definitions.
 ++ */
 ++#define SLIST_HEAD(name, type)                                               
\
 ++struct name {                                                                
\
 ++     struct type *slh_first; /* first element */                     \
 ++}
 ++=20
 ++#define      SLIST_HEAD_INITIALIZER(head)                                    
\
 ++     { NULL }
 ++=20
 ++#define SLIST_ENTRY(type)                                            \
 ++struct {                                                             \
 ++     struct type *sle_next;  /* next element */                      \
 ++}
 ++=20
 ++/*
 ++ * Singly-linked List access methods.
 ++ */
 ++#define      SLIST_FIRST(head)       ((head)->slh_first)
 ++#define      SLIST_END(head)         NULL
 ++#define      SLIST_EMPTY(head)       (SLIST_FIRST(head) =3D=3D 
SLIST_END(head))
 ++#define      SLIST_NEXT(elm, field)  ((elm)->field.sle_next)
 ++
 ++#define      SLIST_FOREACH(var, head, field)                                 
\
 ++     for((var) =3D SLIST_FIRST(head);                                        
\
 ++         (var) !=3D SLIST_END(head);                                 \
 ++         (var) =3D SLIST_NEXT(var, field))
 ++
 ++#define      SLIST_FOREACH_PREVPTR(var, varp, head, field)                   
\
 ++     for ((varp) =3D &SLIST_FIRST((head));                           \
 ++         ((var) =3D *(varp)) !=3D SLIST_END(head);                   \
 ++         (varp) =3D &SLIST_NEXT((var), field))
 ++
 ++/*
 ++ * Singly-linked List functions.
 ++ */
 ++#define      SLIST_INIT(head) {                                              
\
 ++     SLIST_FIRST(head) =3D SLIST_END(head);                          \
 ++}
 ++
 ++#define      SLIST_INSERT_AFTER(slistelm, elm, field) do {                   
\
 ++     (elm)->field.sle_next =3D (slistelm)->field.sle_next;           \
 ++     (slistelm)->field.sle_next =3D (elm);                           \
 ++} while (0)
 ++
 ++#define      SLIST_INSERT_HEAD(head, elm, field) do {                        
\
 ++     (elm)->field.sle_next =3D (head)->slh_first;                    \
 ++     (head)->slh_first =3D (elm);                                    \
 ++} while (0)
 ++
 ++#define      SLIST_REMOVE_NEXT(head, elm, field) do {                        
\
 ++     (elm)->field.sle_next =3D (elm)->field.sle_next->field.sle_next;        
\
 ++} while (0)
 ++
 ++#define      SLIST_REMOVE_HEAD(head, field) do {                             
\
 ++     (head)->slh_first =3D (head)->slh_first->field.sle_next;                
\
 ++} while (0)
 ++
 ++#define SLIST_REMOVE(head, elm, type, field) do {                    \
 ++     if ((head)->slh_first =3D=3D (elm)) {                           \
 ++             SLIST_REMOVE_HEAD((head), field);                       \
 ++     } else {                                                        \
 ++             struct type *curelm =3D (head)->slh_first;              \
 ++                                                                     \
 ++             while (curelm->field.sle_next !=3D (elm))                       
\
 ++                     curelm =3D curelm->field.sle_next;              \
 ++             curelm->field.sle_next =3D                              \
 ++                 curelm->field.sle_next->field.sle_next;             \
 ++             _Q_INVALIDATE((elm)->field.sle_next);                   \
 ++     }                                                               \
 ++} while (0)
 ++
 ++/*
 ++ * List definitions.
 ++ */
 ++#define LIST_HEAD(name, type)                                                
\
 ++struct name {                                                                
\
 ++     struct type *lh_first;  /* first element */                     \
 ++}
 ++
 ++#define LIST_HEAD_INITIALIZER(head)                                  \
 ++     { NULL }
 ++
 ++#define LIST_ENTRY(type)                                             \
 ++struct {                                                             \
 ++     struct type *le_next;   /* next element */                      \
 ++     struct type **le_prev;  /* address of previous next element */  \
 ++}
 ++
 ++/*
 ++ * List access methods
 ++ */
 ++#define      LIST_FIRST(head)                ((head)->lh_first)
 ++#define      LIST_END(head)                  NULL
 ++#define      LIST_EMPTY(head)                (LIST_FIRST(head) =3D=3D 
LIST_END(head))
 ++#define      LIST_NEXT(elm, field)           ((elm)->field.le_next)
 ++
 ++#define LIST_FOREACH(var, head, field)                                       
\
 ++     for((var) =3D LIST_FIRST(head);                                 \
 ++         (var)!=3D LIST_END(head);                                   \
 ++         (var) =3D LIST_NEXT(var, field))
 ++
 ++/*
 ++ * List functions.
 ++ */
 ++#define      LIST_INIT(head) do {                                            
\
 ++     LIST_FIRST(head) =3D LIST_END(head);                            \
 ++} while (0)
 ++
 ++#define LIST_INSERT_AFTER(listelm, elm, field) do {                  \
 ++     if (((elm)->field.le_next =3D (listelm)->field.le_next) !=3D NULL)      
\
 ++             (listelm)->field.le_next->field.le_prev =3D             \
 ++                 &(elm)->field.le_next;                              \
 ++     (listelm)->field.le_next =3D (elm);                             \
 ++     (elm)->field.le_prev =3D &(listelm)->field.le_next;             \
 ++} while (0)
 ++
 ++#define      LIST_INSERT_BEFORE(listelm, elm, field) do {                    
\
 ++     (elm)->field.le_prev =3D (listelm)->field.le_prev;              \
 ++     (elm)->field.le_next =3D (listelm);                             \
 ++     *(listelm)->field.le_prev =3D (elm);                            \
 ++     (listelm)->field.le_prev =3D &(elm)->field.le_next;             \
 ++} while (0)
 ++
 ++#define LIST_INSERT_HEAD(head, elm, field) do {                              
\
 ++     if (((elm)->field.le_next =3D (head)->lh_first) !=3D NULL)              
\
 ++             (head)->lh_first->field.le_prev =3D &(elm)->field.le_next;\
 ++     (head)->lh_first =3D (elm);                                     \
 ++     (elm)->field.le_prev =3D &(head)->lh_first;                     \
 ++} while (0)
 ++
 ++#define LIST_REMOVE(elm, field) do {                                 \
 ++     if ((elm)->field.le_next !=3D NULL)                             \
 ++             (elm)->field.le_next->field.le_prev =3D                 \
 ++                 (elm)->field.le_prev;                               \
 ++     *(elm)->field.le_prev =3D (elm)->field.le_next;                 \
 ++     _Q_INVALIDATE((elm)->field.le_prev);                            \
 ++     _Q_INVALIDATE((elm)->field.le_next);                            \
 ++} while (0)
 ++
 ++#define LIST_REPLACE(elm, elm2, field) do {                          \
 ++     if (((elm2)->field.le_next =3D (elm)->field.le_next) !=3D NULL) \
 ++             (elm2)->field.le_next->field.le_prev =3D                        
\
 ++                 &(elm2)->field.le_next;                             \
 ++     (elm2)->field.le_prev =3D (elm)->field.le_prev;                 \
 ++     *(elm2)->field.le_prev =3D (elm2);                              \
 ++     _Q_INVALIDATE((elm)->field.le_prev);                            \
 ++     _Q_INVALIDATE((elm)->field.le_next);                            \
 ++} while (0)
 ++
 ++/*
 ++ * Simple queue definitions.
 ++ */
 ++#define SIMPLEQ_HEAD(name, type)                                     \
 ++struct name {                                                                
\
 ++     struct type *sqh_first; /* first element */                     \
 ++     struct type **sqh_last; /* addr of last next element */         \
 ++}
 ++
 ++#define SIMPLEQ_HEAD_INITIALIZER(head)                                       
\
 ++     { NULL, &(head).sqh_first }
 ++
 ++#define SIMPLEQ_ENTRY(type)                                          \
 ++struct {                                                             \
 ++     struct type *sqe_next;  /* next element */                      \
 ++}
 ++
 ++/*
 ++ * Simple queue access methods.
 ++ */
 ++#define      SIMPLEQ_FIRST(head)         ((head)->sqh_first)
 ++#define      SIMPLEQ_END(head)           NULL
 ++#define      SIMPLEQ_EMPTY(head)         (SIMPLEQ_FIRST(head) =3D=3D 
SIMPLEQ_END(h=
 ead))
 ++#define      SIMPLEQ_NEXT(elm, field)    ((elm)->field.sqe_next)
 ++
 ++#define SIMPLEQ_FOREACH(var, head, field)                            \
 ++     for((var) =3D SIMPLEQ_FIRST(head);                              \
 ++         (var) !=3D SIMPLEQ_END(head);                                       
\
 ++         (var) =3D SIMPLEQ_NEXT(var, field))
 ++
 ++/*
 ++ * Simple queue functions.
 ++ */
 ++#define      SIMPLEQ_INIT(head) do {                                         
\
 ++     (head)->sqh_first =3D NULL;                                     \
 ++     (head)->sqh_last =3D &(head)->sqh_first;                                
\
 ++} while (0)
 ++
 ++#define SIMPLEQ_INSERT_HEAD(head, elm, field) do {                   \
 ++     if (((elm)->field.sqe_next =3D (head)->sqh_first) =3D=3D NULL)  \
 ++             (head)->sqh_last =3D &(elm)->field.sqe_next;            \
 ++     (head)->sqh_first =3D (elm);                                    \
 ++} while (0)
 ++
 ++#define SIMPLEQ_INSERT_TAIL(head, elm, field) do {                   \
 ++     (elm)->field.sqe_next =3D NULL;                                 \
 ++     *(head)->sqh_last =3D (elm);                                    \
 ++     (head)->sqh_last =3D &(elm)->field.sqe_next;                    \
 ++} while (0)
 ++
 ++#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {         \
 ++     if (((elm)->field.sqe_next =3D (listelm)->field.sqe_next) =3D=3D NULL)\
 ++             (head)->sqh_last =3D &(elm)->field.sqe_next;            \
 ++     (listelm)->field.sqe_next =3D (elm);                            \
 ++} while (0)
 ++
 ++#define SIMPLEQ_REMOVE_HEAD(head, field) do {                        \
 ++     if (((head)->sqh_first =3D (head)->sqh_first->field.sqe_next) =3D=3D 
NUL=
 L) \
 ++             (head)->sqh_last =3D &(head)->sqh_first;                        
\
 ++} while (0)
 ++
 ++/*
 ++ * Tail queue definitions.
 ++ */
 ++#define TAILQ_HEAD(name, type)                                               
\
 ++struct name {                                                                
\
 ++     struct type *tqh_first; /* first element */                     \
 ++     struct type **tqh_last; /* addr of last next element */         \
 ++}
 ++
 ++#define TAILQ_HEAD_INITIALIZER(head)                                 \
 ++     { NULL, &(head).tqh_first }
 ++
 ++#define TAILQ_ENTRY(type)                                            \
 ++struct {                                                             \
 ++     struct type *tqe_next;  /* next element */                      \
 ++     struct type **tqe_prev; /* address of previous next element */  \
 ++}
 ++
 ++/*=20
 ++ * tail queue access methods=20
 ++ */
 ++#define      TAILQ_FIRST(head)               ((head)->tqh_first)
 ++#define      TAILQ_END(head)                 NULL
 ++#define      TAILQ_NEXT(elm, field)          ((elm)->field.tqe_next)
 ++#define TAILQ_LAST(head, headname)                                   \
 ++     (*(((struct headname *)((head)->tqh_last))->tqh_last))
 ++/* XXX */
 ++#define TAILQ_PREV(elm, headname, field)                             \
 ++     (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
 ++#define      TAILQ_EMPTY(head)                                               
\
 ++     (TAILQ_FIRST(head) =3D=3D TAILQ_END(head))
 ++
 ++#define TAILQ_FOREACH(var, head, field)                                      
\
 ++     for((var) =3D TAILQ_FIRST(head);                                        
\
 ++         (var) !=3D TAILQ_END(head);                                 \
 ++         (var) =3D TAILQ_NEXT(var, field))
 ++
 ++#define TAILQ_FOREACH_REVERSE(var, head, headname, field)            \
 ++     for((var) =3D TAILQ_LAST(head, headname);                               
\
 ++         (var) !=3D TAILQ_END(head);                                 \
 ++         (var) =3D TAILQ_PREV(var, headname, field))
 ++
 ++/*
 ++ * Tail queue functions.
 ++ */
 ++#define      TAILQ_INIT(head) do {                                           
\
 ++     (head)->tqh_first =3D NULL;                                     \
 ++     (head)->tqh_last =3D &(head)->tqh_first;                                
\
 ++} while (0)
 ++
 ++#define TAILQ_INSERT_HEAD(head, elm, field) do {                     \
 ++     if (((elm)->field.tqe_next =3D (head)->tqh_first) !=3D NULL)    \
 ++             (head)->tqh_first->field.tqe_prev =3D                   \
 ++                 &(elm)->field.tqe_next;                             \
 ++     else                                                            \
 ++             (head)->tqh_last =3D &(elm)->field.tqe_next;            \
 ++     (head)->tqh_first =3D (elm);                                    \
 ++     (elm)->field.tqe_prev =3D &(head)->tqh_first;                   \
 ++} while (0)
 ++
 ++#define TAILQ_INSERT_TAIL(head, elm, field) do {                     \
 ++     (elm)->field.tqe_next =3D NULL;                                 \
 ++     (elm)->field.tqe_prev =3D (head)->tqh_last;                     \
 ++     *(head)->tqh_last =3D (elm);                                    \
 ++     (head)->tqh_last =3D &(elm)->field.tqe_next;                    \
 ++} while (0)
 ++
 ++#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {           \
 ++     if (((elm)->field.tqe_next =3D (listelm)->field.tqe_next) !=3D NULL)\
 ++             (elm)->field.tqe_next->field.tqe_prev =3D                       
\
 ++                 &(elm)->field.tqe_next;                             \
 ++     else                                                            \
 ++             (head)->tqh_last =3D &(elm)->field.tqe_next;            \
 ++     (listelm)->field.tqe_next =3D (elm);                            \
 ++     (elm)->field.tqe_prev =3D &(listelm)->field.tqe_next;           \
 ++} while (0)
 ++
 ++#define      TAILQ_INSERT_BEFORE(listelm, elm, field) do {                   
\
 ++     (elm)->field.tqe_prev =3D (listelm)->field.tqe_prev;            \
 ++     (elm)->field.tqe_next =3D (listelm);                            \
 ++     *(listelm)->field.tqe_prev =3D (elm);                           \
 ++     (listelm)->field.tqe_prev =3D &(elm)->field.tqe_next;           \
 ++} while (0)
 ++
 ++#define TAILQ_REMOVE(head, elm, field) do {                          \
 ++     if (((elm)->field.tqe_next) !=3D NULL)                          \
 ++             (elm)->field.tqe_next->field.tqe_prev =3D                       
\
 ++                 (elm)->field.tqe_prev;                              \
 ++     else                                                            \
 ++             (head)->tqh_last =3D (elm)->field.tqe_prev;             \
 ++     *(elm)->field.tqe_prev =3D (elm)->field.tqe_next;                       
\
 ++     _Q_INVALIDATE((elm)->field.tqe_prev);                           \
 ++     _Q_INVALIDATE((elm)->field.tqe_next);                           \
 ++} while (0)
 ++
 ++#define TAILQ_REPLACE(head, elm, elm2, field) do {                   \
 ++     if (((elm2)->field.tqe_next =3D (elm)->field.tqe_next) !=3D NULL)       
\
 ++             (elm2)->field.tqe_next->field.tqe_prev =3D              \
 ++                 &(elm2)->field.tqe_next;                            \
 ++     else                                                            \
 ++             (head)->tqh_last =3D &(elm2)->field.tqe_next;           \
 ++     (elm2)->field.tqe_prev =3D (elm)->field.tqe_prev;                       
\
 ++     *(elm2)->field.tqe_prev =3D (elm2);                             \
 ++     _Q_INVALIDATE((elm)->field.tqe_prev);                           \
 ++     _Q_INVALIDATE((elm)->field.tqe_next);                           \
 ++} while (0)
 ++
 ++/*
 ++ * Circular queue definitions.
 ++ */
 ++#define CIRCLEQ_HEAD(name, type)                                     \
 ++struct name {                                                                
\
 ++     struct type *cqh_first;         /* first element */             \
 ++     struct type *cqh_last;          /* last element */              \
 ++}
 ++
 ++#define CIRCLEQ_HEAD_INITIALIZER(head)                                       
\
 ++     { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
 ++
 ++#define CIRCLEQ_ENTRY(type)                                          \
 ++struct {                                                             \
 ++     struct type *cqe_next;          /* next element */              \
 ++     struct type *cqe_prev;          /* previous element */          \
 ++}
 ++
 ++/*
 ++ * Circular queue access methods=20
 ++ */
 ++#define      CIRCLEQ_FIRST(head)             ((head)->cqh_first)
 ++#define      CIRCLEQ_LAST(head)              ((head)->cqh_last)
 ++#define      CIRCLEQ_END(head)               ((void *)(head))
 ++#define      CIRCLEQ_NEXT(elm, field)        ((elm)->field.cqe_next)
 ++#define      CIRCLEQ_PREV(elm, field)        ((elm)->field.cqe_prev)
 ++#define      CIRCLEQ_EMPTY(head)                                             
\
 ++     (CIRCLEQ_FIRST(head) =3D=3D CIRCLEQ_END(head))
 ++
 ++#define CIRCLEQ_FOREACH(var, head, field)                            \
 ++     for((var) =3D CIRCLEQ_FIRST(head);                              \
 ++         (var) !=3D CIRCLEQ_END(head);                                       
\
 ++         (var) =3D CIRCLEQ_NEXT(var, field))
 ++
 ++#define CIRCLEQ_FOREACH_REVERSE(var, head, field)                    \
 ++     for((var) =3D CIRCLEQ_LAST(head);                                       
\
 ++         (var) !=3D CIRCLEQ_END(head);                                       
\
 ++         (var) =3D CIRCLEQ_PREV(var, field))
 ++
 ++/*
 ++ * Circular queue functions.
 ++ */
 ++#define      CIRCLEQ_INIT(head) do {                                         
\
 ++     (head)->cqh_first =3D CIRCLEQ_END(head);                                
\
 ++     (head)->cqh_last =3D CIRCLEQ_END(head);                         \
 ++} while (0)
 ++
 ++#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {         \
 ++     (elm)->field.cqe_next =3D (listelm)->field.cqe_next;            \
 ++     (elm)->field.cqe_prev =3D (listelm);                            \
 ++     if ((listelm)->field.cqe_next =3D=3D CIRCLEQ_END(head))         \
 ++             (head)->cqh_last =3D (elm);                             \
 ++     else                                                            \
 ++             (listelm)->field.cqe_next->field.cqe_prev =3D (elm);    \
 ++     (listelm)->field.cqe_next =3D (elm);                            \
 ++} while (0)
 ++
 ++#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {                
\
 ++     (elm)->field.cqe_next =3D (listelm);                            \
 ++     (elm)->field.cqe_prev =3D (listelm)->field.cqe_prev;            \
 ++     if ((listelm)->field.cqe_prev =3D=3D CIRCLEQ_END(head))         \
 ++             (head)->cqh_first =3D (elm);                            \
 ++     else                                                            \
 ++             (listelm)->field.cqe_prev->field.cqe_next =3D (elm);    \
 ++     (listelm)->field.cqe_prev =3D (elm);                            \
 ++} while (0)
 ++
 ++#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {                   \
 ++     (elm)->field.cqe_next =3D (head)->cqh_first;                    \
 ++     (elm)->field.cqe_prev =3D CIRCLEQ_END(head);                    \
 ++     if ((head)->cqh_last =3D=3D CIRCLEQ_END(head))                  \
 ++             (head)->cqh_last =3D (elm);                             \
 ++     else                                                            \
 ++             (head)->cqh_first->field.cqe_prev =3D (elm);            \
 ++     (head)->cqh_first =3D (elm);                                    \
 ++} while (0)
 ++
 ++#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {                   \
 ++     (elm)->field.cqe_next =3D CIRCLEQ_END(head);                    \
 ++     (elm)->field.cqe_prev =3D (head)->cqh_last;                     \
 ++     if ((head)->cqh_first =3D=3D CIRCLEQ_END(head))                 \
 ++             (head)->cqh_first =3D (elm);                            \
 ++     else                                                            \
 ++             (head)->cqh_last->field.cqe_next =3D (elm);             \
 ++     (head)->cqh_last =3D (elm);                                     \
 ++} while (0)
 ++
 ++#define      CIRCLEQ_REMOVE(head, elm, field) do {                           
\
 ++     if ((elm)->field.cqe_next =3D=3D CIRCLEQ_END(head))                     
\
 ++             (head)->cqh_last =3D (elm)->field.cqe_prev;             \
 ++     else                                                            \
 ++             (elm)->field.cqe_next->field.cqe_prev =3D                       
\
 ++                 (elm)->field.cqe_prev;                              \
 ++     if ((elm)->field.cqe_prev =3D=3D CIRCLEQ_END(head))                     
\
 ++             (head)->cqh_first =3D (elm)->field.cqe_next;            \
 ++     else                                                            \
 ++             (elm)->field.cqe_prev->field.cqe_next =3D                       
\
 ++                 (elm)->field.cqe_next;                              \
 ++     _Q_INVALIDATE((elm)->field.cqe_prev);                           \
 ++     _Q_INVALIDATE((elm)->field.cqe_next);                           \
 ++} while (0)
 ++
 ++#define CIRCLEQ_REPLACE(head, elm, elm2, field) do {                 \
 ++     if (((elm2)->field.cqe_next =3D (elm)->field.cqe_next) =3D=3D           
\
 ++         CIRCLEQ_END(head))                                          \
 ++             (head).cqh_last =3D (elm2);                             \
 ++     else                                                            \
 ++             (elm2)->field.cqe_next->field.cqe_prev =3D (elm2);      \
 ++     if (((elm2)->field.cqe_prev =3D (elm)->field.cqe_prev) =3D=3D           
\
 ++         CIRCLEQ_END(head))                                          \
 ++             (head).cqh_first =3D (elm2);                            \
 ++     else                                                            \
 ++             (elm2)->field.cqe_prev->field.cqe_next =3D (elm2);      \
 ++     _Q_INVALIDATE((elm)->field.cqe_prev);                           \
 ++     _Q_INVALIDATE((elm)->field.cqe_next);                           \
 ++} while (0)
 ++
 ++#endif       /* !_SYS_QUEUE_H_ */
 =2D-=20
 1.7.0.5
 
 
 --Boundary-01=_mZMkMrzoA4aXdcv--
 
 --nextPart6213344.iNP4UXOa43
 Content-Type: application/pgp-signature; name=signature.asc 
 Content-Description: This is a digitally signed message part.
 
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.16 (DragonFly)
 
 iEYEABECAAYFAkyQxmkACgkQxV3ce2RZW70udACgpBd1ZoIwleKd9o8PGKw0tyTY
 54YAn3LsC7eGtdf9lqHB4yKbbSQJiX0v
 =6y48
 -----END PGP SIGNATURE-----
 
 --nextPart6213344.iNP4UXOa43--
 


Home | Main Index | Thread Index | Old Index