From 005e305c226770deef7cdfcd4c03b857f96687ff Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Fri, 10 Jul 2015 15:18:45 -0700 Subject: Initial checkin commit for lockfree stack. Tests not yet included. --- src/core/support/stack_lockfree.h | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/core/support/stack_lockfree.h (limited to 'src/core/support/stack_lockfree.h') diff --git a/src/core/support/stack_lockfree.h b/src/core/support/stack_lockfree.h new file mode 100644 index 0000000000..7919ef38cc --- /dev/null +++ b/src/core/support/stack_lockfree.h @@ -0,0 +1,50 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT + * OWNER 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. + * + */ + +#ifndef GRPC_INTERNAL_CORE_SUPPORT_STACK_LOCKFREE_H +#define GRPC_INTERNAL_CORE_SUPPORT_STACK_LOCKFREE_H + +typedef struct gpr_stack_lockfree gpr_stack_lockfree; + +/* This stack must specify the maximum number of entries to track. + The current implementation only allows up to 65534 entries */ +gpr_stack_lockfree *gpr_stack_lockfree_create(int entries); +void gpr_stack_lockfree_destroy(gpr_stack_lockfree *); + +/* Pass in a valid entry number for the next stack entry */ +void gpr_stack_lockfree_push(gpr_stack_lockfree *, int entry); + +/* Returns -1 on empty or the actual entry number */ +int gpr_stack_lockfree_pop(gpr_stack_lockfree *); + +#endif /* GRPC_INTERNAL_CORE_SUPPORT_STACK_LOCKFREE_H */ -- cgit v1.2.3 From d6cc1814c069f9023b886af7119d0b4ea9f49688 Mon Sep 17 00:00:00 2001 From: vjpai Date: Tue, 14 Jul 2015 14:49:01 -0700 Subject: Name arguments --- src/core/support/stack_lockfree.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/core/support/stack_lockfree.h') diff --git a/src/core/support/stack_lockfree.h b/src/core/support/stack_lockfree.h index 7919ef38cc..f1d8c77279 100644 --- a/src/core/support/stack_lockfree.h +++ b/src/core/support/stack_lockfree.h @@ -39,12 +39,12 @@ typedef struct gpr_stack_lockfree gpr_stack_lockfree; /* This stack must specify the maximum number of entries to track. The current implementation only allows up to 65534 entries */ gpr_stack_lockfree *gpr_stack_lockfree_create(int entries); -void gpr_stack_lockfree_destroy(gpr_stack_lockfree *); +void gpr_stack_lockfree_destroy(gpr_stack_lockfree* stack); /* Pass in a valid entry number for the next stack entry */ -void gpr_stack_lockfree_push(gpr_stack_lockfree *, int entry); +void gpr_stack_lockfree_push(gpr_stack_lockfree* stack, int entry); /* Returns -1 on empty or the actual entry number */ -int gpr_stack_lockfree_pop(gpr_stack_lockfree *); +int gpr_stack_lockfree_pop(gpr_stack_lockfree* stack); #endif /* GRPC_INTERNAL_CORE_SUPPORT_STACK_LOCKFREE_H */ -- cgit v1.2.3 From d54c3e6b39643c34e7466ff826a4a9f2b909a769 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Tue, 14 Jul 2015 14:52:34 -0700 Subject: clang-format changed files --- src/core/support/stack_lockfree.c | 10 ++++------ src/core/support/stack_lockfree.h | 4 ++-- test/core/support/stack_lockfree_test.c | 28 ++++++++++++++-------------- 3 files changed, 20 insertions(+), 22 deletions(-) (limited to 'src/core/support/stack_lockfree.h') diff --git a/src/core/support/stack_lockfree.c b/src/core/support/stack_lockfree.c index 83a68444f5..9497efbfb5 100644 --- a/src/core/support/stack_lockfree.c +++ b/src/core/support/stack_lockfree.c @@ -65,7 +65,8 @@ typedef union lockfree_node { } lockfree_node; #define ENTRY_ALIGNMENT_BITS 3 /* make sure that entries aligned to 8-bytes */ -#define INVALID_ENTRY_INDEX ((1<<16)-1) /* reserve this entry as invalid */ +#define INVALID_ENTRY_INDEX ((1 << 16) - 1) /* reserve this entry as invalid \ + */ struct gpr_stack_lockfree { lockfree_node *entries; @@ -109,8 +110,7 @@ void gpr_stack_lockfree_push(gpr_stack_lockfree *stack, int entry) { head.atm = gpr_atm_no_barrier_load(&(stack->head.atm)); /* Point to it */ stack->entries[entry].contents.index = head.contents.index; - } while (!gpr_atm_rel_cas(&(stack->head.atm), - head.atm, newhead.atm)); + } while (!gpr_atm_rel_cas(&(stack->head.atm), head.atm, newhead.atm)); /* Use rel_cas above to make sure that entry index is set properly */ } @@ -125,8 +125,6 @@ int gpr_stack_lockfree_pop(gpr_stack_lockfree *stack) { newhead.atm = gpr_atm_no_barrier_load(&(stack->entries[head.contents.index].atm)); - } while (!gpr_atm_no_barrier_cas(&(stack->head.atm), - head.atm, - newhead.atm)); + } while (!gpr_atm_no_barrier_cas(&(stack->head.atm), head.atm, newhead.atm)); return head.contents.index; } diff --git a/src/core/support/stack_lockfree.h b/src/core/support/stack_lockfree.h index f1d8c77279..0bcf73635d 100644 --- a/src/core/support/stack_lockfree.h +++ b/src/core/support/stack_lockfree.h @@ -38,7 +38,7 @@ typedef struct gpr_stack_lockfree gpr_stack_lockfree; /* This stack must specify the maximum number of entries to track. The current implementation only allows up to 65534 entries */ -gpr_stack_lockfree *gpr_stack_lockfree_create(int entries); +gpr_stack_lockfree* gpr_stack_lockfree_create(int entries); void gpr_stack_lockfree_destroy(gpr_stack_lockfree* stack); /* Pass in a valid entry number for the next stack entry */ @@ -47,4 +47,4 @@ void gpr_stack_lockfree_push(gpr_stack_lockfree* stack, int entry); /* Returns -1 on empty or the actual entry number */ int gpr_stack_lockfree_pop(gpr_stack_lockfree* stack); -#endif /* GRPC_INTERNAL_CORE_SUPPORT_STACK_LOCKFREE_H */ +#endif /* GRPC_INTERNAL_CORE_SUPPORT_STACK_LOCKFREE_H */ diff --git a/test/core/support/stack_lockfree_test.c b/test/core/support/stack_lockfree_test.c index ebee04d5b8..42082de389 100644 --- a/test/core/support/stack_lockfree_test.c +++ b/test/core/support/stack_lockfree_test.c @@ -59,13 +59,13 @@ static void test_serial_sized(int size) { GPR_ASSERT(gpr_stack_lockfree_pop(stack) == -1); /* Now add repeatedly more items and check them */ - for (i=1; irank*arg->stack_size/arg->nthreads; - hi = (arg->rank+1)*arg->stack_size/arg->nthreads; - for (i=lo; irank * arg->stack_size / arg->nthreads; + hi = (arg->rank + 1) * arg->stack_size / arg->nthreads; + for (i = lo; i < hi; i++) { gpr_stack_lockfree_push(arg->stack, i); if ((res = gpr_stack_lockfree_pop(arg->stack)) != -1) { arg->sum += res; @@ -116,7 +116,7 @@ static void test_mt_sized(int size, int nth) { gpr_thd_options options = gpr_thd_options_default(); stack = gpr_stack_lockfree_create(size); - for (i=0; i