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
9916b74e
Commit
9916b74e
authored
Apr 17, 2012
by
neverlord
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mailbox handling
parent
2160e29a
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
31 additions
and
33 deletions
+31
-33
src/abstract_event_based_actor.cpp
src/abstract_event_based_actor.cpp
+31
-33
No files found.
src/abstract_event_based_actor.cpp
View file @
9916b74e
...
...
@@ -102,14 +102,42 @@ void abstract_event_based_actor::resume(util::fiber*, resume_callback* callback)
return
;
}
auto
mbox_end
=
m_mailbox
.
cache
().
end
();
auto
rm_fun
=
[
&
](
queue_node
&
node
)
{
return
handle_message
(
node
);
};
auto
rm_fun
=
[
this
](
queue_node
&
node
)
{
return
handle_message
(
node
);
};
for
(;;)
{
try
{
while
(
m_mailbox_pos
!=
mbox_end
)
auto
iter
=
m_mailbox
.
cache
().
remove_first
(
rm_fun
,
m_mailbox_pos
);
if
(
iter
==
mbox_end
)
{
m_mailbox_pos
=
m_mailbox
.
cache
().
remove_first
(
rm_fun
,
m_mailbox_pos
);
// try fetch more
m_mailbox_pos
=
m_mailbox
.
cache
().
before_end
();
if
(
m_mailbox
.
can_fetch_more
()
==
false
)
{
m_state
.
store
(
abstract_scheduled_actor
::
about_to_block
);
CPPA_MEMORY_BARRIER
();
if
(
m_mailbox
.
can_fetch_more
()
||
compare_exchange_state
(
abstract_scheduled_actor
::
about_to_block
,
abstract_scheduled_actor
::
blocked
)
!=
abstract_scheduled_actor
::
blocked
)
{
// someone preempt us
m_mailbox
.
try_fetch_more
();
}
else
{
// try again next time
return
;
}
}
else
{
m_mailbox
.
try_fetch_more
();
}
}
else
{
// prepare for next receive
m_mailbox_pos
=
m_mailbox
.
cache
().
before_begin
();
}
}
catch
(
actor_exited
&
what
)
...
...
@@ -130,36 +158,6 @@ void abstract_event_based_actor::resume(util::fiber*, resume_callback* callback)
done_cb
();
return
;
}
if
(
m_mailbox
.
can_fetch_more
()
==
false
)
{
m_state
.
store
(
abstract_scheduled_actor
::
about_to_block
);
CPPA_MEMORY_BARRIER
();
if
(
m_mailbox
.
can_fetch_more
())
{
// someone preempt us
m_state
.
store
(
abstract_scheduled_actor
::
ready
);
}
else
{
// nothing to do (wait for new messages)
switch
(
compare_exchange_state
(
abstract_scheduled_actor
::
about_to_block
,
abstract_scheduled_actor
::
blocked
))
{
case
abstract_scheduled_actor
:
:
ready
:
{
// someone preempt us
break
;
}
case
abstract_scheduled_actor
:
:
blocked
:
{
// done
return
;
}
default:
exit
(
7
);
// illegal state
};
}
}
m_mailbox_pos
=
m_mailbox
.
try_fetch_more
();
}
}
...
...
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