[PATCH libdrm 2/9] tests/hash: extract test out of xf86drmHash.c

2015-03-23 Thread Jan Vesely
On Sun, 2015-03-22 at 22:03 +, Emil Velikov wrote:
> This way with follow up commits we can fix it and wire it up to
> make check
> 
> Signed-off-by: Emil Velikov 
> ---
>  tests/Makefile.am |   3 +-
>  tests/hash.c  | 219 
> ++
>  xf86drmHash.c | 174 +++
>  3 files changed, 231 insertions(+), 165 deletions(-)
>  create mode 100644 tests/hash.c
> 
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 10f54e3..ea826b5 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -29,7 +29,8 @@ LDADD = $(top_builddir)/libdrm.la
>  
>  check_PROGRAMS = \
>   dristat \
> - drmstat
> + drmstat \
> + hash
>  
>  if HAVE_NOUVEAU
>  SUBDIRS += nouveau
> diff --git a/tests/hash.c b/tests/hash.c
> new file mode 100644
> index 000..d57d2dc
> --- /dev/null
> +++ b/tests/hash.c
> @@ -0,0 +1,219 @@
> +/* xf86drmHash.c -- Small hash table support for integer -> integer mapping
> + * Created: Sun Apr 18 09:35:45 1999 by faith at precisioninsight.com
> + *
> + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
> + * All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
> OTHER
> + * DEALINGS IN THE SOFTWARE.
> + *
> + * Authors: Rickard E. (Rik) Faith 
> + *
> + * DESCRIPTION
> + *
> + * This file contains a straightforward implementation of a fixed-sized
> + * hash table using self-organizing linked lists [Knuth73, pp. 398-399] for
> + * collision resolution.  There are two potentially interesting things
> + * about this implementation:
> + *
> + * 1) The table is power-of-two sized.  Prime sized tables are more
> + * traditional, but do not have a significant advantage over power-of-two
> + * sized table, especially when double hashing is not used for collision
> + * resolution.
> + *
> + * 2) The hash computation uses a table of random integers [Hanson97,
> + * pp. 39-41].
> + *
> + * FUTURE ENHANCEMENTS
> + *
> + * With a table size of 512, the current implementation is sufficient for a
> + * few hundred keys.  Since this is well above the expected size of the
> + * tables for which this implementation was designed, the implementation of
> + * dynamic hash tables was postponed until the need arises.  A common (and
> + * naive) approach to dynamic hash table implementation simply creates a
> + * new hash table when necessary, rehashes all the data into the new table,
> + * and destroys the old table.  The approach in [Larson88] is superior in
> + * two ways: 1) only a portion of the table is expanded when needed,
> + * distributing the expansion cost over several insertions, and 2) portions
> + * of the table can be locked, enabling a scalable thread-safe
> + * implementation.
> + *
> + * REFERENCES
> + *
> + * [Hanson97] David R. Hanson.  C Interfaces and Implementations:
> + * Techniques for Creating Reusable Software.  Reading, Massachusetts:
> + * Addison-Wesley, 1997.
> + *
> + * [Knuth73] Donald E. Knuth. The Art of Computer Programming.  Volume 3:
> + * Sorting and Searching.  Reading, Massachusetts: Addison-Wesley, 1973.
> + *
> + * [Larson88] Per-Ake Larson. "Dynamic Hash Tables".  CACM 31(4), April
> + * 1988, pp. 446-457.
> + *
> + */
> +
> +#include 
> +#include 
> +
> +#include "xf86drm.h"
> +
> +#define HASH_SIZE  512   /* Good for about 100 entries */
> + /* If you change this value, you probably
> +   have to change the HashHash hashing
> +   function! */
> +
> +typedef struct HashBucket {
> +unsigned long key;
> +void  *value;
> +struct HashBucket *next;
> +} HashBucket, *HashBucketPtr;
> +
> +typedef struct HashTable {
> +unsigned longmagic;
> +unsigned longentries;
> +unsigned longhits;   /* At top of linked list */
> +

[PATCH libdrm 2/9] tests/hash: extract test out of xf86drmHash.c

2015-03-22 Thread Emil Velikov
This way with follow up commits we can fix it and wire it up to
make check

Signed-off-by: Emil Velikov 
---
 tests/Makefile.am |   3 +-
 tests/hash.c  | 219 ++
 xf86drmHash.c | 174 +++
 3 files changed, 231 insertions(+), 165 deletions(-)
 create mode 100644 tests/hash.c

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 10f54e3..ea826b5 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -29,7 +29,8 @@ LDADD = $(top_builddir)/libdrm.la

 check_PROGRAMS = \
dristat \
-   drmstat
+   drmstat \
+   hash

 if HAVE_NOUVEAU
 SUBDIRS += nouveau
diff --git a/tests/hash.c b/tests/hash.c
new file mode 100644
index 000..d57d2dc
--- /dev/null
+++ b/tests/hash.c
@@ -0,0 +1,219 @@
+/* xf86drmHash.c -- Small hash table support for integer -> integer mapping
+ * Created: Sun Apr 18 09:35:45 1999 by faith at precisioninsight.com
+ *
+ * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Rickard E. (Rik) Faith 
+ *
+ * DESCRIPTION
+ *
+ * This file contains a straightforward implementation of a fixed-sized
+ * hash table using self-organizing linked lists [Knuth73, pp. 398-399] for
+ * collision resolution.  There are two potentially interesting things
+ * about this implementation:
+ *
+ * 1) The table is power-of-two sized.  Prime sized tables are more
+ * traditional, but do not have a significant advantage over power-of-two
+ * sized table, especially when double hashing is not used for collision
+ * resolution.
+ *
+ * 2) The hash computation uses a table of random integers [Hanson97,
+ * pp. 39-41].
+ *
+ * FUTURE ENHANCEMENTS
+ *
+ * With a table size of 512, the current implementation is sufficient for a
+ * few hundred keys.  Since this is well above the expected size of the
+ * tables for which this implementation was designed, the implementation of
+ * dynamic hash tables was postponed until the need arises.  A common (and
+ * naive) approach to dynamic hash table implementation simply creates a
+ * new hash table when necessary, rehashes all the data into the new table,
+ * and destroys the old table.  The approach in [Larson88] is superior in
+ * two ways: 1) only a portion of the table is expanded when needed,
+ * distributing the expansion cost over several insertions, and 2) portions
+ * of the table can be locked, enabling a scalable thread-safe
+ * implementation.
+ *
+ * REFERENCES
+ *
+ * [Hanson97] David R. Hanson.  C Interfaces and Implementations:
+ * Techniques for Creating Reusable Software.  Reading, Massachusetts:
+ * Addison-Wesley, 1997.
+ *
+ * [Knuth73] Donald E. Knuth. The Art of Computer Programming.  Volume 3:
+ * Sorting and Searching.  Reading, Massachusetts: Addison-Wesley, 1973.
+ *
+ * [Larson88] Per-Ake Larson. "Dynamic Hash Tables".  CACM 31(4), April
+ * 1988, pp. 446-457.
+ *
+ */
+
+#include 
+#include 
+
+#include "xf86drm.h"
+
+#define HASH_SIZE  512 /* Good for about 100 entries */
+   /* If you change this value, you probably
+   have to change the HashHash hashing
+   function! */
+
+typedef struct HashBucket {
+unsigned long key;
+void  *value;
+struct HashBucket *next;
+} HashBucket, *HashBucketPtr;
+
+typedef struct HashTable {
+unsigned longmagic;
+unsigned longentries;
+unsigned longhits; /* At top of linked list */
+unsigned longpartials; /* Not at top of linked list */
+unsigned longmisses;   /* Not in table */
+HashBucketPtrbuckets[HASH_SIZE];
+int  p0;
+HashBucketPtrp1;
+} HashTable, *HashTablePtr;
+
+#define DIST_LIMIT 10
+static int dist[DIST_LIMIT];
+
+static void