mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
gc: extend optimized mode to channel buffers (#10443)
This commit is contained in:
@@ -121,15 +121,19 @@ pub:
|
||||
|
||||
pub fn new_channel<T>(n u32) &Channel {
|
||||
st := sizeof(T)
|
||||
return new_channel_st(n, st)
|
||||
if isreftype(T) {
|
||||
return new_channel_st(n, st)
|
||||
} else {
|
||||
return new_channel_st_noscan(n, st)
|
||||
}
|
||||
}
|
||||
|
||||
fn new_channel_st(n u32, st u32) &Channel {
|
||||
wsem := if n > 0 { n } else { 1 }
|
||||
rsem := if n > 0 { u32(0) } else { 1 }
|
||||
rbuf := if n > 0 { unsafe { malloc(int(n * st)) } } else { &byte(0) }
|
||||
sbuf := if n > 0 { vcalloc(int(n * 2)) } else { &byte(0) }
|
||||
mut ch := &Channel{
|
||||
sbuf := if n > 0 { vcalloc_noscan(int(n * 2)) } else { &byte(0) }
|
||||
mut ch := Channel{
|
||||
objsize: st
|
||||
cap: n
|
||||
write_free: n
|
||||
@@ -143,7 +147,33 @@ fn new_channel_st(n u32, st u32) &Channel {
|
||||
ch.readsem.init(rsem)
|
||||
ch.writesem_im.init(0)
|
||||
ch.readsem_im.init(0)
|
||||
return ch
|
||||
return &ch
|
||||
}
|
||||
|
||||
fn new_channel_st_noscan(n u32, st u32) &Channel {
|
||||
$if gcboehm_opt ? {
|
||||
wsem := if n > 0 { n } else { 1 }
|
||||
rsem := if n > 0 { u32(0) } else { 1 }
|
||||
rbuf := if n > 0 { unsafe { malloc_noscan(int(n * st)) } } else { &byte(0) }
|
||||
sbuf := if n > 0 { vcalloc_noscan(int(n * 2)) } else { &byte(0) }
|
||||
mut ch := Channel{
|
||||
objsize: st
|
||||
cap: n
|
||||
write_free: n
|
||||
read_avail: 0
|
||||
ringbuf: rbuf
|
||||
statusbuf: sbuf
|
||||
write_subscriber: 0
|
||||
read_subscriber: 0
|
||||
}
|
||||
ch.writesem.init(wsem)
|
||||
ch.readsem.init(rsem)
|
||||
ch.writesem_im.init(0)
|
||||
ch.readsem_im.init(0)
|
||||
return &ch
|
||||
} $else {
|
||||
return new_channel_st(n, st)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn (ch &Channel) auto_str(typename string) string {
|
||||
|
||||
Reference in New Issue
Block a user