diff --git a/src/base/base_ring.c b/src/base/base_ring.c index a9145e82..d43f0955 100644 --- a/src/base/base_ring.c +++ b/src/base/base_ring.c @@ -13,42 +13,16 @@ make_ring(Arena *arena, U64 size) return ring; } -internal void * -ring_try_push(Ring *ring, U64 size) -{ - U64 bytes_unconsumed = (ring->write_pos - ring->read_pos); - U64 bytes_available = ring->size - bytes_unconsumed; - void *base = 0; - if(bytes_available >= size) - { - base = ring->base + ring->write_pos%ring->size; - ring->write_pos += size; - } - return base; -} - -internal void * -ring_try_pop(Ring *ring, U64 size) -{ - U64 bytes_unconsumed = (ring->write_pos - ring->read_pos); - void *base = 0; - if(bytes_unconsumed >= size) - { - base = ring->base + ring->read_pos%ring->size; - ring->read_pos += size; - } - return base; -} - internal B32 ring_try_write(Ring *ring, U64 size, void *ptr) { + U64 bytes_unconsumed = (ring->write_pos - ring->read_pos); + U64 bytes_available = ring->size - bytes_unconsumed; B32 result = 0; - void *dst = ring_try_push(ring, size); - if(dst) + if(bytes_available >= size) { result = 1; - MemoryCopy(dst, ptr, size); + ring->write_pos += wrapped_write(ring->base, ring->size, ring->write_pos, ptr, size); } return result; } @@ -56,12 +30,12 @@ ring_try_write(Ring *ring, U64 size, void *ptr) internal B32 ring_try_read(Ring *ring, U64 size, void *ptr) { + U64 bytes_unconsumed = (ring->write_pos - ring->read_pos); B32 result = 0; - void *src = ring_try_pop(ring, size); - if(src) + if(bytes_unconsumed >= size) { result = 1; - MemoryCopy(ptr, src, size); + ring->read_pos += wrapped_read(ring->base, ring->size, ring->read_pos, ptr, size); } return result; } @@ -72,22 +46,18 @@ ring_try_read(Ring *ring, U64 size, void *ptr) internal GuardedRing * guarded_ring_alloc(Arena *arena, U64 size) { - ProfBeginFunction(); GuardedRing *gr = push_array(arena, GuardedRing, 1); gr->ring = make_ring(arena, size); gr->mutex = mutex_alloc(); gr->cv = cond_var_alloc(); - ProfEnd(); return gr; } internal void guarded_ring_release(GuardedRing *ring) { - ProfBeginFunction(); mutex_release(ring->mutex); cond_var_release(ring->cv); - ProfEnd(); } internal RingGuard @@ -102,27 +72,16 @@ internal void guarded_ring_close(RingGuard *guard) { mutex_drop(guard->r->mutex); - cond_var_broadcast(guard->r->cv); -} - -internal void * -guarded_ring_try_push(RingGuard *guard, U64 size) -{ - void *result = ring_try_push(guard->r->ring, size); - return result; -} - -internal void * -guarded_ring_try_pop(RingGuard *guard, U64 size) -{ - void *result = ring_try_pop(guard->r->ring, size); - return result; } internal B32 guarded_ring_try_write(RingGuard *guard, U64 size, void *ptr) { B32 result = ring_try_write(guard->r->ring, size, ptr); + if(result) + { + cond_var_broadcast(guard->r->cv); + } return result; } @@ -130,43 +89,9 @@ internal B32 guarded_ring_try_read(RingGuard *guard, U64 size, void *ptr) { B32 result = ring_try_read(guard->r->ring, size, ptr); - return result; -} - -internal void * -guarded_ring_push_or_wait(RingGuard *guard, U64 size, U64 endt_us) -{ - void *result = 0; - for(;!result;) + if(result) { - result = guarded_ring_try_push(guard, size); - if(now_time_us() >= endt_us) - { - break; - } - if(!result) - { - cond_var_wait(guard->r->cv, guard->r->mutex, endt_us); - } - } - return result; -} - -internal void * -guarded_ring_pop_or_wait(RingGuard *guard, U64 size, U64 endt_us) -{ - void *result = 0; - for(;!result;) - { - result = guarded_ring_try_pop(guard, size); - if(now_time_us() >= endt_us) - { - break; - } - if(!result) - { - cond_var_wait(guard->r->cv, guard->r->mutex, endt_us); - } + cond_var_broadcast(guard->r->cv); } return result; } @@ -174,23 +99,37 @@ guarded_ring_pop_or_wait(RingGuard *guard, U64 size, U64 endt_us) internal B32 guarded_ring_write_or_wait(RingGuard *guard, U64 size, void *ptr, U64 endt_us) { - void *dst = guarded_ring_push_or_wait(guard, size, endt_us); - B32 result = !!dst; - if(dst) + B32 write_good = 0; + for(;!write_good;) { - MemoryCopy(dst, ptr, size); + write_good = guarded_ring_try_write(guard, size, ptr); + if(now_time_us() >= endt_us) + { + break; + } + if(!write_good) + { + cond_var_wait(guard->r->cv, guard->r->mutex, endt_us); + } } - return result; + return write_good; } internal B32 guarded_ring_read_or_wait(RingGuard *guard, U64 size, void *ptr, U64 endt_us) { - void *src = guarded_ring_pop_or_wait(guard, size, endt_us); - B32 result = !!src; - if(src) + B32 read_good = 0; + for(;!read_good;) { - MemoryCopy(ptr, src, size); + read_good = guarded_ring_try_read(guard, size, ptr); + if(now_time_us() >= endt_us) + { + break; + } + if(!read_good) + { + cond_var_wait(guard->r->cv, guard->r->mutex, endt_us); + } } - return result; + return read_good; } diff --git a/src/base/base_ring.h b/src/base/base_ring.h index f7e8e188..59b07b86 100644 --- a/src/base/base_ring.h +++ b/src/base/base_ring.h @@ -31,8 +31,6 @@ struct RingGuard //~ rjf: Ring Functions internal Ring *make_ring(Arena *arena, U64 size); -internal void *ring_try_push(Ring *ring, U64 size); -internal void *ring_try_pop(Ring *ring, U64 size); internal B32 ring_try_write(Ring *ring, U64 size, void *ptr); internal B32 ring_try_read(Ring *ring, U64 size, void *ptr); #define ring_try_write_struct(ring, ptr) ring_try_write((ring), sizeof(*(ptr)), (ptr)) @@ -45,14 +43,10 @@ internal GuardedRing *guarded_ring_alloc(Arena *arena, U64 size); internal void guarded_ring_release(GuardedRing *ring); internal RingGuard guarded_ring_open(GuardedRing *ring); internal void guarded_ring_close(RingGuard *guard); -internal void *guarded_ring_try_push(RingGuard *guard, U64 size); -internal void *guarded_ring_try_pop(RingGuard *guard, U64 size); internal B32 guarded_ring_try_write(RingGuard *guard, U64 size, void *ptr); internal B32 guarded_ring_try_read(RingGuard *guard, U64 size, void *ptr); #define guarded_ring_try_write_struct(ring, ptr) guarded_ring_try_write((ring), sizeof(*(ptr)), (ptr)) #define guarded_ring_try_read_struct(ring, ptr) guarded_ring_try_read((ring), sizeof(*(ptr)), (ptr)) -internal void *guarded_ring_push_or_wait(RingGuard *guard, U64 size, U64 endt_us); -internal void *guarded_ring_pop_or_wait(RingGuard *guard, U64 size, U64 endt_us); internal B32 guarded_ring_write_or_wait(RingGuard *guard, U64 size, void *ptr, U64 endt_us); internal B32 guarded_ring_read_or_wait(RingGuard *guard, U64 size, void *ptr, U64 endt_us); #define guarded_ring_write_struct_or_wait(ring, ptr, endt_us) guarded_ring_write_or_wait((ring), sizeof(*(ptr)), (ptr), (endt_us)) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index c7551fe4..d4d7ac73 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -618,21 +618,41 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr if(entity->kind == D_EntityKind_Module && include_extras) { Access *access = access_open(); - DI_Key dbgi_key = d_dbgi_key_from_module(entity); + D_Entity *debug_info_path = d_entity_child_from_kind(entity, D_EntityKind_DebugInfoPath); + DI_Key dbgi_key = d_dbgi_key_from_debug_info_path(debug_info_path); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); if(rdi == &di_rdi_parsed_nil_waiting) { - dr_fstrs_push_new(arena, &result, ¶ms, s(" ")); - dr_fstrs_push_new(arena, &result, ¶ms, s("(Loading debug info)"), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .size = extras_size, .color = secondary_color); + UI_TagF("pop") + { + dr_fstrs_push_new(arena, &result, ¶ms, s(" ")); + dr_fstrs_push_new(arena, &result, ¶ms, s("Loading debug info"), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .size = extras_size, .color = secondary_color); + dr_fstrs_push_new(arena, &result, ¶ms, s(" ")); + dr_fstrs_push_new(arena, &result, ¶ms, rd_icon_kind_text_table[RD_IconKind_CircleFilled], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .size = extras_size, .color = ui_color_from_name(s("background"))); + dr_fstrs_push_new(arena, &result, ¶ms, s(" "), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main)); + } } - else if(rdi == &rdi_parsed_nil) + else if(rdi->raw_data_size == 0) { - dr_fstrs_push_new(arena, &result, ¶ms, s(" ")); - dr_fstrs_push_new(arena, &result, ¶ms, s("(Debug info not loaded)"), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .size = extras_size, .color = secondary_color); + UI_TagF("bad_pop") + { + dr_fstrs_push_new(arena, &result, ¶ms, s(" ")); + dr_fstrs_push_new(arena, &result, ¶ms, s("Debug info not found"), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .size = extras_size, .color = secondary_color); + dr_fstrs_push_new(arena, &result, ¶ms, s(" ")); + dr_fstrs_push_new(arena, &result, ¶ms, rd_icon_kind_text_table[RD_IconKind_X], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .size = extras_size, .color = ui_color_from_name(s("background"))); + dr_fstrs_push_new(arena, &result, ¶ms, s(" "), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main)); + } } else { - + UI_TagF("good_pop") + { + dr_fstrs_push_new(arena, &result, ¶ms, s(" ")); + dr_fstrs_push_new(arena, &result, ¶ms, str8_skip_last_slash(debug_info_path->string), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .size = extras_size, .color = secondary_color); + dr_fstrs_push_new(arena, &result, ¶ms, s(" ")); + dr_fstrs_push_new(arena, &result, ¶ms, rd_icon_kind_text_table[RD_IconKind_Check], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .size = extras_size, .color = ui_color_from_name(s("background"))); + dr_fstrs_push_new(arena, &result, ¶ms, s(" "), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main)); + } } access_close(access); }