Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
typon-concurrency
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Xavier Thompson
typon-concurrency
Commits
daed60ee
Commit
daed60ee
authored
May 13, 2022
by
Xavier Thompson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
deque.hpp: Improve shrink implementation
parent
a2f2b430
Changes
1
Show 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 @
daed60ee
...
@@ -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
);
}
}
};
};
...
...
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