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
d016fb80
Commit
d016fb80
authored
Aug 24, 2014
by
Dominik Charousset
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Combine actor bool fields to a single flags field
parent
10a49baa
Changes
19
Show whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
153 additions
and
150 deletions
+153
-150
libcaf_core/caf/abstract_actor.hpp
libcaf_core/caf/abstract_actor.hpp
+24
-4
libcaf_core/caf/detail/proper_actor.hpp
libcaf_core/caf/detail/proper_actor.hpp
+7
-25
libcaf_core/caf/event_based_actor.hpp
libcaf_core/caf/event_based_actor.hpp
+1
-3
libcaf_core/caf/local_actor.hpp
libcaf_core/caf/local_actor.hpp
+33
-6
libcaf_core/caf/mixin/behavior_stack_based.hpp
libcaf_core/caf/mixin/behavior_stack_based.hpp
+1
-1
libcaf_core/caf/mixin/single_timeout.hpp
libcaf_core/caf/mixin/single_timeout.hpp
+13
-17
libcaf_core/caf/policy/event_based_resume.hpp
libcaf_core/caf/policy/event_based_resume.hpp
+2
-2
libcaf_core/caf/policy/no_resume.hpp
libcaf_core/caf/policy/no_resume.hpp
+1
-3
libcaf_core/caf/resumable.hpp
libcaf_core/caf/resumable.hpp
+1
-4
libcaf_core/caf/scoped_actor.hpp
libcaf_core/caf/scoped_actor.hpp
+21
-13
libcaf_core/caf/single_timeout.hpp
libcaf_core/caf/single_timeout.hpp
+0
-3
libcaf_core/caf/typed_event_based_actor.hpp
libcaf_core/caf/typed_event_based_actor.hpp
+0
-5
libcaf_core/src/abstract_actor.cpp
libcaf_core/src/abstract_actor.cpp
+5
-6
libcaf_core/src/event_based_actor.cpp
libcaf_core/src/event_based_actor.cpp
+0
-4
libcaf_core/src/local_actor.cpp
libcaf_core/src/local_actor.cpp
+15
-2
libcaf_core/src/resumable.cpp
libcaf_core/src/resumable.cpp
+0
-4
libcaf_core/src/scoped_actor.cpp
libcaf_core/src/scoped_actor.cpp
+5
-7
libcaf_io/caf/io/broker.hpp
libcaf_io/caf/io/broker.hpp
+3
-9
libcaf_io/src/broker.cpp
libcaf_io/src/broker.cpp
+21
-32
No files found.
libcaf_core/caf/abstract_actor.hpp
View file @
d016fb80
...
@@ -173,6 +173,27 @@ class abstract_actor : public abstract_channel {
...
@@ -173,6 +173,27 @@ class abstract_actor : public abstract_channel {
*/
*/
virtual
std
::
set
<
std
::
string
>
message_types
()
const
;
virtual
std
::
set
<
std
::
string
>
message_types
()
const
;
enum
actor_state_flag
{
// used by ...
trap_exit_flag
=
0x01
,
// local_actor
has_timeout_flag
=
0x02
,
// mixin::single_timeout
is_registered_flag
=
0x04
,
// no_resume, resumable, and scoped_actor
is_initialized_flag
=
0x08
,
// event-based actors
is_running_flag
=
0x10
// broker
};
inline
void
set_flag
(
bool
enable_flag
,
actor_state_flag
mask
)
{
if
(
enable_flag
)
{
m_flags
|=
static_cast
<
int
>
(
mask
);
}
else
{
m_flags
&=
~
static_cast
<
int
>
(
mask
);
}
}
inline
bool
get_flag
(
actor_state_flag
mask
)
const
{
return
static_cast
<
bool
>
(
m_flags
&
static_cast
<
int
>
(
mask
));
}
protected:
protected:
/**
/**
* Creates a non-proxy instance.
* Creates a non-proxy instance.
...
@@ -221,13 +242,9 @@ class abstract_actor : public abstract_channel {
...
@@ -221,13 +242,9 @@ class abstract_actor : public abstract_channel {
m_host
=
new_host
;
m_host
=
new_host
;
}
}
private:
// cannot be changed after construction
// cannot be changed after construction
const
actor_id
m_id
;
const
actor_id
m_id
;
// you're either a proxy or you're not
const
bool
m_is_proxy
;
// initially exit_reason::not_exited
// initially exit_reason::not_exited
std
::
atomic
<
uint32_t
>
m_exit_reason
;
std
::
atomic
<
uint32_t
>
m_exit_reason
;
...
@@ -242,6 +259,9 @@ class abstract_actor : public abstract_channel {
...
@@ -242,6 +259,9 @@ class abstract_actor : public abstract_channel {
// identifies the execution unit this actor is currently executed by
// identifies the execution unit this actor is currently executed by
execution_unit
*
m_host
;
execution_unit
*
m_host
;
// stores several actor-related flags
int
m_flags
;
};
};
}
// namespace caf
}
// namespace caf
...
...
libcaf_core/caf/detail/proper_actor.hpp
View file @
d016fb80
...
@@ -44,11 +44,13 @@ class proper_actor_base : public Policies::resume_policy::template
...
@@ -44,11 +44,13 @@ class proper_actor_base : public Policies::resume_policy::template
public:
public:
template
<
class
...
Ts
>
template
<
class
...
Ts
>
proper_actor_base
(
Ts
&&
...
args
)
:
super
(
std
::
forward
<
Ts
>
(
args
)...)
{
proper_actor_base
(
Ts
&&
...
args
)
:
super
(
std
::
forward
<
Ts
>
(
args
)...)
{
CAF_REQUIRE
(
this
->
m_hidden
==
tru
e
);
CAF_REQUIRE
(
this
->
is_registered
()
==
fals
e
);
}
}
// grant access to the actor's mailbox
// grant access to the actor's mailbox
typename
Base
::
mailbox_type
&
mailbox
()
{
return
this
->
m_mailbox
;
}
typename
Base
::
mailbox_type
&
mailbox
()
{
return
this
->
m_mailbox
;
}
// member functions from scheduling policy
// member functions from scheduling policy
...
@@ -65,9 +67,9 @@ class proper_actor_base : public Policies::resume_policy::template
...
@@ -65,9 +67,9 @@ class proper_actor_base : public Policies::resume_policy::template
scheduling_policy
().
enqueue
(
dptr
(),
sender
,
mid
,
msg
,
eu
);
scheduling_policy
().
enqueue
(
dptr
(),
sender
,
mid
,
msg
,
eu
);
}
}
inline
void
launch
(
bool
is_
hidden
,
execution_unit
*
host
)
{
inline
void
launch
(
bool
hidden
,
execution_unit
*
host
)
{
CAF_LOG_TRACE
(
""
);
CAF_LOG_TRACE
(
""
);
this
->
hidden
(
is_
hidden
);
this
->
is_registered
(
!
hidden
);
this
->
scheduling_policy
().
launch
(
this
,
host
);
this
->
scheduling_policy
().
launch
(
this
,
host
);
}
}
...
@@ -141,16 +143,6 @@ class proper_actor_base : public Policies::resume_policy::template
...
@@ -141,16 +143,6 @@ class proper_actor_base : public Policies::resume_policy::template
awaited_response
);
awaited_response
);
}
}
inline
bool
hidden
()
const
{
return
this
->
m_hidden
;
}
void
cleanup
(
uint32_t
reason
)
override
{
CAF_LOG_TRACE
(
CAF_ARG
(
reason
));
if
(
!
hidden
())
detail
::
singletons
::
get_actor_registry
()
->
dec_running
();
super
::
cleanup
(
reason
);
}
protected:
protected:
inline
typename
Policies
::
scheduling_policy
&
scheduling_policy
()
{
inline
typename
Policies
::
scheduling_policy
&
scheduling_policy
()
{
return
m_policies
.
get_scheduling_policy
();
return
m_policies
.
get_scheduling_policy
();
...
@@ -172,16 +164,6 @@ class proper_actor_base : public Policies::resume_policy::template
...
@@ -172,16 +164,6 @@ class proper_actor_base : public Policies::resume_policy::template
return
static_cast
<
Derived
*>
(
this
);
return
static_cast
<
Derived
*>
(
this
);
}
}
inline
void
hidden
(
bool
value
)
{
if
(
this
->
m_hidden
==
value
)
return
;
if
(
value
)
{
detail
::
singletons
::
get_actor_registry
()
->
dec_running
();
}
else
{
detail
::
singletons
::
get_actor_registry
()
->
inc_running
();
}
this
->
m_hidden
=
value
;
}
private:
private:
Policies
m_policies
;
Policies
m_policies
;
};
};
...
...
libcaf_core/caf/event_based_actor.hpp
View file @
d016fb80
...
@@ -55,7 +55,7 @@ class event_based_actor
...
@@ -55,7 +55,7 @@ class event_based_actor
*/
*/
void
forward_to
(
const
actor
&
whom
);
void
forward_to
(
const
actor
&
whom
);
event_based_actor
();
event_based_actor
()
=
default
;
~
event_based_actor
();
~
event_based_actor
();
...
@@ -66,8 +66,6 @@ class event_based_actor
...
@@ -66,8 +66,6 @@ class event_based_actor
* Returns the initial actor behavior.
* Returns the initial actor behavior.
*/
*/
virtual
behavior
make_behavior
()
=
0
;
virtual
behavior
make_behavior
()
=
0
;
bool
m_initialized
;
};
};
class
event_based_actor
::
functor_based
:
public
extend
<
event_based_actor
>::
class
event_based_actor
::
functor_based
:
public
extend
<
event_based_actor
>::
...
...
libcaf_core/caf/local_actor.hpp
View file @
d016fb80
...
@@ -281,14 +281,44 @@ class local_actor : public extend<abstract_actor>::with<mixin::memory_cached> {
...
@@ -281,14 +281,44 @@ class local_actor : public extend<abstract_actor>::with<mixin::memory_cached> {
* Checks whether this actor traps exit messages.
* Checks whether this actor traps exit messages.
*/
*/
inline
bool
trap_exit
()
const
{
inline
bool
trap_exit
()
const
{
return
m_trap_exit
;
return
get_flag
(
trap_exit_flag
)
;
}
}
/**
/**
* Enables or disables trapping of exit messages.
* Enables or disables trapping of exit messages.
*/
*/
inline
void
trap_exit
(
bool
new_value
)
{
inline
void
trap_exit
(
bool
value
)
{
m_trap_exit
=
new_value
;
set_flag
(
value
,
trap_exit_flag
);
}
inline
bool
has_timeout
()
const
{
return
get_flag
(
has_timeout_flag
);
}
inline
void
has_timeout
(
bool
value
)
{
set_flag
(
value
,
has_timeout_flag
);
}
inline
bool
is_registered
()
const
{
return
get_flag
(
is_registered_flag
);
}
void
is_registered
(
bool
value
);
inline
bool
is_initialized
()
const
{
return
get_flag
(
is_initialized_flag
);
}
inline
void
is_initialized
(
bool
value
)
{
set_flag
(
value
,
is_initialized_flag
);
}
inline
bool
is_running
()
const
{
return
get_flag
(
is_running_flag
);
}
inline
void
is_running
(
bool
value
)
{
set_flag
(
value
,
is_running_flag
);
}
}
/**
/**
...
@@ -490,9 +520,6 @@ class local_actor : public extend<abstract_actor>::with<mixin::memory_cached> {
...
@@ -490,9 +520,6 @@ class local_actor : public extend<abstract_actor>::with<mixin::memory_cached> {
return
mailbox_element
::
create
(
std
::
forward
<
Ts
>
(
args
)...);
return
mailbox_element
::
create
(
std
::
forward
<
Ts
>
(
args
)...);
}
}
// true if this actor receives EXIT messages as ordinary messages
bool
m_trap_exit
;
// identifies the ID of the last sent synchronous request
// identifies the ID of the last sent synchronous request
message_id
m_last_request_id
;
message_id
m_last_request_id
;
...
...
libcaf_core/caf/mixin/behavior_stack_based.hpp
View file @
d016fb80
...
@@ -111,7 +111,7 @@ class behavior_stack_based_impl : public single_timeout<Base, Subtype> {
...
@@ -111,7 +111,7 @@ class behavior_stack_based_impl : public single_timeout<Base, Subtype> {
// request next timeout if behavior stack is not empty
// request next timeout if behavior stack is not empty
// and timeout handler did not set a new timeout, e.g.,
// and timeout handler did not set a new timeout, e.g.,
// by calling become()
// by calling become()
if
(
!
this
->
has_
active_
timeout
()
&&
has_behavior
())
{
if
(
!
this
->
has_timeout
()
&&
has_behavior
())
{
this
->
request_timeout
(
get_behavior
().
timeout
());
this
->
request_timeout
(
get_behavior
().
timeout
());
}
}
}
}
...
...
libcaf_core/caf/mixin/single_timeout.hpp
View file @
d016fb80
...
@@ -32,22 +32,21 @@ namespace mixin {
...
@@ -32,22 +32,21 @@ namespace mixin {
*/
*/
template
<
class
Base
,
class
Subtype
>
template
<
class
Base
,
class
Subtype
>
class
single_timeout
:
public
Base
{
class
single_timeout
:
public
Base
{
using
super
=
Base
;
public:
public:
using
super
=
Base
;
using
combined_type
=
single_timeout
;
using
combined_type
=
single_timeout
;
template
<
class
...
Ts
>
template
<
class
...
Ts
>
single_timeout
(
Ts
&&
...
args
)
single_timeout
(
Ts
&&
...
args
)
:
super
(
std
::
forward
<
Ts
>
(
args
)...)
:
super
(
std
::
forward
<
Ts
>
(
args
)...),
,
m_has_timeout
(
false
)
m_timeout_id
(
0
)
{
,
m_timeout_id
(
0
)
{}
// nop
}
void
request_timeout
(
const
duration
&
d
)
{
void
request_timeout
(
const
duration
&
d
)
{
if
(
d
.
valid
())
{
if
(
d
.
valid
())
{
m_has_timeout
=
true
;
this
->
has_timeout
(
true
)
;
auto
tid
=
++
m_timeout_id
;
auto
tid
=
++
m_timeout_id
;
auto
msg
=
make_message
(
timeout_msg
{
tid
});
auto
msg
=
make_message
(
timeout_msg
{
tid
});
if
(
d
.
is_zero
())
{
if
(
d
.
is_zero
())
{
...
@@ -57,26 +56,23 @@ class single_timeout : public Base {
...
@@ -57,26 +56,23 @@ class single_timeout : public Base {
}
else
}
else
this
->
delayed_send_tuple
(
this
,
d
,
std
::
move
(
msg
));
this
->
delayed_send_tuple
(
this
,
d
,
std
::
move
(
msg
));
}
else
}
else
m_has_timeout
=
false
;
this
->
has_timeout
(
false
)
;
}
}
inline
bool
waits_for_timeout
(
uint32_t
timeout_id
)
const
{
bool
waits_for_timeout
(
uint32_t
timeout_id
)
const
{
return
m_has_timeout
&&
m_timeout_id
==
timeout_id
;
return
this
->
has_timeout
()
&&
m_timeout_id
==
timeout_id
;
}
}
inline
bool
is_active_timeout
(
uint32_t
tid
)
const
{
bool
is_active_timeout
(
uint32_t
tid
)
const
{
return
waits_for_timeout
(
tid
);
return
waits_for_timeout
(
tid
);
}
}
inline
bool
has_active_timeout
()
const
{
return
m_has_timeout
;
}
void
reset_timeout
()
{
this
->
has_timeout
(
false
);
inline
void
reset_timeout
()
{
m_has_timeout
=
false
;
}
}
protected:
protected:
bool
m_has_timeout
;
uint32_t
m_timeout_id
;
uint32_t
m_timeout_id
;
};
};
}
// namespace mixin
}
// namespace mixin
...
...
libcaf_core/caf/policy/event_based_resume.hpp
View file @
d016fb80
...
@@ -93,8 +93,8 @@ class event_based_resume {
...
@@ -93,8 +93,8 @@ class event_based_resume {
||
(
!
d
->
bhvr_stack
().
empty
()
||
(
!
d
->
bhvr_stack
().
empty
()
&&
d
->
planned_exit_reason
()
==
exit_reason
::
not_exited
));
&&
d
->
planned_exit_reason
()
==
exit_reason
::
not_exited
));
try
{
try
{
if
(
!
d
->
m_initialized
)
{
if
(
!
d
->
is_initialized
()
)
{
d
->
m_initialized
=
true
;
d
->
is_initialized
(
true
)
;
auto
bhvr
=
d
->
make_behavior
();
auto
bhvr
=
d
->
make_behavior
();
if
(
bhvr
)
{
if
(
bhvr
)
{
// make_behavior() did return a behavior instead of using become()
// make_behavior() did return a behavior instead of using become()
...
...
libcaf_core/caf/policy/no_resume.hpp
View file @
d016fb80
...
@@ -16,7 +16,7 @@ class no_resume {
...
@@ -16,7 +16,7 @@ class no_resume {
template
<
class
Base
,
class
Derived
>
template
<
class
Base
,
class
Derived
>
struct
mixin
:
Base
{
struct
mixin
:
Base
{
template
<
class
...
Ts
>
template
<
class
...
Ts
>
mixin
(
Ts
&&
...
args
)
:
Base
(
std
::
forward
<
Ts
>
(
args
)...)
,
m_hidden
(
true
)
{
mixin
(
Ts
&&
...
args
)
:
Base
(
std
::
forward
<
Ts
>
(
args
)...)
{
// nop
// nop
}
}
...
@@ -50,8 +50,6 @@ class no_resume {
...
@@ -50,8 +50,6 @@ class no_resume {
this
->
cleanup
(
this
->
planned_exit_reason
());
this
->
cleanup
(
this
->
planned_exit_reason
());
return
resumable
::
done
;
return
resumable
::
done
;
}
}
bool
m_hidden
;
};
};
template
<
class
Actor
>
template
<
class
Actor
>
...
...
libcaf_core/caf/resumable.hpp
View file @
d016fb80
...
@@ -39,7 +39,7 @@ class resumable {
...
@@ -39,7 +39,7 @@ class resumable {
shutdown_execution_unit
shutdown_execution_unit
};
};
resumable
();
resumable
()
=
default
;
virtual
~
resumable
();
virtual
~
resumable
();
...
@@ -58,9 +58,6 @@ class resumable {
...
@@ -58,9 +58,6 @@ class resumable {
* or needs to be re-scheduled later.
* or needs to be re-scheduled later.
*/
*/
virtual
resume_result
resume
(
execution_unit
*
,
size_t
max_throughput
)
=
0
;
virtual
resume_result
resume
(
execution_unit
*
,
size_t
max_throughput
)
=
0
;
protected:
bool
m_hidden
;
};
};
}
// namespace caf
}
// namespace caf
...
...
libcaf_core/caf/scoped_actor.hpp
View file @
d016fb80
...
@@ -29,9 +29,7 @@ namespace caf {
...
@@ -29,9 +29,7 @@ namespace caf {
* A scoped handle to a blocking actor.
* A scoped handle to a blocking actor.
*/
*/
class
scoped_actor
{
class
scoped_actor
{
public:
public:
scoped_actor
();
scoped_actor
();
scoped_actor
(
const
scoped_actor
&
)
=
delete
;
scoped_actor
(
const
scoped_actor
&
)
=
delete
;
...
@@ -40,28 +38,38 @@ class scoped_actor {
...
@@ -40,28 +38,38 @@ class scoped_actor {
~
scoped_actor
();
~
scoped_actor
();
inline
blocking_actor
*
operator
->
()
const
{
return
m_self
.
get
();
}
inline
blocking_actor
*
operator
->
()
const
{
return
m_self
.
get
();
}
inline
blocking_actor
&
operator
*
()
const
{
return
*
m_self
;
}
inline
blocking_actor
&
operator
*
()
const
{
return
*
m_self
;
}
inline
blocking_actor
*
get
()
const
{
return
m_self
.
get
();
}
inline
blocking_actor
*
get
()
const
{
return
m_self
.
get
();
}
operator
channel
()
const
{
return
get
();
}
inline
operator
channel
()
const
{
return
get
();
}
operator
actor
()
const
{
return
get
();
}
inline
operator
actor
()
const
{
return
get
();
}
operator
actor_addr
()
const
{
return
get
()
->
address
();
}
inline
operator
actor_addr
()
const
{
return
get
()
->
address
();
}
inline
actor_addr
address
()
const
{
return
get
()
->
address
();
}
inline
actor_addr
address
()
const
{
return
get
()
->
address
();
}
private:
private:
void
init
(
bool
hide_actor
);
void
init
(
bool
hide_actor
);
bool
m_hidden
;
actor_id
m_prev
;
// used for logging/debugging purposes only
actor_id
m_prev
;
// used for logging/debugging purposes only
intrusive_ptr
<
blocking_actor
>
m_self
;
intrusive_ptr
<
blocking_actor
>
m_self
;
};
};
}
// namespace caf
}
// namespace caf
...
...
libcaf_core/caf/single_timeout.hpp
View file @
d016fb80
...
@@ -80,10 +80,7 @@ class single_timeout : public Base {
...
@@ -80,10 +80,7 @@ class single_timeout : public Base {
}
}
protected:
protected:
bool
m_has_timeout
;
std
::
uint32_t
m_timeout_id
;
std
::
uint32_t
m_timeout_id
;
};
};
}
// namespace caf
}
// namespace caf
...
...
libcaf_core/caf/typed_event_based_actor.hpp
View file @
d016fb80
...
@@ -44,10 +44,6 @@ class typed_event_based_actor : public
...
@@ -44,10 +44,6 @@ class typed_event_based_actor : public
mixin
::
behavior_stack_based
<
typed_behavior
<
Rs
...>
>::
template
impl
,
mixin
::
behavior_stack_based
<
typed_behavior
<
Rs
...>
>::
template
impl
,
mixin
::
sync_sender
<
nonblocking_response_handle_tag
>
::
template
impl
>
{
mixin
::
sync_sender
<
nonblocking_response_handle_tag
>
::
template
impl
>
{
public:
public:
typed_event_based_actor
()
:
m_initialized
(
false
)
{
// nop
}
using
signatures
=
detail
::
type_list
<
Rs
...
>
;
using
signatures
=
detail
::
type_list
<
Rs
...
>
;
using
behavior_type
=
typed_behavior
<
Rs
...
>
;
using
behavior_type
=
typed_behavior
<
Rs
...
>
;
...
@@ -58,7 +54,6 @@ class typed_event_based_actor : public
...
@@ -58,7 +54,6 @@ class typed_event_based_actor : public
protected:
protected:
virtual
behavior_type
make_behavior
()
=
0
;
virtual
behavior_type
make_behavior
()
=
0
;
bool
m_initialized
;
};
};
}
// namespace caf
}
// namespace caf
...
...
libcaf_core/src/abstract_actor.cpp
View file @
d016fb80
...
@@ -49,18 +49,18 @@ using guard_type = std::unique_lock<std::mutex>;
...
@@ -49,18 +49,18 @@ using guard_type = std::unique_lock<std::mutex>;
abstract_actor
::
abstract_actor
(
actor_id
aid
,
node_id
nid
)
abstract_actor
::
abstract_actor
(
actor_id
aid
,
node_id
nid
)
:
super
(
std
::
move
(
nid
)),
:
super
(
std
::
move
(
nid
)),
m_id
(
aid
),
m_id
(
aid
),
m_is_proxy
(
true
),
m_exit_reason
(
exit_reason
::
not_exited
),
m_exit_reason
(
exit_reason
::
not_exited
),
m_host
(
nullptr
)
{
m_host
(
nullptr
),
m_flags
(
0
)
{
// nop
// nop
}
}
abstract_actor
::
abstract_actor
()
abstract_actor
::
abstract_actor
()
:
super
(
detail
::
singletons
::
get_node_id
()),
:
super
(
detail
::
singletons
::
get_node_id
()),
m_id
(
detail
::
singletons
::
get_actor_registry
()
->
next_id
()),
m_id
(
detail
::
singletons
::
get_actor_registry
()
->
next_id
()),
m_is_proxy
(
false
),
m_exit_reason
(
exit_reason
::
not_exited
),
m_exit_reason
(
exit_reason
::
not_exited
),
m_host
(
nullptr
)
{
m_host
(
nullptr
),
m_flags
(
0
)
{
// nop
// nop
}
}
...
@@ -180,8 +180,7 @@ actor_addr abstract_actor::address() const {
...
@@ -180,8 +180,7 @@ actor_addr abstract_actor::address() const {
void
abstract_actor
::
cleanup
(
uint32_t
reason
)
{
void
abstract_actor
::
cleanup
(
uint32_t
reason
)
{
// log as 'actor'
// log as 'actor'
CAF_LOGM_TRACE
(
"caf::actor"
,
CAF_ARG
(
m_id
)
<<
", "
<<
CAF_ARG
(
reason
)
<<
", "
CAF_LOGM_TRACE
(
"caf::actor"
,
CAF_ARG
(
m_id
)
<<
", "
<<
CAF_ARG
(
reason
));
<<
CAF_ARG
(
m_is_proxy
));
CAF_REQUIRE
(
reason
!=
exit_reason
::
not_exited
);
CAF_REQUIRE
(
reason
!=
exit_reason
::
not_exited
);
// move everyhting out of the critical section before processing it
// move everyhting out of the critical section before processing it
decltype
(
m_links
)
mlinks
;
decltype
(
m_links
)
mlinks
;
...
...
libcaf_core/src/event_based_actor.cpp
View file @
d016fb80
...
@@ -25,10 +25,6 @@
...
@@ -25,10 +25,6 @@
namespace
caf
{
namespace
caf
{
event_based_actor
::
event_based_actor
()
:
m_initialized
(
false
)
{
// nop
}
event_based_actor
::~
event_based_actor
()
{
event_based_actor
::~
event_based_actor
()
{
// nop
// nop
}
}
...
...
libcaf_core/src/local_actor.cpp
View file @
d016fb80
...
@@ -60,8 +60,7 @@ class down_observer : public attachable {
...
@@ -60,8 +60,7 @@ class down_observer : public attachable {
}
// namespace <anonymous>
}
// namespace <anonymous>
local_actor
::
local_actor
()
local_actor
::
local_actor
()
:
m_trap_exit
(
false
),
:
m_dummy_node
(),
m_dummy_node
(),
m_current_node
(
&
m_dummy_node
),
m_current_node
(
&
m_dummy_node
),
m_planned_exit_reason
(
exit_reason
::
not_exited
)
{
m_planned_exit_reason
(
exit_reason
::
not_exited
)
{
// nop
// nop
...
@@ -178,6 +177,8 @@ void local_actor::cleanup(uint32_t reason) {
...
@@ -178,6 +177,8 @@ void local_actor::cleanup(uint32_t reason) {
CAF_LOG_TRACE
(
CAF_ARG
(
reason
));
CAF_LOG_TRACE
(
CAF_ARG
(
reason
));
m_subscriptions
.
clear
();
m_subscriptions
.
clear
();
super
::
cleanup
(
reason
);
super
::
cleanup
(
reason
);
// tell registry we're done
is_registered
(
false
);
}
}
void
local_actor
::
quit
(
uint32_t
reason
)
{
void
local_actor
::
quit
(
uint32_t
reason
)
{
...
@@ -235,4 +236,16 @@ message_id local_actor::sync_send_tuple_impl(message_priority mp,
...
@@ -235,4 +236,16 @@ message_id local_actor::sync_send_tuple_impl(message_priority mp,
return
nri
.
response_id
();
return
nri
.
response_id
();
}
}
void
local_actor
::
is_registered
(
bool
value
)
{
if
(
is_registered
()
==
value
)
{
return
;
}
if
(
value
)
{
detail
::
singletons
::
get_actor_registry
()
->
inc_running
();
}
else
{
detail
::
singletons
::
get_actor_registry
()
->
dec_running
();
}
set_flag
(
value
,
is_registered_flag
);
}
}
// namespace caf
}
// namespace caf
libcaf_core/src/resumable.cpp
View file @
d016fb80
...
@@ -21,10 +21,6 @@
...
@@ -21,10 +21,6 @@
namespace
caf
{
namespace
caf
{
resumable
::
resumable
()
:
m_hidden
(
true
)
{
// nop
}
resumable
::~
resumable
()
{
resumable
::~
resumable
()
{
// nop
// nop
}
}
...
...
libcaf_core/src/scoped_actor.cpp
View file @
d016fb80
...
@@ -47,10 +47,9 @@ blocking_actor* alloc() {
...
@@ -47,10 +47,9 @@ blocking_actor* alloc() {
}
// namespace <anonymous>
}
// namespace <anonymous>
void
scoped_actor
::
init
(
bool
hide_actor
)
{
void
scoped_actor
::
init
(
bool
hide_actor
)
{
m_hidden
=
hide_actor
;
m_self
.
reset
(
alloc
());
m_self
.
reset
(
alloc
());
if
(
!
m_hidden
)
{
m_self
->
is_registered
(
!
hide_actor
);
detail
::
singletons
::
get_actor_registry
()
->
inc_running
();
if
(
!
hide_actor
)
{
m_prev
=
CAF_SET_AID
(
m_self
->
id
());
m_prev
=
CAF_SET_AID
(
m_self
->
id
());
}
}
}
}
...
@@ -64,12 +63,11 @@ scoped_actor::scoped_actor(bool hide_actor) {
...
@@ -64,12 +63,11 @@ scoped_actor::scoped_actor(bool hide_actor) {
}
}
scoped_actor
::~
scoped_actor
()
{
scoped_actor
::~
scoped_actor
()
{
auto
r
=
m_self
->
planned_exit_reason
();
if
(
m_self
->
is_registered
())
{
m_self
->
cleanup
(
r
==
exit_reason
::
not_exited
?
exit_reason
::
normal
:
r
);
if
(
!
m_hidden
)
{
detail
::
singletons
::
get_actor_registry
()
->
dec_running
();
CAF_SET_AID
(
m_prev
);
CAF_SET_AID
(
m_prev
);
}
}
auto
r
=
m_self
->
planned_exit_reason
();
m_self
->
cleanup
(
r
==
exit_reason
::
not_exited
?
exit_reason
::
normal
:
r
);
}
}
}
// namespace caf
}
// namespace caf
libcaf_io/caf/io/broker.hpp
View file @
d016fb80
...
@@ -317,7 +317,9 @@ class broker : public extend<local_actor>::
...
@@ -317,7 +317,9 @@ class broker : public extend<local_actor>::
};
};
intrusive_ptr
<
impl
>
ptr
{
new
impl
{
this
,
std
::
move
(
sock
)}};
intrusive_ptr
<
impl
>
ptr
{
new
impl
{
this
,
std
::
move
(
sock
)}};
m_doormen
.
insert
(
std
::
make_pair
(
ptr
->
hdl
(),
ptr
));
m_doormen
.
insert
(
std
::
make_pair
(
ptr
->
hdl
(),
ptr
));
if
(
initialized
())
ptr
->
launch
();
if
(
is_initialized
())
{
ptr
->
launch
();
}
return
ptr
->
hdl
();
return
ptr
->
hdl
();
}
}
...
@@ -383,8 +385,6 @@ class broker : public extend<local_actor>::
...
@@ -383,8 +385,6 @@ class broker : public extend<local_actor>::
using
doorman_pointer
=
intrusive_ptr
<
doorman
>
;
using
doorman_pointer
=
intrusive_ptr
<
doorman
>
;
bool
initialized
()
const
;
virtual
behavior
make_behavior
()
=
0
;
virtual
behavior
make_behavior
()
=
0
;
/** @endcond */
/** @endcond */
...
@@ -428,12 +428,6 @@ class broker : public extend<local_actor>::
...
@@ -428,12 +428,6 @@ class broker : public extend<local_actor>::
policy
::
not_prioritizing
m_priority_policy
;
policy
::
not_prioritizing
m_priority_policy
;
policy
::
sequential_invoke
m_invoke_policy
;
policy
::
sequential_invoke
m_invoke_policy
;
bool
m_initialized
;
bool
m_hidden
;
bool
m_running
;
middleman
&
m_mm
;
middleman
&
m_mm
;
};
};
...
...
libcaf_io/src/broker.cpp
View file @
d016fb80
...
@@ -54,7 +54,7 @@ void broker::servant::disconnect() {
...
@@ -54,7 +54,7 @@ void broker::servant::disconnect() {
m_disconnected
=
true
;
m_disconnected
=
true
;
remove_from_broker
();
remove_from_broker
();
if
(
m_broker
->
exit_reason
()
==
exit_reason
::
not_exited
)
{
if
(
m_broker
->
exit_reason
()
==
exit_reason
::
not_exited
)
{
if
(
m_broker
->
m_running
)
{
if
(
m_broker
->
is_running
()
)
{
CAF_LOG_DEBUG
(
"broker is running, push message to cache"
);
CAF_LOG_DEBUG
(
"broker is running, push message to cache"
);
// push this message to the cache to make sure we
// push this message to the cache to make sure we
// don't have interleaved message handlers
// don't have interleaved message handlers
...
@@ -164,8 +164,8 @@ class broker::continuation {
...
@@ -164,8 +164,8 @@ class broker::continuation {
void
broker
::
invoke_message
(
const
actor_addr
&
sender
,
message_id
mid
,
void
broker
::
invoke_message
(
const
actor_addr
&
sender
,
message_id
mid
,
message
&
msg
)
{
message
&
msg
)
{
CAF_LOG_TRACE
(
CAF_TARG
(
msg
,
to_string
));
CAF_LOG_TRACE
(
CAF_TARG
(
msg
,
to_string
));
m_running
=
true
;
is_running
(
true
)
;
auto
sg
=
detail
::
make_scope_guard
([
=
]
{
m_running
=
false
;
});
auto
sg
=
detail
::
make_scope_guard
([
=
]
{
is_running
(
false
)
;
});
if
(
planned_exit_reason
()
!=
exit_reason
::
not_exited
if
(
planned_exit_reason
()
!=
exit_reason
::
not_exited
||
bhvr_stack
().
empty
())
{
||
bhvr_stack
().
empty
())
{
CAF_LOG_DEBUG
(
"actor already finished execution"
CAF_LOG_DEBUG
(
"actor already finished execution"
...
@@ -268,15 +268,7 @@ void broker::enqueue(const actor_addr& sender, message_id mid, message msg,
...
@@ -268,15 +268,7 @@ void broker::enqueue(const actor_addr& sender, message_id mid, message msg,
mid
,
std
::
move
(
msg
)});
mid
,
std
::
move
(
msg
)});
}
}
bool
broker
::
initialized
()
const
{
broker
::
broker
()
:
m_mm
(
*
middleman
::
instance
())
{
return
m_initialized
;
}
broker
::
broker
()
:
m_initialized
(
false
),
m_hidden
(
true
),
m_running
(
false
),
m_mm
(
*
middleman
::
instance
())
{
// nop
// nop
}
}
...
@@ -284,21 +276,16 @@ void broker::cleanup(uint32_t reason) {
...
@@ -284,21 +276,16 @@ void broker::cleanup(uint32_t reason) {
CAF_LOG_TRACE
(
CAF_ARG
(
reason
));
CAF_LOG_TRACE
(
CAF_ARG
(
reason
));
close_all
();
close_all
();
super
::
cleanup
(
reason
);
super
::
cleanup
(
reason
);
if
(
!
m_hidden
){
detail
::
singletons
::
get_actor_registry
()
->
dec_running
();
}
}
}
void
broker
::
launch
(
bool
is_hidden
,
execution_unit
*
)
{
void
broker
::
launch
(
bool
is_hidden
,
execution_unit
*
)
{
if
(
!
is_hidden
)
{
is_registered
(
!
is_hidden
);
m_hidden
=
false
;
detail
::
singletons
::
get_actor_registry
()
->
inc_running
();
}
CAF_PUSH_AID
(
id
());
CAF_PUSH_AID
(
id
());
CAF_LOGF_TRACE
(
"init and launch broker with id "
<<
id
());
CAF_LOGF_TRACE
(
"init and launch broker with id "
<<
id
());
// we want to make sure initialization is executed in MM context
// we want to make sure initialization is executed in MM context
broker_ptr
self
=
this
;
broker_ptr
self
=
this
;
self
->
become
(
on
(
atom
(
"INITMSG"
))
>>
[
self
]
{
self
->
become
(
on
(
atom
(
"INITMSG"
))
>>
[
self
]
{
CAF_LOGF_TRACE
(
CAF_MARG
(
self
,
get
));
CAF_LOGF_TRACE
(
CAF_MARG
(
self
,
get
));
self
->
unbecome
();
self
->
unbecome
();
// launch backends now, because user-defined initialization
// launch backends now, because user-defined initialization
...
@@ -306,12 +293,14 @@ void broker::launch(bool is_hidden, execution_unit*) {
...
@@ -306,12 +293,14 @@ void broker::launch(bool is_hidden, execution_unit*) {
for
(
auto
&
kvp
:
self
->
m_doormen
)
{
for
(
auto
&
kvp
:
self
->
m_doormen
)
{
kvp
.
second
->
launch
();
kvp
.
second
->
launch
();
}
}
self
->
m_initialized
=
true
;
self
->
is_initialized
(
true
)
;
// run user-defined initialization code
// run user-defined initialization code
auto
bhvr
=
self
->
make_behavior
();
auto
bhvr
=
self
->
make_behavior
();
if
(
bhvr
)
if
(
bhvr
)
{
self
->
become
(
std
::
move
(
bhvr
));
self
->
become
(
std
::
move
(
bhvr
));
});
}
}
);
self
->
enqueue
(
invalid_actor_addr
,
message_id
::
invalid
,
self
->
enqueue
(
invalid_actor_addr
,
message_id
::
invalid
,
make_message
(
atom
(
"INITMSG"
)),
nullptr
);
make_message
(
atom
(
"INITMSG"
)),
nullptr
);
}
}
...
...
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