merge in changes from svn[r1572..r1601]
------------------------------------------------------------------------
r1601 | sears.russell@gmail.com | 2012-03-20 18:43:00 -0400 (Tue, 20
Mar 2012) | 1 line
commit bLSM bloom filter to stasis/util, which is where it really
belongs
------------------------------------------------------------------------
r1600 | sears.russell@gmail.com | 2012-03-04 01:58:38 -0500 (Sun, 04
Mar 2012) | 1 line
fix memory leak in skiplist unit test (now it is valgrind clean)
------------------------------------------------------------------------
r1599 | sears.russell@gmail.com | 2012-03-04 01:58:05 -0500 (Sun, 04
Mar 2012) | 1 line
fix typo in finalize type
------------------------------------------------------------------------
r1598 | sears.russell@gmail.com | 2012-03-04 00:59:59 -0500 (Sun, 04
Mar 2012) | 1 line
add comparator and finalizer parameters to skiplist constructor
------------------------------------------------------------------------
r1597 | sears.russell@gmail.com | 2012-03-03 18:23:16 -0500 (Sat, 03
Mar 2012) | 1 line
bugfixes for skiplist
------------------------------------------------------------------------
r1596 | sears.russell@gmail.com | 2012-03-02 15:05:07 -0500 (Fri, 02
Mar 2012) | 1 line
updated concurrentSkipList. Seeing strange crashes
------------------------------------------------------------------------
r1595 | sears.russell@gmail.com | 2012-03-01 16:51:59 -0500 (Thu, 01
Mar 2012) | 1 line
add progress reports
------------------------------------------------------------------------
r1594 | sears.russell@gmail.com | 2012-02-28 13:17:05 -0500 (Tue, 28
Feb 2012) | 1 line
experimental support for automatic logfile preallocation
------------------------------------------------------------------------
r1593 | sears.russell@gmail.com | 2012-02-28 12:10:01 -0500 (Tue, 28
Feb 2012) | 1 line
add histogram reporting to rawIOPS benchmark
------------------------------------------------------------------------
r1592 | sears.russell@gmail.com | 2012-02-24 16:31:36 -0500 (Fri, 24
Feb 2012) | 1 line
userspace raid 0 implementation
------------------------------------------------------------------------
r1591 | sears.russell@gmail.com | 2012-02-12 01:47:25 -0500 (Sun, 12
Feb 2012) | 1 line
add skiplist unit test, fix compile warnings
------------------------------------------------------------------------
r1590 | sears.russell@gmail.com | 2012-02-12 00:52:52 -0500 (Sun, 12
Feb 2012) | 1 line
fix compile error
------------------------------------------------------------------------
r1589 | sears.russell@gmail.com | 2012-02-12 00:50:21 -0500 (Sun, 12
Feb 2012) | 1 line
fix some bugs in hazard.h surrounding thread list management and
overruns of R under high contention
------------------------------------------------------------------------
r1588 | sears.russell@gmail.com | 2012-02-11 14:23:10 -0500 (Sat, 11
Feb 2012) | 1 line
add hazard pointer for get_lock. It was implicitly blowing away the
hazard pointer protecting y in the caller
------------------------------------------------------------------------
r1587 | sears.russell@gmail.com | 2012-02-10 18:51:25 -0500 (Fri, 10
Feb 2012) | 1 line
fix null pointer bug
------------------------------------------------------------------------
r1586 | sears.russell@gmail.com | 2012-02-10 18:03:39 -0500 (Fri, 10
Feb 2012) | 1 line
add simple refcounting scheme to concurrentSkipList. This solves the
problem where a deleted node points to another deleted node, and we
only have a hazard pointer for the first node.
------------------------------------------------------------------------
r1585 | sears.russell@gmail.com | 2012-02-10 14:19:14 -0500 (Fri, 10
Feb 2012) | 1 line
add hazard pointers for update using the smallest free slot first. The
old method left a race condition, since hazard_scan stops at the first
null pointer.
------------------------------------------------------------------------
r1584 | sears.russell@gmail.com | 2012-02-10 02:45:30 -0500 (Fri, 10
Feb 2012) | 1 line
add hazard pointers for update array
------------------------------------------------------------------------
r1583 | sears.russell@gmail.com | 2012-02-10 00:04:50 -0500 (Fri, 10
Feb 2012) | 1 line
skiplist update: concurrent, but broken
------------------------------------------------------------------------
r1582 | sears.russell@gmail.com | 2012-02-09 17:44:27 -0500 (Thu, 09
Feb 2012) | 1 line
skip list implementation. Not concurrent yet.
------------------------------------------------------------------------
r1581 | sears.russell@gmail.com | 2012-02-08 13:33:29 -0500 (Wed, 08
Feb 2012) | 1 line
Commit of a bunch of new, unused code: KISS random number generator,
Hazard Pointers, SUX latches (untested) and bit twiddling for
concurrent b-tree
------------------------------------------------------------------------
r1580 | sears.russell@gmail.com | 2012-01-17 19:17:37 -0500 (Tue, 17
Jan 2012) | 1 line
fix typo
------------------------------------------------------------------------
r1579 | sears.russell@gmail.com | 2012-01-11 18:33:31 -0500 (Wed, 11
Jan 2012) | 1 line
static build fixes for linux. hopefully these do not break macos...
------------------------------------------------------------------------
r1578 | sears.russell@gmail.com | 2012-01-09 19:13:34 -0500 (Mon, 09
Jan 2012) | 1 line
fix cmake under linux
------------------------------------------------------------------------
r1577 | sears.russell@gmail.com | 2012-01-09 18:37:15 -0500 (Mon, 09
Jan 2012) | 1 line
fix linux static binary compilation bugs
------------------------------------------------------------------------
r1576 | sears.russell | 2012-01-09 18:00:08 -0500 (Mon, 09 Jan 2012) |
1 line
port to macos x
------------------------------------------------------------------------
r1575 | sears.russell | 2012-01-09 17:39:43 -0500 (Mon, 09 Jan 2012) |
1 line
add missing _ from sync call name
------------------------------------------------------------------------
r1574 | sears.russell@gmail.com | 2012-01-09 14:26:31 -0500 (Mon, 09
Jan 2012) | 1 line
add -rt flag to static builds
------------------------------------------------------------------------
r1573 | sears.russell@gmail.com | 2011-12-20 23:38:29 -0500 (Tue, 20
Dec 2011) | 1 line
Simple makefile geared toward building libstasis.so and libstasis.a
(and nothing else)
------------------------------------------------------------------------
r1572 | sears.russell@gmail.com | 2011-12-20 22:37:54 -0500 (Tue, 20
Dec 2011) | 1 line
add some missing #include<config.h> lines
2012-04-21 16:52:31 +00:00
|
|
|
/*
|
|
|
|
* hazard.h
|
|
|
|
*
|
|
|
|
* Created on: Feb 7, 2012
|
|
|
|
* Author: sears
|
|
|
|
*/
|
|
|
|
#include <stasis/common.h>
|
|
|
|
#include <stasis/util/time.h>
|
|
|
|
#include <assert.h>
|
|
|
|
#ifndef HAZARD_H_
|
|
|
|
#define HAZARD_H_
|
|
|
|
|
|
|
|
typedef intptr_t hazard_ptr;
|
|
|
|
typedef struct hazard_t hazard_t;
|
|
|
|
|
|
|
|
typedef struct hazard_ptr_rec_t {
|
|
|
|
hazard_t * h;
|
|
|
|
hazard_ptr * hp;
|
|
|
|
void ** rlist;
|
|
|
|
int rlist_len;
|
|
|
|
struct hazard_ptr_rec_t * next;
|
|
|
|
} hazard_ptr_rec_t;
|
|
|
|
|
|
|
|
struct hazard_t {
|
|
|
|
pthread_key_t hp;
|
|
|
|
int num_slots;
|
|
|
|
int stack_start;
|
|
|
|
int num_r_slots;
|
|
|
|
int (*finalizer)(void *, void* conf);
|
|
|
|
void * conf;
|
|
|
|
hazard_ptr_rec_t * tls_list;
|
|
|
|
pthread_mutex_t tls_list_mut;
|
|
|
|
pthread_cond_t thread_shutdown;
|
|
|
|
};
|
|
|
|
static int intptr_cmp(const void * ap, const void *bp) {
|
|
|
|
intptr_t a = *(intptr_t*)ap;
|
|
|
|
intptr_t b = *(intptr_t*)bp;
|
|
|
|
return (a < b) ? -1 : ( (a > b) ? 1 : 0 );
|
|
|
|
}
|
|
|
|
static inline void hazard_scan(hazard_t * h, hazard_ptr_rec_t * rec) {
|
|
|
|
if(rec == NULL) {
|
|
|
|
rec = pthread_getspecific(h->hp);
|
|
|
|
}
|
|
|
|
if(rec == NULL) { return; }
|
|
|
|
qsort(rec->rlist, rec->rlist_len, sizeof(void*), intptr_cmp);
|
|
|
|
hazard_ptr * ptrs = 0;
|
|
|
|
int ptrs_len = 0;
|
|
|
|
pthread_mutex_lock(&h->tls_list_mut);
|
|
|
|
hazard_ptr_rec_t * list = h->tls_list;
|
|
|
|
while(list != NULL) {
|
|
|
|
ptrs = realloc(ptrs, sizeof(hazard_ptr) * (ptrs_len+h->num_slots));
|
|
|
|
// int would_stop = 0;
|
|
|
|
for(int i = 0; i < h->num_slots; i++) {
|
|
|
|
ptrs[ptrs_len] = list->hp[i];
|
|
|
|
if(!ptrs[ptrs_len]) {
|
|
|
|
// if(i >= h->stack_start) { would_stop = 1; }
|
|
|
|
if(i >= h->stack_start) { break; }
|
|
|
|
} else {
|
|
|
|
// assert(! would_stop);
|
|
|
|
ptrs_len++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
list = list->next;
|
|
|
|
}
|
|
|
|
pthread_mutex_unlock(&h->tls_list_mut);
|
|
|
|
qsort(ptrs, ptrs_len, sizeof(void*), intptr_cmp);
|
|
|
|
int i = 0, j = 0;
|
|
|
|
while(j < rec->rlist_len) {
|
|
|
|
while(i < ptrs_len && (hazard_ptr)rec->rlist[j] > ptrs[i]) { i++; }
|
|
|
|
if(i == ptrs_len || (hazard_ptr)rec->rlist[j] != ptrs[i]) {
|
|
|
|
if(h->finalizer((void*)rec->rlist[j], h->conf)) {
|
|
|
|
rec->rlist[j] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
j++;
|
|
|
|
}
|
|
|
|
j = 0;
|
|
|
|
for(i = 0; i < rec->rlist_len; i++) {
|
|
|
|
if(rec->rlist[i] != 0) {
|
|
|
|
rec->rlist[j] = rec->rlist[i];
|
|
|
|
j++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
rec->rlist_len = j;
|
|
|
|
free(ptrs);
|
|
|
|
}
|
|
|
|
static void hazard_deinit_thread(void * p) {
|
|
|
|
hazard_ptr_rec_t * rec = p;
|
|
|
|
if(rec != NULL) {
|
|
|
|
while(rec->rlist_len != 0) {
|
|
|
|
hazard_scan(rec->h, rec);
|
|
|
|
if(rec->rlist_len != 0) {
|
|
|
|
pthread_mutex_lock(&rec->h->tls_list_mut);
|
|
|
|
struct timeval tv;
|
|
|
|
gettimeofday(&tv, 0);
|
|
|
|
struct timespec ts = stasis_double_to_timespec(stasis_timeval_to_double(tv) + 0.01);
|
|
|
|
pthread_cond_timedwait(&rec->h->thread_shutdown,
|
|
|
|
&rec->h->tls_list_mut, &ts);
|
|
|
|
pthread_mutex_unlock(&rec->h->tls_list_mut);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pthread_cond_broadcast(&rec->h->thread_shutdown);
|
|
|
|
pthread_mutex_lock(&rec->h->tls_list_mut);
|
|
|
|
hazard_ptr_rec_t ** last = &rec->h->tls_list;
|
|
|
|
hazard_ptr_rec_t * list = *last;
|
|
|
|
while(list != rec) {
|
|
|
|
last = &list->next;
|
|
|
|
list = *last;
|
|
|
|
}
|
|
|
|
*last = rec->next;
|
|
|
|
pthread_mutex_unlock(&rec->h->tls_list_mut);
|
|
|
|
free(rec->hp);
|
|
|
|
free(rec->rlist);
|
|
|
|
free(rec);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Init the state necessary for a set of hazard pointers. This module
|
|
|
|
* implements an optimization where the higher numbered pointers can be treated
|
|
|
|
* as a fixed length stack. Entries after the first NULL in that region will
|
|
|
|
* be ignored. This allows applications that need varying numbers of hazard
|
|
|
|
* pointers to be collected efficiently.
|
|
|
|
*
|
|
|
|
* @param hp_slots the total number of slots.
|
|
|
|
* @param stack_start the first hazard pointer in the "stack" region.
|
|
|
|
* @param r_slots the max number of uncollected values per thread.
|
|
|
|
*/
|
|
|
|
static inline hazard_t* hazard_init(int hp_slots, int stack_start, int r_slots,
|
|
|
|
int (*finalizer)(void*, void*), void * conf) {
|
2012-11-15 07:04:03 +00:00
|
|
|
hazard_t * ret = stasis_alloc(hazard_t);
|
merge in changes from svn[r1572..r1601]
------------------------------------------------------------------------
r1601 | sears.russell@gmail.com | 2012-03-20 18:43:00 -0400 (Tue, 20
Mar 2012) | 1 line
commit bLSM bloom filter to stasis/util, which is where it really
belongs
------------------------------------------------------------------------
r1600 | sears.russell@gmail.com | 2012-03-04 01:58:38 -0500 (Sun, 04
Mar 2012) | 1 line
fix memory leak in skiplist unit test (now it is valgrind clean)
------------------------------------------------------------------------
r1599 | sears.russell@gmail.com | 2012-03-04 01:58:05 -0500 (Sun, 04
Mar 2012) | 1 line
fix typo in finalize type
------------------------------------------------------------------------
r1598 | sears.russell@gmail.com | 2012-03-04 00:59:59 -0500 (Sun, 04
Mar 2012) | 1 line
add comparator and finalizer parameters to skiplist constructor
------------------------------------------------------------------------
r1597 | sears.russell@gmail.com | 2012-03-03 18:23:16 -0500 (Sat, 03
Mar 2012) | 1 line
bugfixes for skiplist
------------------------------------------------------------------------
r1596 | sears.russell@gmail.com | 2012-03-02 15:05:07 -0500 (Fri, 02
Mar 2012) | 1 line
updated concurrentSkipList. Seeing strange crashes
------------------------------------------------------------------------
r1595 | sears.russell@gmail.com | 2012-03-01 16:51:59 -0500 (Thu, 01
Mar 2012) | 1 line
add progress reports
------------------------------------------------------------------------
r1594 | sears.russell@gmail.com | 2012-02-28 13:17:05 -0500 (Tue, 28
Feb 2012) | 1 line
experimental support for automatic logfile preallocation
------------------------------------------------------------------------
r1593 | sears.russell@gmail.com | 2012-02-28 12:10:01 -0500 (Tue, 28
Feb 2012) | 1 line
add histogram reporting to rawIOPS benchmark
------------------------------------------------------------------------
r1592 | sears.russell@gmail.com | 2012-02-24 16:31:36 -0500 (Fri, 24
Feb 2012) | 1 line
userspace raid 0 implementation
------------------------------------------------------------------------
r1591 | sears.russell@gmail.com | 2012-02-12 01:47:25 -0500 (Sun, 12
Feb 2012) | 1 line
add skiplist unit test, fix compile warnings
------------------------------------------------------------------------
r1590 | sears.russell@gmail.com | 2012-02-12 00:52:52 -0500 (Sun, 12
Feb 2012) | 1 line
fix compile error
------------------------------------------------------------------------
r1589 | sears.russell@gmail.com | 2012-02-12 00:50:21 -0500 (Sun, 12
Feb 2012) | 1 line
fix some bugs in hazard.h surrounding thread list management and
overruns of R under high contention
------------------------------------------------------------------------
r1588 | sears.russell@gmail.com | 2012-02-11 14:23:10 -0500 (Sat, 11
Feb 2012) | 1 line
add hazard pointer for get_lock. It was implicitly blowing away the
hazard pointer protecting y in the caller
------------------------------------------------------------------------
r1587 | sears.russell@gmail.com | 2012-02-10 18:51:25 -0500 (Fri, 10
Feb 2012) | 1 line
fix null pointer bug
------------------------------------------------------------------------
r1586 | sears.russell@gmail.com | 2012-02-10 18:03:39 -0500 (Fri, 10
Feb 2012) | 1 line
add simple refcounting scheme to concurrentSkipList. This solves the
problem where a deleted node points to another deleted node, and we
only have a hazard pointer for the first node.
------------------------------------------------------------------------
r1585 | sears.russell@gmail.com | 2012-02-10 14:19:14 -0500 (Fri, 10
Feb 2012) | 1 line
add hazard pointers for update using the smallest free slot first. The
old method left a race condition, since hazard_scan stops at the first
null pointer.
------------------------------------------------------------------------
r1584 | sears.russell@gmail.com | 2012-02-10 02:45:30 -0500 (Fri, 10
Feb 2012) | 1 line
add hazard pointers for update array
------------------------------------------------------------------------
r1583 | sears.russell@gmail.com | 2012-02-10 00:04:50 -0500 (Fri, 10
Feb 2012) | 1 line
skiplist update: concurrent, but broken
------------------------------------------------------------------------
r1582 | sears.russell@gmail.com | 2012-02-09 17:44:27 -0500 (Thu, 09
Feb 2012) | 1 line
skip list implementation. Not concurrent yet.
------------------------------------------------------------------------
r1581 | sears.russell@gmail.com | 2012-02-08 13:33:29 -0500 (Wed, 08
Feb 2012) | 1 line
Commit of a bunch of new, unused code: KISS random number generator,
Hazard Pointers, SUX latches (untested) and bit twiddling for
concurrent b-tree
------------------------------------------------------------------------
r1580 | sears.russell@gmail.com | 2012-01-17 19:17:37 -0500 (Tue, 17
Jan 2012) | 1 line
fix typo
------------------------------------------------------------------------
r1579 | sears.russell@gmail.com | 2012-01-11 18:33:31 -0500 (Wed, 11
Jan 2012) | 1 line
static build fixes for linux. hopefully these do not break macos...
------------------------------------------------------------------------
r1578 | sears.russell@gmail.com | 2012-01-09 19:13:34 -0500 (Mon, 09
Jan 2012) | 1 line
fix cmake under linux
------------------------------------------------------------------------
r1577 | sears.russell@gmail.com | 2012-01-09 18:37:15 -0500 (Mon, 09
Jan 2012) | 1 line
fix linux static binary compilation bugs
------------------------------------------------------------------------
r1576 | sears.russell | 2012-01-09 18:00:08 -0500 (Mon, 09 Jan 2012) |
1 line
port to macos x
------------------------------------------------------------------------
r1575 | sears.russell | 2012-01-09 17:39:43 -0500 (Mon, 09 Jan 2012) |
1 line
add missing _ from sync call name
------------------------------------------------------------------------
r1574 | sears.russell@gmail.com | 2012-01-09 14:26:31 -0500 (Mon, 09
Jan 2012) | 1 line
add -rt flag to static builds
------------------------------------------------------------------------
r1573 | sears.russell@gmail.com | 2011-12-20 23:38:29 -0500 (Tue, 20
Dec 2011) | 1 line
Simple makefile geared toward building libstasis.so and libstasis.a
(and nothing else)
------------------------------------------------------------------------
r1572 | sears.russell@gmail.com | 2011-12-20 22:37:54 -0500 (Tue, 20
Dec 2011) | 1 line
add some missing #include<config.h> lines
2012-04-21 16:52:31 +00:00
|
|
|
pthread_key_create(&ret->hp, hazard_deinit_thread);
|
|
|
|
ret->num_slots = hp_slots;
|
|
|
|
ret->stack_start = stack_start;
|
|
|
|
ret->num_r_slots = r_slots;
|
|
|
|
ret->tls_list = NULL;
|
|
|
|
ret->finalizer = finalizer;
|
|
|
|
ret->conf = conf;
|
|
|
|
pthread_mutex_init(&ret->tls_list_mut,0);
|
|
|
|
pthread_cond_init(&ret->thread_shutdown, 0);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
static inline hazard_ptr_rec_t * hazard_ensure_tls(hazard_t * h) {
|
|
|
|
hazard_ptr_rec_t * rec = pthread_getspecific(h->hp);
|
|
|
|
if(rec == NULL) {
|
2012-11-15 07:04:03 +00:00
|
|
|
rec = stasis_alloc(hazard_ptr_rec_t);
|
merge in changes from svn[r1572..r1601]
------------------------------------------------------------------------
r1601 | sears.russell@gmail.com | 2012-03-20 18:43:00 -0400 (Tue, 20
Mar 2012) | 1 line
commit bLSM bloom filter to stasis/util, which is where it really
belongs
------------------------------------------------------------------------
r1600 | sears.russell@gmail.com | 2012-03-04 01:58:38 -0500 (Sun, 04
Mar 2012) | 1 line
fix memory leak in skiplist unit test (now it is valgrind clean)
------------------------------------------------------------------------
r1599 | sears.russell@gmail.com | 2012-03-04 01:58:05 -0500 (Sun, 04
Mar 2012) | 1 line
fix typo in finalize type
------------------------------------------------------------------------
r1598 | sears.russell@gmail.com | 2012-03-04 00:59:59 -0500 (Sun, 04
Mar 2012) | 1 line
add comparator and finalizer parameters to skiplist constructor
------------------------------------------------------------------------
r1597 | sears.russell@gmail.com | 2012-03-03 18:23:16 -0500 (Sat, 03
Mar 2012) | 1 line
bugfixes for skiplist
------------------------------------------------------------------------
r1596 | sears.russell@gmail.com | 2012-03-02 15:05:07 -0500 (Fri, 02
Mar 2012) | 1 line
updated concurrentSkipList. Seeing strange crashes
------------------------------------------------------------------------
r1595 | sears.russell@gmail.com | 2012-03-01 16:51:59 -0500 (Thu, 01
Mar 2012) | 1 line
add progress reports
------------------------------------------------------------------------
r1594 | sears.russell@gmail.com | 2012-02-28 13:17:05 -0500 (Tue, 28
Feb 2012) | 1 line
experimental support for automatic logfile preallocation
------------------------------------------------------------------------
r1593 | sears.russell@gmail.com | 2012-02-28 12:10:01 -0500 (Tue, 28
Feb 2012) | 1 line
add histogram reporting to rawIOPS benchmark
------------------------------------------------------------------------
r1592 | sears.russell@gmail.com | 2012-02-24 16:31:36 -0500 (Fri, 24
Feb 2012) | 1 line
userspace raid 0 implementation
------------------------------------------------------------------------
r1591 | sears.russell@gmail.com | 2012-02-12 01:47:25 -0500 (Sun, 12
Feb 2012) | 1 line
add skiplist unit test, fix compile warnings
------------------------------------------------------------------------
r1590 | sears.russell@gmail.com | 2012-02-12 00:52:52 -0500 (Sun, 12
Feb 2012) | 1 line
fix compile error
------------------------------------------------------------------------
r1589 | sears.russell@gmail.com | 2012-02-12 00:50:21 -0500 (Sun, 12
Feb 2012) | 1 line
fix some bugs in hazard.h surrounding thread list management and
overruns of R under high contention
------------------------------------------------------------------------
r1588 | sears.russell@gmail.com | 2012-02-11 14:23:10 -0500 (Sat, 11
Feb 2012) | 1 line
add hazard pointer for get_lock. It was implicitly blowing away the
hazard pointer protecting y in the caller
------------------------------------------------------------------------
r1587 | sears.russell@gmail.com | 2012-02-10 18:51:25 -0500 (Fri, 10
Feb 2012) | 1 line
fix null pointer bug
------------------------------------------------------------------------
r1586 | sears.russell@gmail.com | 2012-02-10 18:03:39 -0500 (Fri, 10
Feb 2012) | 1 line
add simple refcounting scheme to concurrentSkipList. This solves the
problem where a deleted node points to another deleted node, and we
only have a hazard pointer for the first node.
------------------------------------------------------------------------
r1585 | sears.russell@gmail.com | 2012-02-10 14:19:14 -0500 (Fri, 10
Feb 2012) | 1 line
add hazard pointers for update using the smallest free slot first. The
old method left a race condition, since hazard_scan stops at the first
null pointer.
------------------------------------------------------------------------
r1584 | sears.russell@gmail.com | 2012-02-10 02:45:30 -0500 (Fri, 10
Feb 2012) | 1 line
add hazard pointers for update array
------------------------------------------------------------------------
r1583 | sears.russell@gmail.com | 2012-02-10 00:04:50 -0500 (Fri, 10
Feb 2012) | 1 line
skiplist update: concurrent, but broken
------------------------------------------------------------------------
r1582 | sears.russell@gmail.com | 2012-02-09 17:44:27 -0500 (Thu, 09
Feb 2012) | 1 line
skip list implementation. Not concurrent yet.
------------------------------------------------------------------------
r1581 | sears.russell@gmail.com | 2012-02-08 13:33:29 -0500 (Wed, 08
Feb 2012) | 1 line
Commit of a bunch of new, unused code: KISS random number generator,
Hazard Pointers, SUX latches (untested) and bit twiddling for
concurrent b-tree
------------------------------------------------------------------------
r1580 | sears.russell@gmail.com | 2012-01-17 19:17:37 -0500 (Tue, 17
Jan 2012) | 1 line
fix typo
------------------------------------------------------------------------
r1579 | sears.russell@gmail.com | 2012-01-11 18:33:31 -0500 (Wed, 11
Jan 2012) | 1 line
static build fixes for linux. hopefully these do not break macos...
------------------------------------------------------------------------
r1578 | sears.russell@gmail.com | 2012-01-09 19:13:34 -0500 (Mon, 09
Jan 2012) | 1 line
fix cmake under linux
------------------------------------------------------------------------
r1577 | sears.russell@gmail.com | 2012-01-09 18:37:15 -0500 (Mon, 09
Jan 2012) | 1 line
fix linux static binary compilation bugs
------------------------------------------------------------------------
r1576 | sears.russell | 2012-01-09 18:00:08 -0500 (Mon, 09 Jan 2012) |
1 line
port to macos x
------------------------------------------------------------------------
r1575 | sears.russell | 2012-01-09 17:39:43 -0500 (Mon, 09 Jan 2012) |
1 line
add missing _ from sync call name
------------------------------------------------------------------------
r1574 | sears.russell@gmail.com | 2012-01-09 14:26:31 -0500 (Mon, 09
Jan 2012) | 1 line
add -rt flag to static builds
------------------------------------------------------------------------
r1573 | sears.russell@gmail.com | 2011-12-20 23:38:29 -0500 (Tue, 20
Dec 2011) | 1 line
Simple makefile geared toward building libstasis.so and libstasis.a
(and nothing else)
------------------------------------------------------------------------
r1572 | sears.russell@gmail.com | 2011-12-20 22:37:54 -0500 (Tue, 20
Dec 2011) | 1 line
add some missing #include<config.h> lines
2012-04-21 16:52:31 +00:00
|
|
|
rec->hp = calloc(h->num_slots, sizeof(hazard_ptr));
|
|
|
|
rec->rlist = calloc(h->num_r_slots, sizeof(hazard_ptr));
|
|
|
|
rec->rlist_len = 0;
|
|
|
|
rec->h = h;
|
|
|
|
pthread_setspecific(h->hp, rec);
|
|
|
|
pthread_mutex_lock(&h->tls_list_mut);
|
|
|
|
rec->next = h->tls_list;
|
|
|
|
h->tls_list = rec;
|
|
|
|
pthread_mutex_unlock(&h->tls_list_mut);
|
|
|
|
}
|
|
|
|
return rec;
|
|
|
|
}
|
|
|
|
static inline void hazard_deinit(hazard_t * h) {
|
|
|
|
hazard_ptr_rec_t * rec = pthread_getspecific(h->hp);
|
|
|
|
hazard_deinit_thread(rec);
|
|
|
|
pthread_key_delete(h->hp);
|
|
|
|
assert(h->tls_list == NULL);
|
|
|
|
pthread_mutex_destroy(&h->tls_list_mut);
|
|
|
|
pthread_cond_destroy(&h->thread_shutdown);
|
|
|
|
free(h);
|
|
|
|
}
|
|
|
|
static inline void * hazard_ref(hazard_t* h, int slot, hazard_ptr* ptr) {
|
|
|
|
hazard_ptr_rec_t * rec = hazard_ensure_tls(h);
|
|
|
|
do {
|
|
|
|
rec->hp[slot] = *ptr; // Read ptr from ram
|
|
|
|
__sync_synchronize(); // Push HP to ram
|
|
|
|
} while(rec->hp[slot] != *ptr); // Re-read ptr from ram
|
|
|
|
return (void*) rec->hp[slot];
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Set a hazard pointer using a known-stable address. This is mostly useful
|
|
|
|
* when the value pointed to by one hazard pointer should be pointed to by
|
|
|
|
* another hazard pointer.
|
|
|
|
*/
|
|
|
|
static inline void* hazard_set(hazard_t* h, int slot, void* val) {
|
|
|
|
hazard_ptr_rec_t * rec = hazard_ensure_tls(h);
|
|
|
|
rec->hp[slot] = (hazard_ptr)val;
|
|
|
|
// val is stable (and on our stack!) so there's no reason to re-check it.
|
|
|
|
__sync_synchronize();
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
static inline void hazard_release(hazard_t* h, int slot) {
|
|
|
|
hazard_ptr_rec_t * rec = hazard_ensure_tls(h);
|
|
|
|
__sync_synchronize(); // prevent the = 0 from being moved before this line.
|
|
|
|
rec->hp[slot] = 0;
|
|
|
|
}
|
|
|
|
// Must be called *after* all references to ptr are removed.
|
|
|
|
static inline void hazard_free(hazard_t* h, void* ptr) {
|
|
|
|
hazard_ptr_rec_t * rec = hazard_ensure_tls(h);
|
|
|
|
rec->rlist[rec->rlist_len] = ptr;
|
|
|
|
(rec->rlist_len)++;
|
|
|
|
while(rec->rlist_len == h->num_r_slots) {
|
|
|
|
hazard_scan(h, rec);
|
|
|
|
if(rec->rlist_len == h->num_r_slots) {
|
|
|
|
struct timespec slp = stasis_double_to_timespec(0.001);
|
|
|
|
nanosleep(&slp,0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif /* HAZARD_H_ */
|