aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/net.h
diff options
context:
space:
mode:
authorChen Gang <gang.chen.5i5j@gmail.com>2014-11-11 21:11:31 -0500
committerChris Metcalf <cmetcalf@tilera.com>2014-11-12 14:27:10 -0500
commita5c1cb63ddf400cf58c7d8aecd045049f6818279 (patch)
treec1ef98848041983ce59a4d0ff1677e6c63242b18 /net/tipc/net.h
parentf47436734dc89ece62654d4db8d08163a89dd7ca (diff)
arch: tile: kernel: kgdb.c: Use memcpy() instead of pointer copy one by one
Not only memcpy() is faster than pointer copy, but also let code more clearer and simple, which can avoid compiling warning (the original implementation copy registers by exceeding member array border). The related warning (with allmodconfig under tile): CC arch/tile/kernel/kgdb.o arch/tile/kernel/kgdb.c: In function 'sleeping_thread_to_gdb_regs': arch/tile/kernel/kgdb.c:140:31: warning: iteration 53u invokes undefined behavior [-Waggressive-loop-optimizations] *(ptr++) = thread_regs->regs[reg]; ^ arch/tile/kernel/kgdb.c:139:2: note: containing loop for (reg = 0; reg <= TREG_LAST_GPR; reg++) ^ Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com> Signed-off-by: Chris Metcalf <cmetcalf@ezchip.com>
Diffstat (limited to 'net/tipc/net.h')
0 files changed, 0 insertions, 0 deletions
135' href='#n135'>135 136 137 138 139 140 141 142 143 144 145 146
/*
 * Based on intlist.c by:
 * (c) 2009 Arnaldo Carvalho de Melo <acme@redhat.com>
 *
 * Licensed under the GPLv2.
 */

#include <errno.h>
#include <stdlib.h>
#include <linux/compiler.h>

#include "intlist.h"

static struct rb_node *intlist__node_new(struct rblist *rblist __maybe_unused,
					 const void *entry)
{
	int i = (int)((long)entry);
	struct rb_node *rc = NULL;
	struct int_node *node = malloc(sizeof(*node));

	if (node != NULL) {
		node->i = i;
		node->priv = NULL;
		rc = &node->rb_node;
	}

	return rc;
}

static void int_node__delete(struct int_node *ilist)
{
	free(ilist);
}

static void intlist__node_delete(struct rblist *rblist __maybe_unused,
				 struct rb_node *rb_node)
{
	struct int_node *node = container_of(rb_node, struct int_node, rb_node);

	int_node__delete(node);
}

static int intlist__node_cmp(struct rb_node *rb_node, const void *entry)
{
	int i = (int)((long)entry);
	struct int_node *node = container_of(rb_node, struct int_node, rb_node);

	return node->i - i;
}

int intlist__add(struct intlist *ilist, int i)
{
	return rblist__add_node(&ilist->rblist, (void *)((long)i));
}

void intlist__remove(struct intlist *ilist, struct int_node *node)
{
	rblist__remove_node(&ilist->rblist, &node->rb_node);
}

static struct int_node *__intlist__findnew(struct intlist *ilist,
					   int i, bool create)
{
	struct int_node *node = NULL;
	struct rb_node *rb_node;

	if (ilist == NULL)
		return NULL;

	if (create)
		rb_node = rblist__findnew(&ilist->rblist, (void *)((long)i));
	else
		rb_node = rblist__find(&ilist->rblist, (void *)((long)i));

	if (rb_node)
		node = container_of(rb_node, struct int_node, rb_node);

	return node;
}

struct int_node *intlist__find(struct intlist *ilist, int i)
{
	return __intlist__findnew(ilist, i, false);
}

struct int_node *intlist__findnew(struct intlist *ilist, int i)
{
	return __intlist__findnew(ilist, i, true);
}

static int intlist__parse_list(struct intlist *ilist, const char *s)
{
	char *sep;
	int err;

	do {
		long value = strtol(s, &sep, 10);
		err = -EINVAL;
		if (*sep != ',' && *sep != '\0')
			break;
		err = intlist__add(ilist, value);
		if (err)
			break;
		s = sep + 1;
	} while (*sep != '\0');

	return err;
}

struct intlist *intlist__new(const char *slist)
{
	struct intlist *ilist = malloc(sizeof(*ilist));

	if (ilist != NULL) {
		rblist__init(&ilist->rblist);
		ilist->rblist.node_cmp    = intlist__node_cmp;
		ilist->rblist.node_new    = intlist__node_new;
		ilist->rblist.node_delete = intlist__node_delete;

		if (slist && intlist__parse_list(ilist, slist))
			goto out_delete;
	}

	return ilist;
out_delete:
	intlist__delete(ilist);
	return NULL;
}

void intlist__delete(struct intlist *ilist)
{
	if (ilist != NULL)
		rblist__delete(&ilist->rblist);
}

struct int_node *intlist__entry(const struct intlist *ilist, unsigned int idx)
{
	struct int_node *node = NULL;
	struct rb_node *rb_node;

	rb_node = rblist__entry(&ilist->rblist, idx);
	if (rb_node)
		node = container_of(rb_node, struct int_node, rb_node);

	return node;
}