Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
Actor Framework
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
Operations
Operations
Metrics
Environments
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
cpp-libs
Actor Framework
Commits
7f6ee49e
Commit
7f6ee49e
authored
Apr 17, 2012
by
neverlord
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
singly linked cache in single_reader_queue
parent
f60a8d33
Changes
17
Show whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
163 additions
and
183 deletions
+163
-183
cppa/abstract_actor.hpp
cppa/abstract_actor.hpp
+1
-1
cppa/abstract_event_based_actor.hpp
cppa/abstract_event_based_actor.hpp
+1
-1
cppa/detail/abstract_scheduled_actor.hpp
cppa/detail/abstract_scheduled_actor.hpp
+1
-1
cppa/detail/converted_thread_context.hpp
cppa/detail/converted_thread_context.hpp
+1
-1
cppa/detail/yielding_actor.hpp
cppa/detail/yielding_actor.hpp
+18
-0
cppa/intrusive/forward_iterator.hpp
cppa/intrusive/forward_iterator.hpp
+1
-1
cppa/intrusive/single_reader_queue.hpp
cppa/intrusive/single_reader_queue.hpp
+21
-29
cppa/intrusive/singly_linked_list.hpp
cppa/intrusive/singly_linked_list.hpp
+31
-0
src/abstract_event_based_actor.cpp
src/abstract_event_based_actor.cpp
+26
-32
src/abstract_scheduled_actor.cpp
src/abstract_scheduled_actor.cpp
+10
-11
src/converted_thread_context.cpp
src/converted_thread_context.cpp
+21
-30
src/mailman.cpp
src/mailman.cpp
+1
-3
src/post_office.cpp
src/post_office.cpp
+1
-2
src/scheduler.cpp
src/scheduler.cpp
+4
-2
src/yielding_actor.cpp
src/yielding_actor.cpp
+13
-35
unit_testing/test__intrusive_containers.cpp
unit_testing/test__intrusive_containers.cpp
+0
-31
unit_testing/test__queue_performance.cpp
unit_testing/test__queue_performance.cpp
+12
-3
No files found.
cppa/abstract_actor.hpp
View file @
7f6ee49e
...
@@ -84,7 +84,7 @@ class abstract_actor : public Base
...
@@ -84,7 +84,7 @@ class abstract_actor : public Base
};
};
typedef
intrusive
::
single_reader_queue
<
queue_node
>
mailbox_type
;
typedef
intrusive
::
single_reader_queue
<
queue_node
>
mailbox_type
;
typedef
typename
mailbox_type
::
unique_
value_pt
r
queue_node_ptr
;
typedef
typename
mailbox_type
::
unique_
pointe
r
queue_node_ptr
;
typedef
typename
mailbox_type
::
cache_type
mailbox_cache_type
;
typedef
typename
mailbox_type
::
cache_type
mailbox_cache_type
;
typedef
typename
mailbox_cache_type
::
iterator
queue_node_iterator
;
typedef
typename
mailbox_cache_type
::
iterator
queue_node_iterator
;
...
...
cppa/abstract_event_based_actor.hpp
View file @
7f6ee49e
...
@@ -135,7 +135,7 @@ class abstract_event_based_actor : public detail::abstract_scheduled_actor
...
@@ -135,7 +135,7 @@ class abstract_event_based_actor : public detail::abstract_scheduled_actor
private:
private:
bool
handle_message
(
queue_node
_iterator
iter
);
bool
handle_message
(
queue_node
&
iter
);
};
};
...
...
cppa/detail/abstract_scheduled_actor.hpp
View file @
7f6ee49e
...
@@ -82,7 +82,7 @@ class abstract_scheduled_actor : public abstract_actor<local_actor>
...
@@ -82,7 +82,7 @@ class abstract_scheduled_actor : public abstract_actor<local_actor>
filter_result
filter_msg
(
any_tuple
const
&
msg
);
filter_result
filter_msg
(
any_tuple
const
&
msg
);
auto
dq
(
queue_node
_iterator
node
,
partial_function
&
rules
)
->
dq_result
;
auto
dq
(
queue_node
&
node
,
partial_function
&
rules
)
->
dq_result
;
bool
has_pending_timeout
()
bool
has_pending_timeout
()
{
{
...
...
cppa/detail/converted_thread_context.hpp
View file @
7f6ee49e
...
@@ -95,7 +95,7 @@ class converted_thread_context : public abstract_actor<local_actor>
...
@@ -95,7 +95,7 @@ class converted_thread_context : public abstract_actor<local_actor>
};
};
// returns true if node->msg was accepted by rules
// returns true if node->msg was accepted by rules
bool
dq
(
queue_node
_iterator
node
,
partial_function
&
rules
);
bool
dq
(
queue_node
&
node
,
partial_function
&
rules
);
throw_on_exit_result
throw_on_exit
(
any_tuple
const
&
msg
);
throw_on_exit_result
throw_on_exit
(
any_tuple
const
&
msg
);
...
...
cppa/detail/yielding_actor.hpp
View file @
7f6ee49e
...
@@ -73,6 +73,24 @@ class yielding_actor : public abstract_scheduled_actor
...
@@ -73,6 +73,24 @@ class yielding_actor : public abstract_scheduled_actor
void
resume
(
util
::
fiber
*
from
,
resume_callback
*
callback
);
//override
void
resume
(
util
::
fiber
*
from
,
resume_callback
*
callback
);
//override
private:
template
<
typename
Fun
>
void
dequeue_impl
(
Fun
rm_fun
)
{
auto
iter
=
m_mailbox
.
cache
().
remove_first
(
rm_fun
);
auto
mbox_end
=
m_mailbox
.
cache
().
end
();
while
(
iter
==
mbox_end
)
{
yield_until_not_empty
();
iter
=
m_mailbox
.
try_fetch_more
();
if
(
iter
!=
mbox_end
)
{
iter
=
m_mailbox
.
cache
().
remove_first
(
rm_fun
,
iter
);
}
}
}
};
};
}
}
// namespace cppa::detail
}
}
// namespace cppa::detail
...
...
cppa/intrusive/forward_iterator.hpp
View file @
7f6ee49e
...
@@ -52,7 +52,7 @@ class forward_iterator
...
@@ -52,7 +52,7 @@ class forward_iterator
typedef
ptrdiff_t
difference_type
;
typedef
ptrdiff_t
difference_type
;
typedef
std
::
forward_iterator_tag
iterator_category
;
typedef
std
::
forward_iterator_tag
iterator_category
;
inline
forward_iterator
(
T
*
ptr
)
:
m_ptr
(
ptr
)
{
}
inline
forward_iterator
(
pointer
ptr
=
null
ptr
)
:
m_ptr
(
ptr
)
{
}
forward_iterator
(
forward_iterator
const
&
)
=
default
;
forward_iterator
(
forward_iterator
const
&
)
=
default
;
forward_iterator
&
operator
=
(
forward_iterator
const
&
)
=
default
;
forward_iterator
&
operator
=
(
forward_iterator
const
&
)
=
default
;
...
...
cppa/intrusive/single_reader_queue.hpp
View file @
7f6ee49e
...
@@ -31,12 +31,13 @@
...
@@ -31,12 +31,13 @@
#ifndef SINGLE_READER_QUEUE_HPP
#ifndef SINGLE_READER_QUEUE_HPP
#define SINGLE_READER_QUEUE_HPP
#define SINGLE_READER_QUEUE_HPP
#include <list>
#include <atomic>
#include <atomic>
#include <memory>
#include <memory>
#include "cppa/detail/thread.hpp"
#include "cppa/detail/thread.hpp"
#include "cppa/intrusive/singly_linked_list.hpp"
namespace
cppa
{
namespace
intrusive
{
namespace
cppa
{
namespace
intrusive
{
/**
/**
...
@@ -59,15 +60,14 @@ class single_reader_queue
...
@@ -59,15 +60,14 @@ class single_reader_queue
typedef
value_type
const
&
const_reference
;
typedef
value_type
const
&
const_reference
;
typedef
value_type
*
pointer
;
typedef
value_type
*
pointer
;
typedef
value_type
const
*
const_pointer
;
typedef
value_type
const
*
const_pointer
;
typedef
std
::
unique_ptr
<
value_type
>
unique_pointer
;
typedef
std
::
unique_ptr
<
value_type
>
unique_value_ptr
;
typedef
singly_linked_list
<
value_type
>
cache_type
;
typedef
std
::
list
<
unique_value_ptr
>
cache_type
;
typedef
typename
cache_type
::
iterator
cache_iterator
;
typedef
typename
cache_type
::
iterator
cache_iterator
;
/**
/**
* @warning call only from the reader (owner)
* @warning call only from the reader (owner)
*/
*/
pointer
pop
()
unique_
pointer
pop
()
{
{
wait_for_data
();
wait_for_data
();
return
take_head
();
return
take_head
();
...
@@ -76,7 +76,7 @@ class single_reader_queue
...
@@ -76,7 +76,7 @@ class single_reader_queue
/**
/**
* @warning call only from the reader (owner)
* @warning call only from the reader (owner)
*/
*/
pointer
try_pop
()
unique_
pointer
try_pop
()
{
{
return
take_head
();
return
take_head
();
}
}
...
@@ -85,7 +85,7 @@ class single_reader_queue
...
@@ -85,7 +85,7 @@ class single_reader_queue
* @warning call only from the reader (owner)
* @warning call only from the reader (owner)
*/
*/
template
<
typename
TimePoint
>
template
<
typename
TimePoint
>
pointer
try_pop
(
TimePoint
const
&
abs_time
)
unique_
pointer
try_pop
(
TimePoint
const
&
abs_time
)
{
{
return
(
timed_wait_for_data
(
abs_time
))
?
take_head
()
:
nullptr
;
return
(
timed_wait_for_data
(
abs_time
))
?
take_head
()
:
nullptr
;
}
}
...
@@ -231,22 +231,17 @@ class single_reader_queue
...
@@ -231,22 +231,17 @@ class single_reader_queue
{
{
if
(
m_stack
.
compare_exchange_weak
(
e
,
0
))
if
(
m_stack
.
compare_exchange_weak
(
e
,
0
))
{
{
// temporary list to convert LIFO to FIFO order
auto
insert_pos
=
m_cache
.
before_end
();
cache_type
tmp
;
// public_tail (e) has LIFO order,
// but private_head requires FIFO order
while
(
e
)
while
(
e
)
{
{
// next iteration element
// next iteration element
pointer
next
=
e
->
next
;
pointer
next
=
e
->
next
;
// insert e to private cache (convert to LIFO order)
// insert e to private cache (convert to LIFO order)
tmp
.
push_front
(
unique_value_ptr
{
e
});
m_cache
.
insert_after
(
insert_pos
,
e
);
//m_cache.insert(iter, unique_value_ptr{e});
// next iteration
// next iteration
e
=
next
;
e
=
next
;
}
}
if
(
iter
)
*
iter
=
tmp
.
begin
();
if
(
iter
)
*
iter
=
insert_pos
;
m_cache
.
splice
(
m_cache
.
end
(),
tmp
);
return
true
;
return
true
;
}
}
// next iteration
// next iteration
...
@@ -255,16 +250,13 @@ class single_reader_queue
...
@@ -255,16 +250,13 @@ class single_reader_queue
return
false
;
return
false
;
}
}
pointer
take_head
()
unique_
pointer
take_head
()
{
{
if
(
!
m_cache
.
empty
()
||
fetch_new_data
())
if
(
!
m_cache
.
empty
()
||
fetch_new_data
())
{
{
auto
result
=
m_cache
.
front
().
release
();
return
unique_pointer
{
m_cache
.
take_after
(
m_cache
.
before_begin
())};
m_cache
.
pop_front
();
return
result
;
//return m_cache.take_after(m_cache.before_begin());
}
}
return
nullptr
;
return
{}
;
}
}
};
};
...
...
cppa/intrusive/singly_linked_list.hpp
View file @
7f6ee49e
...
@@ -346,6 +346,37 @@ class singly_linked_list
...
@@ -346,6 +346,37 @@ class singly_linked_list
}
}
}
}
/**
* @brief Removes the first element for which predicate @p p
* returns @p true.
* @returns iterator to the element that preceded the removed element
* or end().
*/
template
<
typename
UnaryPredicate
>
iterator
remove_first
(
UnaryPredicate
p
,
iterator
before_first
)
{
CPPA_REQUIRE
(
before_first
!=
end
());
while
(
before_first
->
next
!=
nullptr
)
{
if
(
p
(
*
(
before_first
->
next
)))
{
erase_after
(
before_first
);
return
before_first
;
}
else
{
++
before_first
;
}
}
return
end
();
}
template
<
typename
UnaryPredicate
>
inline
iterator
remove_first
(
UnaryPredicate
p
)
{
return
remove_first
(
std
::
move
(
p
),
before_begin
());
}
/**
/**
* @brief Removes all elements that are equal to @p value.
* @brief Removes all elements that are equal to @p value.
*/
*/
...
...
src/abstract_event_based_actor.cpp
View file @
7f6ee49e
...
@@ -40,7 +40,7 @@ namespace cppa {
...
@@ -40,7 +40,7 @@ namespace cppa {
abstract_event_based_actor
::
abstract_event_based_actor
()
abstract_event_based_actor
::
abstract_event_based_actor
()
:
super
(
abstract_event_based_actor
::
blocked
)
:
super
(
abstract_event_based_actor
::
blocked
)
{
{
m_mailbox_pos
=
m_mailbox
.
cache
().
begin
();
m_mailbox_pos
=
m_mailbox
.
cache
().
be
fore_be
gin
();
}
}
void
abstract_event_based_actor
::
dequeue
(
behavior
&
)
void
abstract_event_based_actor
::
dequeue
(
behavior
&
)
...
@@ -53,12 +53,12 @@ void abstract_event_based_actor::dequeue(partial_function&)
...
@@ -53,12 +53,12 @@ void abstract_event_based_actor::dequeue(partial_function&)
quit
(
exit_reason
::
unallowed_function_call
);
quit
(
exit_reason
::
unallowed_function_call
);
}
}
bool
abstract_event_based_actor
::
handle_message
(
queue_node
_iterator
iter
)
bool
abstract_event_based_actor
::
handle_message
(
queue_node
&
node
)
{
{
auto
&
bhvr
=
*
(
m_loop_stack
.
back
());
auto
&
bhvr
=
*
(
m_loop_stack
.
back
());
if
(
bhvr
.
timeout
().
valid
())
if
(
bhvr
.
timeout
().
valid
())
{
{
switch
(
dq
(
iter
,
bhvr
.
get_partial_function
()))
switch
(
dq
(
node
,
bhvr
.
get_partial_function
()))
{
{
case
dq_timeout_occured
:
case
dq_timeout_occured
:
{
{
...
@@ -81,7 +81,7 @@ bool abstract_event_based_actor::handle_message(queue_node_iterator iter)
...
@@ -81,7 +81,7 @@ bool abstract_event_based_actor::handle_message(queue_node_iterator iter)
}
}
else
else
{
{
return
dq
(
iter
,
bhvr
.
get_partial_function
())
==
dq_done
;
return
dq
(
node
,
bhvr
.
get_partial_function
())
==
dq_done
;
}
}
}
}
...
@@ -102,19 +102,14 @@ void abstract_event_based_actor::resume(util::fiber*, resume_callback* callback)
...
@@ -102,19 +102,14 @@ void abstract_event_based_actor::resume(util::fiber*, resume_callback* callback)
return
;
return
;
}
}
auto
mbox_end
=
m_mailbox
.
cache
().
end
();
auto
mbox_end
=
m_mailbox
.
cache
().
end
();
auto
rm_fun
=
[
&
](
queue_node
&
node
)
{
return
handle_message
(
node
);
};
for
(;;)
for
(;;)
{
while
(
m_mailbox_pos
!=
mbox_end
)
{
{
try
try
{
{
if
(
handle_message
(
m_mailbox_pos
))
while
(
m_mailbox_pos
!=
mbox_end
)
{
m_mailbox_pos
=
m_mailbox
.
cache
().
erase
(
m_mailbox_pos
);
}
else
{
{
++
m_mailbox_pos
;
m_mailbox_pos
=
m_mailbox
.
cache
().
remove_first
(
rm_fun
,
m_mailbox_pos
)
;
}
}
}
}
catch
(
actor_exited
&
what
)
catch
(
actor_exited
&
what
)
...
@@ -135,7 +130,6 @@ void abstract_event_based_actor::resume(util::fiber*, resume_callback* callback)
...
@@ -135,7 +130,6 @@ void abstract_event_based_actor::resume(util::fiber*, resume_callback* callback)
done_cb
();
done_cb
();
return
;
return
;
}
}
}
if
(
m_mailbox
.
can_fetch_more
()
==
false
)
if
(
m_mailbox
.
can_fetch_more
()
==
false
)
{
{
m_state
.
store
(
abstract_scheduled_actor
::
about_to_block
);
m_state
.
store
(
abstract_scheduled_actor
::
about_to_block
);
...
...
src/abstract_scheduled_actor.cpp
View file @
7f6ee49e
...
@@ -170,12 +170,11 @@ auto abstract_scheduled_actor::filter_msg(const any_tuple& msg) -> filter_result
...
@@ -170,12 +170,11 @@ auto abstract_scheduled_actor::filter_msg(const any_tuple& msg) -> filter_result
return
ordinary_message
;
return
ordinary_message
;
}
}
auto
abstract_scheduled_actor
::
dq
(
queue_node
_iterator
iter
,
auto
abstract_scheduled_actor
::
dq
(
queue_node
&
node
,
partial_function
&
rules
)
->
dq_result
partial_function
&
rules
)
->
dq_result
{
{
auto
&
node
=
*
iter
;
if
(
node
.
marked
)
return
dq_indeterminate
;
if
(
node
->
marked
)
return
dq_indeterminate
;
switch
(
filter_msg
(
node
.
msg
))
switch
(
filter_msg
(
node
->
msg
))
{
{
case
normal_exit_signal
:
case
normal_exit_signal
:
case
expired_timeout_message
:
case
expired_timeout_message
:
...
@@ -191,16 +190,16 @@ auto abstract_scheduled_actor::dq(queue_node_iterator iter,
...
@@ -191,16 +190,16 @@ auto abstract_scheduled_actor::dq(queue_node_iterator iter,
}
}
default:
break
;
default:
break
;
}
}
std
::
swap
(
m_last_dequeued
,
node
->
msg
);
std
::
swap
(
m_last_dequeued
,
node
.
msg
);
std
::
swap
(
m_last_sender
,
node
->
sender
);
std
::
swap
(
m_last_sender
,
node
.
sender
);
//m_last_dequeued = node
->
msg;
//m_last_dequeued = node
.
msg;
//m_last_sender = node
->
sender;
//m_last_sender = node
.
sender;
// make sure no timeout is handled incorrectly
// make sure no timeout is handled incorrectly
++
m_active_timeout_id
;
++
m_active_timeout_id
;
// lifetime scope of qguard
// lifetime scope of qguard
{
{
// make sure nested received do not process this node again
// make sure nested received do not process this node again
queue_node_guard
qguard
{
node
.
get
()
};
queue_node_guard
qguard
{
&
node
};
// try to invoke given function
// try to invoke given function
if
(
rules
(
m_last_dequeued
))
if
(
rules
(
m_last_dequeued
))
{
{
...
@@ -216,8 +215,8 @@ auto abstract_scheduled_actor::dq(queue_node_iterator iter,
...
@@ -216,8 +215,8 @@ auto abstract_scheduled_actor::dq(queue_node_iterator iter,
}
}
// no match (restore members)
// no match (restore members)
--
m_active_timeout_id
;
--
m_active_timeout_id
;
std
::
swap
(
m_last_dequeued
,
node
->
msg
);
std
::
swap
(
m_last_dequeued
,
node
.
msg
);
std
::
swap
(
m_last_sender
,
node
->
sender
);
std
::
swap
(
m_last_sender
,
node
.
sender
);
return
dq_indeterminate
;
return
dq_indeterminate
;
}
}
...
...
src/converted_thread_context.cpp
View file @
7f6ee49e
...
@@ -70,19 +70,12 @@ void converted_thread_context::enqueue(actor* sender, const any_tuple& msg)
...
@@ -70,19 +70,12 @@ void converted_thread_context::enqueue(actor* sender, const any_tuple& msg)
void
converted_thread_context
::
dequeue
(
partial_function
&
rules
)
/*override*/
void
converted_thread_context
::
dequeue
(
partial_function
&
rules
)
/*override*/
{
{
auto
iter
=
m_mailbox
.
cache
().
begin
();
auto
rm_fun
=
[
&
](
queue_node
&
node
)
{
return
dq
(
node
,
rules
);
};
auto
iter
=
m_mailbox
.
cache
().
remove_first
(
rm_fun
);
auto
mbox_end
=
m_mailbox
.
cache
().
end
();
auto
mbox_end
=
m_mailbox
.
cache
().
end
();
for
(;;
)
while
(
iter
==
mbox_end
)
{
{
for
(
;
iter
!=
mbox_end
;
++
iter
)
iter
=
m_mailbox
.
cache
().
remove_first
(
rm_fun
,
m_mailbox
.
fetch_more
());
{
if
(
dq
(
iter
,
rules
))
{
m_mailbox
.
cache
().
erase
(
iter
);
return
;
}
}
iter
=
m_mailbox
.
fetch_more
();
}
}
}
}
...
@@ -92,11 +85,13 @@ void converted_thread_context::dequeue(behavior& rules) /*override*/
...
@@ -92,11 +85,13 @@ void converted_thread_context::dequeue(behavior& rules) /*override*/
{
{
auto
timeout
=
now
();
auto
timeout
=
now
();
timeout
+=
rules
.
timeout
();
timeout
+=
rules
.
timeout
();
auto
iter
=
m_mailbox
.
cache
().
begin
();
auto
rm_fun
=
[
&
](
queue_node
&
node
)
auto
mbox_end
=
m_mailbox
.
cache
().
end
();
do
{
{
if
(
iter
==
mbox_end
)
return
dq
(
node
,
rules
.
get_partial_function
());
};
auto
iter
=
m_mailbox
.
cache
().
remove_first
(
rm_fun
);
auto
mbox_end
=
m_mailbox
.
cache
().
end
();
while
(
iter
==
mbox_end
)
{
{
iter
=
m_mailbox
.
try_fetch_more
(
timeout
);
iter
=
m_mailbox
.
try_fetch_more
(
timeout
);
if
(
iter
==
mbox_end
)
if
(
iter
==
mbox_end
)
...
@@ -104,11 +99,9 @@ void converted_thread_context::dequeue(behavior& rules) /*override*/
...
@@ -104,11 +99,9 @@ void converted_thread_context::dequeue(behavior& rules) /*override*/
rules
.
handle_timeout
();
rules
.
handle_timeout
();
return
;
return
;
}
}
iter
=
m_mailbox
.
cache
().
remove_first
(
rm_fun
,
iter
);
}
}
}
}
while
(
dq
(
iter
,
rules
.
get_partial_function
())
==
false
);
m_mailbox
.
cache
().
erase
(
iter
);
}
else
else
{
{
converted_thread_context
::
dequeue
(
rules
.
get_partial_function
());
converted_thread_context
::
dequeue
(
rules
.
get_partial_function
());
...
@@ -134,19 +127,17 @@ converted_thread_context::throw_on_exit(any_tuple const& msg)
...
@@ -134,19 +127,17 @@ converted_thread_context::throw_on_exit(any_tuple const& msg)
return
not_an_exit_signal
;
return
not_an_exit_signal
;
}
}
bool
converted_thread_context
::
dq
(
queue_node_iterator
iter
,
bool
converted_thread_context
::
dq
(
queue_node
&
node
,
partial_function
&
rules
)
partial_function
&
rules
)
{
{
auto
&
node
=
*
iter
;
if
(
m_trap_exit
==
false
if
(
m_trap_exit
==
false
&&
throw_on_exit
(
node
->
msg
)
==
normal_exit_signal
)
&&
throw_on_exit
(
node
.
msg
)
==
normal_exit_signal
)
{
{
return
false
;
return
false
;
}
}
std
::
swap
(
m_last_dequeued
,
node
->
msg
);
std
::
swap
(
m_last_dequeued
,
node
.
msg
);
std
::
swap
(
m_last_sender
,
node
->
sender
);
std
::
swap
(
m_last_sender
,
node
.
sender
);
{
{
queue_node_guard
qguard
{
node
.
get
()
};
queue_node_guard
qguard
{
&
node
};
if
(
rules
(
m_last_dequeued
))
if
(
rules
(
m_last_dequeued
))
{
{
// client calls erase(iter)
// client calls erase(iter)
...
@@ -157,8 +148,8 @@ bool converted_thread_context::dq(queue_node_iterator iter,
...
@@ -157,8 +148,8 @@ bool converted_thread_context::dq(queue_node_iterator iter,
}
}
}
}
// no match (restore members)
// no match (restore members)
std
::
swap
(
m_last_dequeued
,
node
->
msg
);
std
::
swap
(
m_last_dequeued
,
node
.
msg
);
std
::
swap
(
m_last_sender
,
node
->
sender
);
std
::
swap
(
m_last_sender
,
node
.
sender
);
return
false
;
return
false
;
}
}
...
...
src/mailman.cpp
View file @
7f6ee49e
...
@@ -96,7 +96,7 @@ void mailman_loop()
...
@@ -96,7 +96,7 @@ void mailman_loop()
// serializes outgoing messages
// serializes outgoing messages
binary_serializer
bs
;
binary_serializer
bs
;
// current active job
// current active job
mailman_job
*
job
=
nullptr
;
std
::
unique_ptr
<
mailman_job
>
job
;
// caches mailman_queue()
// caches mailman_queue()
auto
&
mqueue
=
mailman_queue
();
auto
&
mqueue
=
mailman_queue
();
// connected tcp peers
// connected tcp peers
...
@@ -171,10 +171,8 @@ void mailman_loop()
...
@@ -171,10 +171,8 @@ void mailman_loop()
}
}
else
if
(
job
->
is_kill_job
())
else
if
(
job
->
is_kill_job
())
{
{
delete
job
;
return
;
return
;
}
}
delete
job
;
}
}
}
}
...
...
src/post_office.cpp
View file @
7f6ee49e
...
@@ -602,7 +602,7 @@ void post_office_loop(int pipe_read_handle, int pipe_write_handle)
...
@@ -602,7 +602,7 @@ void post_office_loop(int pipe_read_handle, int pipe_write_handle)
case
rd_queue_event
:
case
rd_queue_event
:
{
{
DEBUG
(
"rd_queue_event"
);
DEBUG
(
"rd_queue_event"
);
post_office_msg
*
pom
=
msg_queue
.
pop
();
std
::
unique_ptr
<
post_office_msg
>
pom
=
msg_queue
.
pop
();
if
(
pom
->
is_add_peer_msg
())
if
(
pom
->
is_add_peer_msg
())
{
{
DEBUG
(
"add_peer_msg"
);
DEBUG
(
"add_peer_msg"
);
...
@@ -682,7 +682,6 @@ void post_office_loop(int pipe_read_handle, int pipe_write_handle)
...
@@ -682,7 +682,6 @@ void post_office_loop(int pipe_read_handle, int pipe_write_handle)
}
}
else
DEBUG
(
"pptr == nullptr"
);
else
DEBUG
(
"pptr == nullptr"
);
}
}
delete
pom
;
break
;
break
;
}
}
case
unpublish_actor_event
:
case
unpublish_actor_event
:
...
...
src/scheduler.cpp
View file @
7f6ee49e
...
@@ -141,7 +141,8 @@ void scheduler_helper::time_emitter(scheduler_helper::ptr_type m_self)
...
@@ -141,7 +141,8 @@ void scheduler_helper::time_emitter(scheduler_helper::ptr_type m_self)
{
{
if
(
messages
.
empty
())
if
(
messages
.
empty
())
{
{
msg_ptr
.
reset
(
queue
.
pop
());
//msg_ptr.reset(queue.pop());
msg_ptr
=
queue
.
pop
();
}
}
else
else
{
{
...
@@ -168,7 +169,8 @@ void scheduler_helper::time_emitter(scheduler_helper::ptr_type m_self)
...
@@ -168,7 +169,8 @@ void scheduler_helper::time_emitter(scheduler_helper::ptr_type m_self)
// wait for next message or next timeout
// wait for next message or next timeout
if
(
it
!=
messages
.
end
())
if
(
it
!=
messages
.
end
())
{
{
msg_ptr
.
reset
(
queue
.
try_pop
(
it
->
first
));
//msg_ptr.reset(queue.try_pop(it->first));
msg_ptr
=
queue
.
try_pop
(
it
->
first
);
}
}
}
}
}
}
...
...
src/yielding_actor.cpp
View file @
7f6ee49e
...
@@ -98,51 +98,29 @@ void yielding_actor::yield_until_not_empty()
...
@@ -98,51 +98,29 @@ void yielding_actor::yield_until_not_empty()
void
yielding_actor
::
dequeue
(
partial_function
&
fun
)
void
yielding_actor
::
dequeue
(
partial_function
&
fun
)
{
{
auto
iter
=
m_mailbox
.
cache
().
begin
();
auto
rm_fun
=
[
&
](
queue_node
&
node
)
{
return
dq
(
node
,
fun
)
==
dq_done
;
};
auto
mbox_end
=
m_mailbox
.
cache
().
end
();
dequeue_impl
(
rm_fun
);
for
(;;)
{
for
(
;
iter
!=
mbox_end
;
++
iter
)
{
if
(
dq
(
iter
,
fun
)
==
dq_done
)
{
m_mailbox
.
cache
().
erase
(
iter
);
return
;
}
}
yield_until_not_empty
();
iter
=
m_mailbox
.
try_fetch_more
();
}
}
}
void
yielding_actor
::
dequeue
(
behavior
&
bhvr
)
void
yielding_actor
::
dequeue
(
behavior
&
bhvr
)
{
{
if
(
bhvr
.
timeout
().
valid
())
if
(
bhvr
.
timeout
().
valid
())
{
{
// try until a message was successfully dequeued
request_timeout
(
bhvr
.
timeout
());
request_timeout
(
bhvr
.
timeout
());
auto
iter
=
m_mailbox
.
cache
().
begin
();
auto
rm_fun
=
[
&
](
queue_node
&
node
)
->
bool
auto
mbox_end
=
m_mailbox
.
cache
().
end
();
for
(;;)
{
{
while
(
iter
!=
mbox_end
)
switch
(
dq
(
node
,
bhvr
.
get_partial_function
()))
{
switch
(
dq
(
iter
,
bhvr
.
get_partial_function
()))
{
{
case
dq_timeout_occured
:
case
dq_timeout_occured
:
bhvr
.
handle_timeout
();
bhvr
.
handle_timeout
();
// fall through
return
true
;
case
dq_done
:
case
dq_done
:
iter
=
m_mailbox
.
cache
().
erase
(
iter
);
return
true
;
return
;
default:
default:
++
iter
;
return
false
;
break
;
}
}
yield_until_not_empty
();
iter
=
m_mailbox
.
try_fetch_more
();
}
}
};
dequeue_impl
(
rm_fun
);
}
}
else
else
{
{
...
...
unit_testing/test__intrusive_containers.cpp
View file @
7f6ee49e
...
@@ -121,36 +121,5 @@ size_t test__intrusive_containers()
...
@@ -121,36 +121,5 @@ size_t test__intrusive_containers()
CPPA_CHECK_EQUAL
(
s_iint_instances
,
2
);
CPPA_CHECK_EQUAL
(
s_iint_instances
,
2
);
CPPA_CHECK
(
ilist2
.
empty
());
CPPA_CHECK
(
ilist2
.
empty
());
{
iint_queue
iq
;
for
(
int
i
=
0
;
i
<
20
;
++
i
)
iq
.
_push_back
(
new
iint
(
i
));
iint_list
tmp
;
for
(
int
i
=
0
;
i
<
9
;
++
i
)
{
tmp
.
push_back
(
iq
.
pop
());
}
delete
iq
.
pop
();
/*iq.push_front(std::move(tmp));
CPPA_CHECK(tmp.empty());
CPPA_CHECK_EQUAL(std::distance(iq.cache().begin(), iq.cache().end()), 19);
std::unique_ptr<iint> iptr;
for (int i = 0; i < 9; ++i)
{
iptr.reset(iq.pop());
CPPA_CHECK(iptr);
if (iptr) CPPA_CHECK_EQUAL(iptr->value, i);
}
for (int i = 10; i < 20; ++i)
{
iptr.reset(iq.pop());
CPPA_CHECK(iptr);
if (iptr) CPPA_CHECK_EQUAL(iptr->value, i);
}
*/
}
// two dummies
CPPA_CHECK_EQUAL
(
s_iint_instances
,
2
);
return
CPPA_TEST_RESULT
;
return
CPPA_TEST_RESULT
;
}
}
unit_testing/test__queue_performance.cpp
View file @
7f6ee49e
...
@@ -13,6 +13,8 @@
...
@@ -13,6 +13,8 @@
// "config"
// "config"
/*
namespace {
namespace {
const size_t slave_messages = 1000000;
const size_t slave_messages = 1000000;
...
@@ -98,7 +100,9 @@ class locked_queue
...
@@ -98,7 +100,9 @@ class locked_queue
typedef T element_type;
typedef T element_type;
element_type
*
pop
()
typedef std::unique_ptr<element_type> unique_pointer;
unique_pointer pop()
{
{
if (!m_priv.empty())
if (!m_priv.empty())
{
{
...
@@ -198,13 +202,12 @@ void master()
...
@@ -198,13 +202,12 @@ void master()
# endif
# endif
for (size_t j = 0; j < num_msgs; ++j)
for (size_t j = 0; j < num_msgs; ++j)
{
{
queue_element
*
e
=
q
.
pop
();
std::unique_ptr<queue_element>
e = q.pop();
result += e->value;
result += e->value;
# ifdef DEBUG_RESULTS
# ifdef DEBUG_RESULTS
min_val = std::min(min_val, e->value);
min_val = std::min(min_val, e->value);
max_val = std::max(max_val, e->value);
max_val = std::max(max_val, e->value);
# endif
# endif
delete
e
;
}
}
if (result != calc_result)
if (result != calc_result)
{
{
...
@@ -292,3 +295,9 @@ void test__queue_performance()
...
@@ -292,3 +295,9 @@ void test__queue_performance()
cout << "single_reader_queue:" << endl;
cout << "single_reader_queue:" << endl;
test_q_impl<single_reader_queue<queue_element>>();
test_q_impl<single_reader_queue<queue_element>>();
}
}
*/
void
test__queue_performance
()
{
}
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