diff --git a/distrib/sets/lists/debug/mi b/distrib/sets/lists/debug/mi index 077e2b51c182..98f30d83c925 100644 --- a/distrib/sets/lists/debug/mi +++ b/distrib/sets/lists/debug/mi @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.216.2.3 2017/08/29 11:51:50 martin Exp $ +# $NetBSD: mi,v 1.216.2.4 2017/10/02 13:21:41 martin Exp $ ./etc/mtree/set.debug comp-sys-root ./usr/lib comp-sys-usr compatdir ./usr/lib/i18n/libBIG5_g.a comp-c-debuglib debuglib,compatfile @@ -1662,6 +1662,7 @@ ./usr/libdata/debug/usr/tests/include/sys/t_bitops.debug tests-include-tests debug,atf,compattestfile ./usr/libdata/debug/usr/tests/include/sys/t_bootblock.debug tests-include-tests debug,atf,compattestfile ./usr/libdata/debug/usr/tests/include/sys/t_cdefs.debug tests-include-tests debug,atf,compattestfile +./usr/libdata/debug/usr/tests/include/sys/t_list.debug tests-include-tests debug,atf ./usr/libdata/debug/usr/tests/include/sys/t_pslist.debug tests-include-tests debug,atf,compattestfile ./usr/libdata/debug/usr/tests/include/sys/t_socket.debug tests-include-tests debug,atf,rump ./usr/libdata/debug/usr/tests/include/sys/t_tree.debug tests-include-tests debug,atf,compattestfile diff --git a/distrib/sets/lists/tests/mi b/distrib/sets/lists/tests/mi index 506e36a3c8e7..25a5b01752b8 100644 --- a/distrib/sets/lists/tests/mi +++ b/distrib/sets/lists/tests/mi @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.752.2.2 2017/08/29 11:51:51 martin Exp $ +# $NetBSD: mi,v 1.752.2.3 2017/10/02 13:21:41 martin Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -1588,6 +1588,7 @@ ./usr/tests/include/sys/t_bitops tests-include-tests compattestfile,atf ./usr/tests/include/sys/t_bootblock tests-include-tests compattestfile,atf ./usr/tests/include/sys/t_cdefs tests-include-tests compattestfile,atf +./usr/tests/include/sys/t_list tests-include-tests compattestfile,atf ./usr/tests/include/sys/t_pslist tests-include-tests compattestfile,atf ./usr/tests/include/sys/t_socket tests-include-tests atf,rump ./usr/tests/include/sys/t_tree tests-include-tests compattestfile,atf diff --git a/share/man/man3/queue.3 b/share/man/man3/queue.3 index 79f52096d656..a96c375f7fc5 100644 --- a/share/man/man3/queue.3 +++ b/share/man/man3/queue.3 @@ -1,4 +1,4 @@ -.\" $NetBSD: queue.3,v 1.56 2017/04/25 06:08:24 abhinav Exp $ +.\" $NetBSD: queue.3,v 1.56.4.1 2017/10/02 13:21:41 martin Exp $ .\" .\" Copyright (c) 2000, 2002 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -53,7 +53,7 @@ .\" .\" @(#)queue.3 8.1 (Berkeley) 12/13/93 .\" -.Dd October 15, 2016 +.Dd October 1, 2017 .Dt QUEUE 3 .Os .Sh NAME @@ -177,7 +177,7 @@ .Fn LIST_INSERT_HEAD "LIST_HEAD *head" "TYPE *elm" "LIST_ENTRY NAME" .Fn LIST_REMOVE "TYPE *elm" "LIST_ENTRY NAME" .Fn LIST_REPLACE "TYPE *elm" "TYPE *new" "LIST_ENTRY NAME" -.Fn LIST_MOVE "LIST_HEAD *head1" "LIST_HEAD *head2" +.Fn LIST_MOVE "LIST_HEAD *head1" "LIST_HEAD *head2" "LIST_ENTRY NAME" .Pp .Fn SIMPLEQ_HEAD "HEADNAME" "TYPE" .Fn SIMPLEQ_HEAD_INITIALIZER "head" diff --git a/sys/sys/queue.h b/sys/sys/queue.h index a38499a2673d..816acca64143 100644 --- a/sys/sys/queue.h +++ b/sys/sys/queue.h @@ -1,4 +1,4 @@ -/* $NetBSD: queue.h,v 1.70 2015/11/02 15:21:23 christos Exp $ */ +/* $NetBSD: queue.h,v 1.70.10.1 2017/10/02 13:21:41 martin Exp $ */ /* * Copyright (c) 1991, 1993 @@ -211,10 +211,11 @@ struct { \ ((tvar) = LIST_NEXT((var), field), 1); \ (var) = (tvar)) -#define LIST_MOVE(head1, head2) do { \ +#define LIST_MOVE(head1, head2, field) do { \ LIST_INIT((head2)); \ if (!LIST_EMPTY((head1))) { \ (head2)->lh_first = (head1)->lh_first; \ + (head2)->lh_first->field.le_prev = &(head2)->lh_first; \ LIST_INIT((head1)); \ } \ } while (/*CONSTCOND*/0) diff --git a/tests/include/sys/Makefile b/tests/include/sys/Makefile index b7b78458b254..f2500dd8c02b 100644 --- a/tests/include/sys/Makefile +++ b/tests/include/sys/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.12 2016/08/08 14:11:08 pgoyette Exp $ +# $NetBSD: Makefile,v 1.12.6.1 2017/10/02 13:21:40 martin Exp $ NOMAN= # defined @@ -9,6 +9,7 @@ TESTSDIR= ${TESTSBASE}/include/sys TESTS_C+= t_bitops TESTS_C+= t_bootblock TESTS_C+= t_cdefs +TESTS_C+= t_list TESTS_C+= t_pslist TESTS_C+= t_tree TESTS_C+= t_types diff --git a/tests/include/sys/t_list.c b/tests/include/sys/t_list.c new file mode 100644 index 000000000000..a5ca2ed8c241 --- /dev/null +++ b/tests/include/sys/t_list.c @@ -0,0 +1,89 @@ +/* $NetBSD: t_list.c,v 1.2.2.2 2017/10/02 13:21:40 martin Exp $ */ + +/*- + * Copyright (c) 2017 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Paul Goyette + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL 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, STRICT 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. + */ + +#include +#include + +#include + +#include + +/* + * XXX This is a limited test to make sure the operations behave as + * described on a sequential machine. It does nothing to test the + * pserialize-safety of any operations. + */ + +ATF_TC(list_move); +ATF_TC_HEAD(list_move, tc) +{ + atf_tc_set_md_var(tc, "descr", "LIST_MOVE verification"); +} +ATF_TC_BODY(list_move, tc) +{ + LIST_HEAD(listhead, entry) old_head, new_head, old_copy; + struct entry { + LIST_ENTRY(entry) entries; + uint64_t value; + } *n1, *n2, *n3; + + LIST_INIT(&old_head); + + n1 = malloc(sizeof(struct entry)); + n1->value = 1; + LIST_INSERT_HEAD(&old_head, n1, entries); + + n2 = malloc(sizeof(struct entry)); + n2->value = 2; + LIST_INSERT_HEAD(&old_head, n2, entries); + + LIST_MOVE(&old_head, &new_head, entries); + + memcpy(&old_copy, &old_head, sizeof(old_head)); + + n3 = LIST_FIRST(&new_head); + ATF_CHECK_MSG(n3->value = 2, "Unexpected value for LIST_FIRST"); + + LIST_REMOVE(n3, entries); + ATF_CHECK_MSG(memcmp(&old_copy, &old_head, sizeof(old_head)) == 0, + "Unexpected modification of old_head during LIST_REMOVE"); + + LIST_REMOVE(LIST_FIRST(&new_head), entries); + ATF_CHECK_MSG(LIST_EMPTY(&new_head), "New list not empty!"); +} + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp, list_move); + + return atf_no_error(); +}