本文整理汇总了C++中write_barrier函数的典型用法代码示例。如果您正苦于以下问题:C++ write_barrier函数的具体用法?C++ write_barrier怎么用?C++ write_barrier使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了write_barrier函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: prep_more_ios
static int prep_more_ios(struct submitter *s, int max_ios)
{
struct io_sq_ring *ring = &s->sq_ring;
unsigned index, tail, next_tail, prepped = 0;
next_tail = tail = *ring->tail;
do {
next_tail++;
read_barrier();
if (next_tail == *ring->head)
break;
index = tail & sq_ring_mask;
init_io(s, index);
ring->array[index] = index;
prepped++;
tail = next_tail;
} while (prepped < max_ios);
if (*ring->tail != tail) {
/* order tail store with writes to sqes above */
write_barrier();
*ring->tail = tail;
write_barrier();
}
return prepped;
}
示例2: fio_gtod_update
static void fio_gtod_update(void)
{
if (fio_tv) {
struct timeval __tv;
gettimeofday(&__tv, NULL);
fio_tv->tv_sec = __tv.tv_sec;
write_barrier();
fio_tv->tv_usec = __tv.tv_usec;
write_barrier();
}
}
示例3: evaluated
/* -----------------------------------------------------------------------------
Evaluate a THUNK_SELECTOR if possible.
p points to a THUNK_SELECTOR that we want to evaluate. The
result of "evaluating" it will be evacuated and a pointer to the
to-space closure will be returned.
If the THUNK_SELECTOR could not be evaluated (its selectee is still
a THUNK, for example), then the THUNK_SELECTOR itself will be
evacuated.
-------------------------------------------------------------------------- */
static void
unchain_thunk_selectors(StgSelector *p, StgClosure *val)
{
StgSelector *prev;
prev = NULL;
while (p)
{
ASSERT(p->header.info == &stg_WHITEHOLE_info);
// val must be in to-space. Not always: when we recursively
// invoke eval_thunk_selector(), the recursive calls will not
// evacuate the value (because we want to select on the value,
// not evacuate it), so in this case val is in from-space.
// ASSERT(!HEAP_ALLOCED_GC(val) || Bdescr((P_)val)->gen_no > N || (Bdescr((P_)val)->flags & BF_EVACUATED));
prev = (StgSelector*)((StgClosure *)p)->payload[0];
// Update the THUNK_SELECTOR with an indirection to the
// value. The value is still in from-space at this stage.
//
// (old note: Why not do upd_evacuee(q,p)? Because we have an
// invariant that an EVACUATED closure always points to an
// object in the same or an older generation (required by
// the short-cut test in the EVACUATED case, below).
if ((StgClosure *)p == val) {
// must be a loop; just leave a BLACKHOLE in place. This
// can happen when we have a chain of selectors that
// eventually loops back on itself. We can't leave an
// indirection pointing to itself, and we want the program
// to deadlock if it ever enters this closure, so
// BLACKHOLE is correct.
// XXX we do not have BLACKHOLEs any more; replace with
// a THUNK_SELECTOR again. This will go into a loop if it is
// entered, and should result in a NonTermination exception.
((StgThunk *)p)->payload[0] = val;
write_barrier();
SET_INFO((StgClosure *)p, &stg_sel_0_upd_info);
} else {
((StgInd *)p)->indirectee = val;
write_barrier();
SET_INFO((StgClosure *)p, &stg_IND_info);
}
// For the purposes of LDV profiling, we have created an
// indirection.
LDV_RECORD_CREATE(p);
p = prev;
}
}
示例4: primitive_compact_gc
/*
* It is up to the caller to fill in the object's fields in a meaningful
* fashion!
*/
object *factor_vm::allot_large_object(cell type, cell size)
{
/* If tenured space does not have enough room, collect and compact */
if(!data->tenured->can_allot_p(size))
{
primitive_compact_gc();
/* If it still won't fit, grow the heap */
if(!data->tenured->can_allot_p(size))
{
gc(collect_growing_heap_op,
size, /* requested size */
true /* trace contexts? */);
}
}
object *obj = data->tenured->allot(size);
/* Allows initialization code to store old->new pointers
without hitting the write barrier in the common case of
a nursery allocation */
write_barrier(obj,size);
obj->initialize(type);
return obj;
}
示例5: assert
Object* Tuple::put(STATE, native_int idx, Object* val) {
assert(idx >= 0 && idx < num_fields());
this->field[idx] = val;
if(val->reference_p()) write_barrier(state, val);
return val;
}
示例6: copy_tag_nolock
STATIC_INLINE void
copy_tag_nolock(StgClosure **p, const StgInfoTable *info,
StgClosure *src, nat size, nat gen_no, StgWord tag)
{
StgPtr to, from;
nat i;
to = alloc_for_copy(size,gen_no);
from = (StgPtr)src;
to[0] = (W_)info;
for (i = 1; i < size; i++) { // unroll for small i
to[i] = from[i];
}
// if somebody else reads the forwarding pointer, we better make
// sure there's a closure at the end of it.
write_barrier();
*p = TAG_CLOSURE(tag,(StgClosure*)to);
src->header.info = (const StgInfoTable *)MK_FORWARDING_PTR(to);
// if (to+size+2 < bd->start + BLOCK_SIZE_W) {
// __builtin_prefetch(to + size + 2, 1);
// }
#ifdef PROFILING
// We store the size of the just evacuated object in the LDV word so that
// the profiler can guess the position of the next object later.
SET_EVACUAEE_FOR_LDV(from, size);
#endif
}
示例7: str
/* Allocates memory */
string* factor_vm::reallot_string(string* str_, cell capacity) {
data_root<string> str(str_, this);
if (reallot_string_in_place_p(str.untagged(), capacity)) {
str->length = tag_fixnum(capacity);
if (to_boolean(str->aux)) {
byte_array* aux = untag<byte_array>(str->aux);
aux->capacity = tag_fixnum(capacity * 2);
}
return str.untagged();
} else {
cell to_copy = string_capacity(str.untagged());
if (capacity < to_copy)
to_copy = capacity;
data_root<string> new_str(allot_string_internal(capacity), this);
memcpy(new_str->data(), str->data(), to_copy);
if (to_boolean(str->aux)) {
byte_array* new_aux = allot_uninitialized_array<byte_array>(capacity * 2);
new_str->aux = tag<byte_array>(new_aux);
write_barrier(&new_str->aux);
byte_array* aux = untag<byte_array>(str->aux);
memcpy(new_aux->data<uint16_t>(), aux->data<uint16_t>(),
to_copy * sizeof(uint16_t));
}
fill_string(new_str.untagged(), to_copy, capacity, '\0');
return new_str.untagged();
}
}
示例8: fiber_manager_yield
void fiber_manager_yield(fiber_manager_t* manager)
{
assert(fiber_manager_state == FIBER_MANAGER_STATE_STARTED);
assert(manager);
if(wsd_work_stealing_deque_size(manager->schedule_from) == 0) {
wsd_work_stealing_deque_t* const temp = manager->schedule_from;
manager->schedule_from = manager->store_to;
manager->store_to = temp;
}
do {
manager->yield_count += 1;
//occasionally steal some work from threads with more load
if((manager->yield_count & 1023) == 0) {
fiber_load_balance(manager);
}
if(wsd_work_stealing_deque_size(manager->schedule_from) > 0) {
fiber_t* const new_fiber = (fiber_t*)wsd_work_stealing_deque_pop_bottom(manager->schedule_from);
if(new_fiber != WSD_EMPTY && new_fiber != WSD_ABORT) {
fiber_t* const old_fiber = manager->current_fiber;
if(old_fiber->state == FIBER_STATE_RUNNING) {
old_fiber->state = FIBER_STATE_READY;
manager->to_schedule = old_fiber;/* must schedule it *after* fiber_swap_context, else another thread can start executing an invalid context */
}
manager->current_fiber = new_fiber;
new_fiber->state = FIBER_STATE_RUNNING;
write_barrier();
fiber_swap_context(&old_fiber->context, &new_fiber->context);
fiber_manager_do_maintenance();
}
}
} while((manager = fiber_manager_get()) && FIBER_STATE_WAITING == manager->current_fiber->state && fiber_load_balance(manager));
}
示例9: str
void factor_vm::set_string_nth_slow(string *str_, cell index, cell ch)
{
data_root<string> str(str_,this);
byte_array *aux;
str->data()[index] = ((ch & 0x7f) | 0x80);
if(to_boolean(str->aux))
aux = untag<byte_array>(str->aux);
else
{
/* We don't need to pre-initialize the
byte array with any data, since we
only ever read from the aux vector
if the most significant bit of a
character is set. Initially all of
the bits are clear. */
aux = allot_uninitialized_array<byte_array>(untag_fixnum(str->length) * sizeof(u16));
str->aux = tag<byte_array>(aux);
write_barrier(&str->aux);
}
aux->data<u16>()[index] = (u16)((ch >> 7) ^ 1);
}
示例10: set_local
void set_local(STATE, int pos, Object* val) {
locals_[pos] = val;
if(locals_ == heap_locals_) {
write_barrier(state, val);
}
}
示例11: FACTOR_ASSERT
inline void factor_vm::set_array_nth(array* array, cell slot, cell value) {
FACTOR_ASSERT(slot < array_capacity(array));
FACTOR_ASSERT(array->type() == ARRAY_TYPE);
cell* slot_ptr = &array->data()[slot];
*slot_ptr = value;
write_barrier(slot_ptr);
}
示例12: untag_fixnum
void factor_vm::primitive_set_slot() {
fixnum slot = untag_fixnum(ctx->pop());
object* obj = untag<object>(ctx->pop());
cell value = ctx->pop();
cell* slot_ptr = &obj->slots()[slot];
*slot_ptr = value;
write_barrier(slot_ptr);
}
示例13: write_barrier
Object* Tuple::put(STATE, native_int idx, Object* val) {
if(idx < 0 || idx >= num_fields()) {
rubinius::bug("Invalid tuple index");
}
field[idx] = val;
write_barrier(state, val);
return val;
}
示例14: write_barrier
void VMMethod::SetCachedFrame(VMFrame* frame) {
cachedFrame = frame;
if (frame != nullptr) {
frame->SetContext(nullptr);
frame->SetBytecodeIndex(0);
frame->ResetStackPointer();
write_barrier(this, cachedFrame);
}
}
示例15: sizeof
void Encoding::make_managed(STATE, const char* name, OnigEncodingType* enc) {
ByteArray* enc_ba = ByteArray::create(state, sizeof(OnigEncodingType));
memcpy(enc_ba->raw_bytes(), enc, sizeof(OnigEncodingType));
encoding_ = reinterpret_cast<OnigEncodingType*>(enc_ba->raw_bytes());
write_barrier(state, enc_ba);
int size = strlen(name);
if(size >= ENCODING_NAMELEN_MAX) size = ENCODING_NAMELEN_MAX-1;
ByteArray* name_ba = ByteArray::create(state, size);
memcpy(name_ba->raw_bytes(), name, size);
name_ba->raw_bytes()[size] = 0;
encoding_->name = reinterpret_cast<const char*>(name_ba->raw_bytes());
write_barrier(state, name_ba);
managed_ = true;
}