Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
typon
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Analytics
Analytics
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
cython-plus
typon
Commits
ecf733a1
Commit
ecf733a1
authored
May 13, 2022
by
Xavier Thompson
1
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
deque.hpp: Improve shrink implementation
parent
35cdcff8
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
20 additions
and
2 deletions
+20
-2
rt/include/typon/fundamental/ring_buffer.hpp
rt/include/typon/fundamental/ring_buffer.hpp
+20
-2
No files found.
rt/include/typon/fundamental/ring_buffer.hpp
View file @
ecf733a1
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
#define TYPON_FUNDAMENTAL_RINGBUFFER_HPP_INCLUDED
#define TYPON_FUNDAMENTAL_RINGBUFFER_HPP_INCLUDED
#include <atomic>
#include <atomic>
#include <bit>
namespace
typon
::
fdt
::
lock_free
namespace
typon
::
fdt
::
lock_free
...
@@ -18,7 +19,7 @@ namespace typon::fdt::lock_free
...
@@ -18,7 +19,7 @@ namespace typon::fdt::lock_free
const
u8
_bits
;
const
u8
_bits
;
const
u64
_mask
;
const
u64
_mask
;
ring_buffer
*
const
_next
;
ring_buffer
*
_next
;
std
::
atomic
<
T
>
*
const
_array
;
std
::
atomic
<
T
>
*
const
_array
;
ring_buffer
(
u8
bits
,
ring_buffer
*
next
=
nullptr
)
noexcept
ring_buffer
(
u8
bits
,
ring_buffer
*
next
=
nullptr
)
noexcept
...
@@ -68,7 +69,24 @@ namespace typon::fdt::lock_free
...
@@ -68,7 +69,24 @@ namespace typon::fdt::lock_free
ring_buffer
*
shrink
(
u64
start
,
u64
end
)
noexcept
ring_buffer
*
shrink
(
u64
start
,
u64
end
)
noexcept
{
{
return
fill
(
std
::
exchange
(
_next
,
nullptr
),
start
,
end
);
ring_buffer
*
last
=
nullptr
;
ring_buffer
*
next
=
this
;
u64
size
=
end
-
start
;
while
(
auto
buff
=
next
->
_next
)
{
if
(
buff
->
capacity
()
<
size
*
4
)
{
break
;
}
last
=
next
;
next
=
buff
;
}
if
(
!
last
)
{
return
nullptr
;
}
last
->
_next
=
nullptr
;
return
fill
(
next
,
start
,
end
);
}
}
};
};
...
...
Xavier Thompson
@xavier_thompson
mentioned in commit
21b8f468
·
Jul 11, 2022
mentioned in commit
21b8f468
mentioned in commit 21b8f468219864f59a3d16eb406310597ee838c4
Toggle commit list
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment