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
e9b6839a
Commit
e9b6839a
authored
Oct 30, 2011
by
neverlord
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
addressed_message
parent
e3bce7a3
Changes
25
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
332 additions
and
82 deletions
+332
-82
Makefile.am
Makefile.am
+2
-0
cppa.files
cppa.files
+2
-0
cppa/actor.hpp
cppa/actor.hpp
+2
-0
cppa/any_tuple.hpp
cppa/any_tuple.hpp
+1
-2
cppa/cppa.hpp
cppa/cppa.hpp
+1
-1
cppa/detail/actor_registry.hpp
cppa/detail/actor_registry.hpp
+3
-3
cppa/detail/addressed_message.hpp
cppa/detail/addressed_message.hpp
+92
-0
cppa/detail/post_office.hpp
cppa/detail/post_office.hpp
+1
-1
cppa/detail/singleton_manager.hpp
cppa/detail/singleton_manager.hpp
+0
-2
cppa/scheduler.hpp
cppa/scheduler.hpp
+3
-3
cppa/tuple.hpp
cppa/tuple.hpp
+8
-0
src/actor.cpp
src/actor.cpp
+2
-2
src/actor_registry.cpp
src/actor_registry.cpp
+2
-2
src/addressed_message.cpp
src/addressed_message.cpp
+86
-0
src/post_office.cpp
src/post_office.cpp
+47
-21
src/scheduler.cpp
src/scheduler.cpp
+8
-10
src/singleton_manager.cpp
src/singleton_manager.cpp
+0
-9
src/to_uniform_name.cpp
src/to_uniform_name.cpp
+2
-1
src/uniform_type_info.cpp
src/uniform_type_info.cpp
+33
-4
src/yielding_message_queue.cpp
src/yielding_message_queue.cpp
+6
-5
unit_testing/ping_pong.cpp
unit_testing/ping_pong.cpp
+7
-5
unit_testing/test__atom.cpp
unit_testing/test__atom.cpp
+1
-1
unit_testing/test__local_group.cpp
unit_testing/test__local_group.cpp
+8
-1
unit_testing/test__serialization.cpp
unit_testing/test__serialization.cpp
+10
-5
unit_testing/test__spawn.cpp
unit_testing/test__spawn.cpp
+5
-4
No files found.
Makefile.am
View file @
e9b6839a
...
@@ -11,6 +11,7 @@ libcppa_la_SOURCES = \
...
@@ -11,6 +11,7 @@ libcppa_la_SOURCES = \
src/actor_proxy_cache.cpp
\
src/actor_proxy_cache.cpp
\
src/actor_proxy.cpp
\
src/actor_proxy.cpp
\
src/actor_registry.cpp
\
src/actor_registry.cpp
\
src/addressed_message.cpp
\
src/any_tuple.cpp
\
src/any_tuple.cpp
\
src/any_tuple_iterator.cpp
\
src/any_tuple_iterator.cpp
\
src/atom.cpp
\
src/atom.cpp
\
...
@@ -90,6 +91,7 @@ nobase_library_include_HEADERS = \
...
@@ -90,6 +91,7 @@ nobase_library_include_HEADERS = \
cppa/detail/actor_count.hpp
\
cppa/detail/actor_count.hpp
\
cppa/detail/actor_proxy_cache.hpp
\
cppa/detail/actor_proxy_cache.hpp
\
cppa/detail/actor_registry.hpp
\
cppa/detail/actor_registry.hpp
\
cppa/detail/addressed_message.hpp
\
cppa/detail/atom_val.hpp
\
cppa/detail/atom_val.hpp
\
cppa/detail/blocking_message_queue.hpp
\
cppa/detail/blocking_message_queue.hpp
\
cppa/detail/boxed.hpp
\
cppa/detail/boxed.hpp
\
...
...
cppa.files
View file @
e9b6839a
...
@@ -227,3 +227,5 @@ cppa/detail/group_manager.hpp
...
@@ -227,3 +227,5 @@ cppa/detail/group_manager.hpp
src/group_manager.cpp
src/group_manager.cpp
cppa/detail/empty_tuple.hpp
cppa/detail/empty_tuple.hpp
src/empty_tuple.cpp
src/empty_tuple.cpp
cppa/detail/addressed_message.hpp
src/addressed_message.cpp
cppa/actor.hpp
View file @
e9b6839a
...
@@ -18,6 +18,8 @@ namespace cppa {
...
@@ -18,6 +18,8 @@ namespace cppa {
class
serializer
;
class
serializer
;
class
deserializer
;
class
deserializer
;
typedef
std
::
uint32_t
actor_id
;
/**
/**
* @brief Base class for all actor implementations.
* @brief Base class for all actor implementations.
*/
*/
...
...
cppa/any_tuple.hpp
View file @
e9b6839a
...
@@ -10,8 +10,7 @@
...
@@ -10,8 +10,7 @@
namespace
cppa
{
namespace
cppa
{
/**
/**
* @brief Describes a fixed-length tuple (or tuple view)
* @brief Describes a fixed-length tuple with elements of any type.
* with elements of any type.
*/
*/
class
any_tuple
class
any_tuple
{
{
...
...
cppa/cppa.hpp
View file @
e9b6839a
...
@@ -453,7 +453,7 @@ local_actor* operator<<(local_actor* whom, any_tuple&& what);
...
@@ -453,7 +453,7 @@ local_actor* operator<<(local_actor* whom, any_tuple&& what);
template
<
typename
Duration
,
typename
...
Data
>
template
<
typename
Duration
,
typename
...
Data
>
void
future_send
(
actor_ptr
whom
,
const
Duration
&
rel_time
,
const
Data
&
...
data
)
void
future_send
(
actor_ptr
whom
,
const
Duration
&
rel_time
,
const
Data
&
...
data
)
{
{
get_scheduler
()
->
future_send
(
self
(),
whom
,
rel_time
,
data
...);
get_scheduler
()
->
future_send
(
whom
,
rel_time
,
data
...);
}
}
/**
/**
...
...
cppa/detail/actor_registry.hpp
View file @
e9b6839a
...
@@ -24,11 +24,11 @@ class actor_registry
...
@@ -24,11 +24,11 @@ class actor_registry
// removes @p whom from the list of known actors
// removes @p whom from the list of known actors
void
remove
(
actor
*
whom
);
void
remove
(
actor
*
whom
);
// looks for an actor with id @
actor_id
in the list of known actors
// looks for an actor with id @
p whom
in the list of known actors
actor_ptr
find
(
std
::
uint32_t
actor_id
);
actor_ptr
find
(
actor_id
whom
);
// gets the next free actor id
// gets the next free actor id
std
::
uint32_t
next_id
();
actor_id
next_id
();
// increases running-actors-count by one
// increases running-actors-count by one
void
inc_running
();
void
inc_running
();
...
...
cppa/detail/addressed_message.hpp
0 → 100644
View file @
e9b6839a
#ifndef ADDRESSED_MESSAGE_HPP
#define ADDRESSED_MESSAGE_HPP
#include <map>
#include <vector>
#include "cppa/actor.hpp"
#include "cppa/channel.hpp"
#include "cppa/any_tuple.hpp"
#include "cppa/process_information.hpp"
namespace
cppa
{
class
serializer
;
class
deserializer
;
}
namespace
cppa
{
namespace
detail
{
class
addressed_message
{
friend
struct
addr_msg_tinfo
;
public:
addressed_message
()
=
default
;
addressed_message
(
addressed_message
&&
)
=
default
;
addressed_message
(
const
addressed_message
&
)
=
default
;
addressed_message
&
operator
=
(
addressed_message
&&
)
=
default
;
addressed_message
&
operator
=
(
const
addressed_message
&
)
=
default
;
struct
process_ptr_less
{
bool
operator
()(
const
process_information_ptr
&
lhs
,
const
process_information_ptr
&
rhs
);
};
typedef
std
::
map
<
process_information_ptr
,
std
::
vector
<
actor_id
>
,
process_ptr_less
>
receiver_map
;
inline
const
receiver_map
&
receivers
()
const
;
inline
receiver_map
&
receivers
();
inline
const
any_tuple
&
content
()
const
;
inline
any_tuple
&
content
();
private:
void
serialize_to
(
serializer
*
sink
)
const
;
void
deserialize_from
(
deserializer
*
source
);
any_tuple
m_content
;
receiver_map
m_receivers
;
};
bool
operator
==
(
const
addressed_message
&
lhs
,
const
addressed_message
&
rhs
);
inline
bool
operator
!=
(
const
addressed_message
&
lhs
,
const
addressed_message
&
rhs
)
{
return
!
(
lhs
==
rhs
);
}
inline
const
any_tuple
&
addressed_message
::
content
()
const
{
return
m_content
;
}
inline
any_tuple
&
addressed_message
::
content
()
{
return
m_content
;
}
inline
const
addressed_message
::
receiver_map
&
addressed_message
::
receivers
()
const
{
return
m_receivers
;
}
inline
addressed_message
::
receiver_map
&
addressed_message
::
receivers
()
{
return
m_receivers
;
}
}
}
// namespace cppa::detail
#endif // ADDRESSED_MESSAGE_HPP
cppa/detail/post_office.hpp
View file @
e9b6839a
...
@@ -18,7 +18,7 @@ void post_office_add_peer(native_socket_t peer_socket,
...
@@ -18,7 +18,7 @@ void post_office_add_peer(native_socket_t peer_socket,
void
post_office_publish
(
native_socket_t
server_socket
,
void
post_office_publish
(
native_socket_t
server_socket
,
const
actor_ptr
&
published_actor
);
const
actor_ptr
&
published_actor
);
void
post_office_unpublish
(
std
::
uint32_t
actor_id
);
void
post_office_unpublish
(
actor_id
whom
);
void
post_office_close_socket
(
native_socket_t
sfd
);
void
post_office_close_socket
(
native_socket_t
sfd
);
...
...
cppa/detail/singleton_manager.hpp
View file @
e9b6839a
...
@@ -38,8 +38,6 @@ class singleton_manager
...
@@ -38,8 +38,6 @@ class singleton_manager
static
uniform_type_info_map
*
get_uniform_type_info_map
();
static
uniform_type_info_map
*
get_uniform_type_info_map
();
static
msg_content
*
get_message_dummy
();
static
abstract_tuple
*
get_tuple_dummy
();
static
abstract_tuple
*
get_tuple_dummy
();
static
empty_tuple
*
get_empty_tuple
();
static
empty_tuple
*
get_empty_tuple
();
...
...
cppa/scheduler.hpp
View file @
e9b6839a
...
@@ -86,12 +86,12 @@ class scheduler
...
@@ -86,12 +86,12 @@ class scheduler
virtual
void
await_others_done
();
virtual
void
await_others_done
();
template
<
typename
Duration
,
typename
...
Data
>
template
<
typename
Duration
,
typename
...
Data
>
void
future_send
(
actor_ptr
from
,
actor_ptr
to
,
void
future_send
(
const
actor_ptr
&
to
,
const
Duration
&
rel_time
,
const
Data
&
...
data
)
const
Duration
&
rel_time
,
const
Data
&
...
data
)
{
{
static_assert
(
sizeof
...(
Data
)
>
0
,
"no message to send"
);
static_assert
(
sizeof
...(
Data
)
>
0
,
"no message to send"
);
any_tuple
tup
=
make_tuple
(
util
::
duration
(
rel_time
),
data
...);
any_tuple
tup
=
make_tuple
(
util
::
duration
(
rel_time
),
to
,
data
...);
future_send_helper
()
->
enqueue
(
any_tuple
(
from
,
to
,
tup
));
future_send_helper
()
->
enqueue
(
std
::
move
(
tup
));
}
}
};
};
...
...
cppa/tuple.hpp
View file @
e9b6839a
...
@@ -7,6 +7,7 @@
...
@@ -7,6 +7,7 @@
#include <type_traits>
#include <type_traits>
#include "cppa/get.hpp"
#include "cppa/get.hpp"
#include "cppa/actor.hpp"
#include "cppa/cow_ptr.hpp"
#include "cppa/cow_ptr.hpp"
#include "cppa/ref_counted.hpp"
#include "cppa/ref_counted.hpp"
...
@@ -20,6 +21,8 @@
...
@@ -20,6 +21,8 @@
#include "cppa/detail/tuple_vals.hpp"
#include "cppa/detail/tuple_vals.hpp"
namespace
cppa
{
class
local_actor
;
}
namespace
cppa
{
namespace
detail
{
namespace
cppa
{
namespace
detail
{
/**
/**
...
@@ -56,6 +59,11 @@ struct chars_to_string
...
@@ -56,6 +59,11 @@ struct chars_to_string
std
::
is_same
<
subtype2
,
const
char32_t
*>
,
std
::
is_same
<
subtype2
,
const
char32_t
*>
,
std
::
is_same
<
subtype2
,
char32_t
*>
,
std
::
is_same
<
subtype2
,
char32_t
*>
,
is_array_of
<
subtype2
,
char32_t
>>::
type
is_array_of
<
subtype2
,
char32_t
>>::
type
subtype3
;
typedef
typename
util
::
replace_type
<
subtype3
,
actor_ptr
,
std
::
is_same
<
actor
*
,
T
>
,
std
::
is_same
<
local_actor
*
,
T
>>::
type
type
;
type
;
};
};
...
...
src/actor.cpp
View file @
e9b6839a
...
@@ -54,9 +54,9 @@ actor::~actor()
...
@@ -54,9 +54,9 @@ actor::~actor()
}
}
}
}
intrusive_ptr
<
actor
>
actor
::
by_id
(
std
::
uint32_t
actor_id
)
intrusive_ptr
<
actor
>
actor
::
by_id
(
actor_id
whom
)
{
{
return
registry
().
find
(
actor_id
);
return
registry
().
find
(
whom
);
}
}
void
actor
::
join
(
group_ptr
&
what
)
void
actor
::
join
(
group_ptr
&
what
)
...
...
src/actor_registry.cpp
View file @
e9b6839a
...
@@ -30,13 +30,13 @@ void actor_registry::remove(actor* whom)
...
@@ -30,13 +30,13 @@ void actor_registry::remove(actor* whom)
m_instances
.
erase
(
whom
->
id
());
m_instances
.
erase
(
whom
->
id
());
}
}
actor_ptr
actor_registry
::
find
(
std
::
uint32_t
actor_id
)
actor_ptr
actor_registry
::
find
(
actor_id
whom
)
{
{
actor_ptr
result
;
actor_ptr
result
;
// lifetime scope of guard
// lifetime scope of guard
{
{
shared_guard
guard
(
m_instances_mtx
);
shared_guard
guard
(
m_instances_mtx
);
auto
i
=
m_instances
.
find
(
actor_id
);
auto
i
=
m_instances
.
find
(
whom
);
if
(
i
!=
m_instances
.
end
())
if
(
i
!=
m_instances
.
end
())
{
{
result
.
reset
(
i
->
second
);
result
.
reset
(
i
->
second
);
...
...
src/addressed_message.cpp
0 → 100644
View file @
e9b6839a
#include <algorithm>
#include "cppa/to_string.hpp"
#include "cppa/serializer.hpp"
#include "cppa/deserializer.hpp"
#include "cppa/detail/addressed_message.hpp"
#include "cppa/util/abstract_uniform_type_info.hpp"
namespace
cppa
{
namespace
detail
{
bool
addressed_message
::
process_ptr_less
::
operator
()
(
const
process_information_ptr
&
lhs
,
const
process_information_ptr
&
rhs
)
{
if
(
lhs
&&
rhs
)
{
return
lhs
.
compare
(
rhs
)
<
0
;
}
else
if
(
!
lhs
&&
rhs
)
{
return
true
;
}
return
false
;
}
bool
operator
==
(
const
addressed_message
&
lhs
,
const
addressed_message
&
rhs
)
{
return
lhs
.
content
()
==
rhs
.
content
()
&&
std
::
equal
(
lhs
.
receivers
().
begin
(),
lhs
.
receivers
().
end
(),
rhs
.
receivers
().
begin
());
}
void
addressed_message
::
serialize_to
(
serializer
*
sink
)
const
{
primitive_variant
ptup
[
2
];
primitive_variant
pval
=
static_cast
<
std
::
uint32_t
>
(
m_receivers
.
size
());
// size of the map
sink
->
write_value
(
pval
);
for
(
auto
i
=
m_receivers
.
begin
();
i
!=
m_receivers
.
end
();
++
i
)
{
if
(
i
->
first
)
{
ptup
[
0
]
=
i
->
first
->
process_id
();
ptup
[
1
]
=
to_string
(
i
->
first
->
node_id
());
// process id as { process_id, node_id } tuple
sink
->
write_tuple
(
2
,
ptup
);
// size of the vector that holds the actor ids
pval
=
static_cast
<
std
::
uint32_t
>
(
i
->
second
.
size
());
sink
->
write_value
(
pval
);
for
(
auto
j
=
i
->
second
.
begin
();
j
!=
i
->
second
.
end
();
++
j
)
{
pval
=
static_cast
<
std
::
uint32_t
>
(
*
j
);
// actor id of one of the receivers
sink
->
write_value
(
pval
);
}
}
}
}
void
addressed_message
::
deserialize_from
(
deserializer
*
source
)
{
m_receivers
.
clear
();
primitive_variant
ptup
[
2
];
primitive_type
ptypes
[]
=
{
pt_uint32
,
pt_u8string
};
// size of the map
auto
map_size
=
get
<
std
::
uint32_t
>
(
source
->
read_value
(
pt_uint32
));
for
(
std
::
uint32_t
i
=
0
;
i
<
map_size
;
++
i
)
{
// process id as { process_id, node_id } tuple
source
->
read_tuple
(
2
,
ptypes
,
ptup
);
process_information_ptr
pi
;
pi
.
reset
(
new
process_information
(
get
<
std
::
uint32_t
>
(
ptup
[
0
]),
get
<
std
::
string
>
(
ptup
[
1
])));
std
::
vector
<
actor_id
>&
vec
=
m_receivers
[
pi
];
// size of vec
auto
vec_size
=
get
<
std
::
uint32_t
>
(
source
->
read_value
(
pt_uint32
));
vec
.
reserve
(
vec_size
);
// fill vector with the IDs of all receivers
for
(
decltype
(
vec_size
)
j
=
0
;
j
<
vec_size
;
++
j
)
{
vec
.
push_back
(
get
<
std
::
uint32_t
>
(
source
->
read_value
(
pt_uint32
)));
}
}
}
}
}
// namespace cppa::detail
src/post_office.cpp
View file @
e9b6839a
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
#include <vector> // std::vector
#include <vector> // std::vector
#include <cstring> // strerror
#include <cstring> // strerror
#include <cstdint> // std::uint32_t, std::uint64_t
#include <cstdint> // std::uint32_t, std::uint64_t
#include <iostream> // std::cout, std::endl
#include <iostream> // std::cout, std::
cerr, std::
endl
#include <exception> // std::logic_error
#include <exception> // std::logic_error
#include <algorithm> // std::find_if
#include <algorithm> // std::find_if
#include <stdexcept> // std::underflow_error
#include <stdexcept> // std::underflow_error
...
@@ -30,14 +30,19 @@
...
@@ -30,14 +30,19 @@
#include "cppa/detail/mailman.hpp"
#include "cppa/detail/mailman.hpp"
#include "cppa/detail/post_office.hpp"
#include "cppa/detail/post_office.hpp"
#include "cppa/detail/native_socket.hpp"
#include "cppa/detail/native_socket.hpp"
#include "cppa/detail/actor_registry.hpp"
#include "cppa/detail/network_manager.hpp"
#include "cppa/detail/network_manager.hpp"
#include "cppa/detail/post_office_msg.hpp"
#include "cppa/detail/post_office_msg.hpp"
#include "cppa/detail/singleton_manager.hpp"
#include "cppa/detail/singleton_manager.hpp"
#include "cppa/detail/actor_proxy_cache.hpp"
#include "cppa/detail/actor_proxy_cache.hpp"
#include "cppa/detail/addressed_message.hpp"
//#define DEBUG(arg) std::cout << arg << std::endl
//#define DEBUG(arg) std::cout << arg << std::endl
#define DEBUG(unused) ((void) 0)
#define DEBUG(unused) ((void) 0)
using
std
::
cerr
;
using
std
::
endl
;
namespace
cppa
{
namespace
detail
{
namespace
{
namespace
cppa
{
namespace
detail
{
namespace
{
// allocate in 1KB chunks (minimize reallocations)
// allocate in 1KB chunks (minimize reallocations)
...
@@ -209,7 +214,7 @@ class po_peer : public post_office_worker
...
@@ -209,7 +214,7 @@ class po_peer : public post_office_worker
,
m_observer
(
std
::
move
(
other
.
m_observer
))
,
m_observer
(
std
::
move
(
other
.
m_observer
))
,
m_rdbuf
(
std
::
move
(
other
.
m_rdbuf
))
,
m_rdbuf
(
std
::
move
(
other
.
m_rdbuf
))
,
m_children
(
std
::
move
(
other
.
m_children
))
,
m_children
(
std
::
move
(
other
.
m_children
))
,
m_meta_msg
(
uniform_typeid
<
a
ny_tupl
e
>
())
,
m_meta_msg
(
uniform_typeid
<
a
ddressed_messag
e
>
())
{
{
}
}
...
@@ -296,7 +301,7 @@ class po_peer : public post_office_worker
...
@@ -296,7 +301,7 @@ class po_peer : public post_office_worker
// wait for new data
// wait for new data
break
;
break
;
}
}
a
ny_tupl
e
msg
;
a
ddressed_messag
e
msg
;
binary_deserializer
bd
(
m_rdbuf
.
data
(),
m_rdbuf
.
size
());
binary_deserializer
bd
(
m_rdbuf
.
data
(),
m_rdbuf
.
size
());
try
try
{
{
...
@@ -308,12 +313,13 @@ class po_peer : public post_office_worker
...
@@ -308,12 +313,13 @@ class po_peer : public post_office_worker
DEBUG
(
to_uniform_name
(
typeid
(
e
))
<<
": "
<<
e
.
what
());
DEBUG
(
to_uniform_name
(
typeid
(
e
))
<<
": "
<<
e
.
what
());
return
false
;
return
false
;
}
}
if
(
msg
.
size
()
==
2
auto
&
content
=
msg
.
content
();
&&
msg
.
utype_info_at
(
0
)
==
typeid
(
atom_value
)
if
(
content
.
size
()
==
2
&&
msg
.
get_as
<
atom_value
>
(
0
)
==
atom
(
":Monitor"
)
&&
content
.
utype_info_at
(
0
)
==
typeid
(
atom_value
)
&&
msg
.
utype_info_at
(
1
)
==
typeid
(
actor_ptr
))
&&
content
.
get_as
<
atom_value
>
(
0
)
==
atom
(
":Monitor"
)
&&
content
.
utype_info_at
(
1
)
==
typeid
(
actor_ptr
))
{
{
actor_ptr
sender
=
msg
.
get_as
<
actor_ptr
>
(
1
);
actor_ptr
sender
=
content
.
get_as
<
actor_ptr
>
(
1
);
if
(
sender
->
parent_process
()
==
*
process_information
::
get
())
if
(
sender
->
parent_process
()
==
*
process_information
::
get
())
{
{
//cout << pinfo << " ':Monitor'; actor id = "
//cout << pinfo << " ':Monitor'; actor id = "
...
@@ -322,9 +328,9 @@ class po_peer : public post_office_worker
...
@@ -322,9 +328,9 @@ class po_peer : public post_office_worker
// this message was send from a proxy
// this message was send from a proxy
sender
->
attach_functor
([
=
](
std
::
uint32_t
reason
)
sender
->
attach_functor
([
=
](
std
::
uint32_t
reason
)
{
{
any_tuple
msg
=
make_tuple
(
atom
(
":KillProxy"
),
any_tuple
k
msg
=
make_tuple
(
atom
(
":KillProxy"
),
reason
);
reason
);
auto
mjob
=
new
detail
::
mailman_job
(
m_peer
,
msg
);
auto
mjob
=
new
detail
::
mailman_job
(
m_peer
,
k
msg
);
detail
::
mailman_queue
().
push_back
(
mjob
);
detail
::
mailman_queue
().
push_back
(
mjob
);
});
});
}
}
...
@@ -335,9 +341,29 @@ class po_peer : public post_office_worker
...
@@ -335,9 +341,29 @@ class po_peer : public post_office_worker
}
}
else
else
{
{
DEBUG
(
"<-- "
<<
to_string
(
msg
));
DEBUG
(
"<-- "
<<
to_string
(
content
));
auto
r
=
msg
.
receiver
();
auto
&
rmap
=
msg
.
receivers
();
if
(
r
)
r
->
enqueue
(
msg
);
for
(
auto
i
=
rmap
.
begin
();
i
!=
rmap
.
end
();
++
i
)
{
if
(
*
(
i
->
first
)
==
*
process_information
::
get
())
{
auto
&
vec
=
i
->
second
;
for
(
auto
j
=
vec
.
begin
();
j
!=
vec
.
end
();
++
j
)
{
auto
registry
=
singleton_manager
::
get_actor_registry
();
auto
receiver
=
registry
->
find
(
*
j
);
if
(
receiver
)
{
receiver
->
enqueue
(
msg
.
content
());
}
}
}
else
{
cerr
<<
"NOT IMPLEMENTED YET; post_office line "
<<
__LINE__
<<
endl
;
}
}
}
}
m_rdbuf
.
reset
();
m_rdbuf
.
reset
();
m_state
=
wait_for_msg_size
;
m_state
=
wait_for_msg_size
;
...
@@ -559,15 +585,15 @@ void post_office_loop(int pipe_read_handle, int pipe_write_handle)
...
@@ -559,15 +585,15 @@ void post_office_loop(int pipe_read_handle, int pipe_write_handle)
auto
&
pactor
=
assm
.
published_actor
;
auto
&
pactor
=
assm
.
published_actor
;
if
(
pactor
)
if
(
pactor
)
{
{
auto
a
ctor_
id
=
pactor
->
id
();
auto
aid
=
pactor
->
id
();
auto
callback
=
[
a
ctor_
id
](
std
::
uint32_t
)
auto
callback
=
[
aid
](
std
::
uint32_t
)
{
{
DEBUG
(
"call post_office_unpublish() ..."
);
DEBUG
(
"call post_office_unpublish() ..."
);
post_office_unpublish
(
a
ctor_
id
);
post_office_unpublish
(
aid
);
};
};
if
(
pactor
->
attach_functor
(
std
::
move
(
callback
)))
if
(
pactor
->
attach_functor
(
std
::
move
(
callback
)))
{
{
auto
&
dm
=
doormen
[
a
ctor_
id
];
auto
&
dm
=
doormen
[
aid
];
dm
.
push_back
(
po_doorman
(
assm
,
&
peers
));
dm
.
push_back
(
po_doorman
(
assm
,
&
peers
));
DEBUG
(
"new doorman"
);
DEBUG
(
"new doorman"
);
}
}
...
@@ -684,11 +710,11 @@ void post_office_publish(native_socket_t server_socket,
...
@@ -684,11 +710,11 @@ void post_office_publish(native_socket_t server_socket,
write
(
nm
->
write_handle
(),
msg
,
pipe_msg_size
);
write
(
nm
->
write_handle
(),
msg
,
pipe_msg_size
);
}
}
void
post_office_unpublish
(
std
::
uint32_t
actor_id
)
void
post_office_unpublish
(
actor_id
whom
)
{
{
DEBUG
(
"post_office_unpublish("
<<
actor_id
<<
")"
);
DEBUG
(
"post_office_unpublish("
<<
whom
<<
")"
);
auto
nm
=
singleton_manager
::
get_network_manager
();
auto
nm
=
singleton_manager
::
get_network_manager
();
pipe_msg
msg
=
{
unpublish_actor_event
,
actor_id
};
pipe_msg
msg
=
{
unpublish_actor_event
,
whom
};
write
(
nm
->
write_handle
(),
msg
,
pipe_msg_size
);
write
(
nm
->
write_handle
(),
msg
,
pipe_msg_size
);
}
}
...
...
src/scheduler.cpp
View file @
e9b6839a
...
@@ -45,10 +45,7 @@ struct scheduler_helper
...
@@ -45,10 +45,7 @@ struct scheduler_helper
void
stop
()
void
stop
()
{
{
{
m_worker
->
enqueue
(
make_tuple
(
atom
(
":_DIE"
)));
any_tuple
content
=
make_tuple
(
atom
(
":_DIE"
));
m_worker
->
enqueue
(
any_tuple
(
m_worker
,
m_worker
,
content
));
}
m_thread
.
join
();
m_thread
.
join
();
}
}
...
@@ -74,15 +71,16 @@ void scheduler_helper::time_emitter(scheduler_helper::ptr_type m_self)
...
@@ -74,15 +71,16 @@ void scheduler_helper::time_emitter(scheduler_helper::ptr_type m_self)
// message handling rules
// message handling rules
auto
rules
=
auto
rules
=
(
(
on
<
util
::
duration
,
any_type
*>
()
>>
[
&
](
util
::
duration
d
)
on
<
util
::
duration
,
actor_ptr
,
any_type
*>
()
>>
[
&
](
const
util
::
duration
&
d
,
const
actor_ptr
&
whom
)
{
{
any_tuple
tup
=
msg_ptr
->
msg
.
content
().
tail
(
1
);
any_tuple
msg
=
msg_ptr
->
msg
.
tail
(
2
);
if
(
!
tup
.
empty
())
if
(
!
msg
.
empty
())
{
{
// calculate timeout
// calculate timeout
auto
timeout
=
detail
::
now
();
auto
timeout
=
detail
::
now
();
timeout
+=
d
;
timeout
+=
d
;
future_msg
fmsg
(
msg_ptr
->
msg
.
sender
(),
tup
);
future_msg
fmsg
(
whom
,
msg
);
messages
.
insert
(
std
::
make_pair
(
std
::
move
(
timeout
),
messages
.
insert
(
std
::
make_pair
(
std
::
move
(
timeout
),
std
::
move
(
fmsg
)));
std
::
move
(
fmsg
)));
}
}
...
@@ -110,7 +108,7 @@ void scheduler_helper::time_emitter(scheduler_helper::ptr_type m_self)
...
@@ -110,7 +108,7 @@ void scheduler_helper::time_emitter(scheduler_helper::ptr_type m_self)
{
{
auto
&
whom
=
(
it
->
second
).
first
;
auto
&
whom
=
(
it
->
second
).
first
;
auto
&
what
=
(
it
->
second
).
second
;
auto
&
what
=
(
it
->
second
).
second
;
whom
->
enqueue
(
any_tuple
(
whom
,
whom
,
what
)
);
whom
->
enqueue
(
what
);
messages
.
erase
(
it
);
messages
.
erase
(
it
);
it
=
messages
.
begin
();
it
=
messages
.
begin
();
}
}
...
@@ -121,7 +119,7 @@ void scheduler_helper::time_emitter(scheduler_helper::ptr_type m_self)
...
@@ -121,7 +119,7 @@ void scheduler_helper::time_emitter(scheduler_helper::ptr_type m_self)
}
}
}
}
}
}
rules
(
msg_ptr
->
msg
.
content
()
);
rules
(
msg_ptr
->
msg
);
delete
msg_ptr
;
delete
msg_ptr
;
msg_ptr
=
nullptr
;
msg_ptr
=
nullptr
;
}
}
...
...
src/singleton_manager.cpp
View file @
e9b6839a
...
@@ -30,7 +30,6 @@ struct singleton_container
...
@@ -30,7 +30,6 @@ struct singleton_container
uniform_type_info_map
*
m_uniform_type_info_map
;
uniform_type_info_map
*
m_uniform_type_info_map
;
actor_registry
*
m_actor_registry
;
actor_registry
*
m_actor_registry
;
group_manager
*
m_group_manager
;
group_manager
*
m_group_manager
;
msg_content
*
m_msg_dummy
;
empty_tuple
*
m_empty_tuple
;
empty_tuple
*
m_empty_tuple
;
singleton_container
()
:
m_scheduler
(
nullptr
),
m_network_manager
(
nullptr
)
singleton_container
()
:
m_scheduler
(
nullptr
),
m_network_manager
(
nullptr
)
...
@@ -38,8 +37,6 @@ struct singleton_container
...
@@ -38,8 +37,6 @@ struct singleton_container
m_uniform_type_info_map
=
new
uniform_type_info_map
;
m_uniform_type_info_map
=
new
uniform_type_info_map
;
m_actor_registry
=
new
actor_registry
;
m_actor_registry
=
new
actor_registry
;
m_group_manager
=
new
group_manager
;
m_group_manager
=
new
group_manager
;
m_msg_dummy
=
new
msg_content
(
0
,
0
,
tuple
<
int
>
(
0
));
m_msg_dummy
->
ref
();
m_empty_tuple
=
new
empty_tuple
;
m_empty_tuple
=
new
empty_tuple
;
m_empty_tuple
->
ref
();
m_empty_tuple
->
ref
();
}
}
...
@@ -77,7 +74,6 @@ struct singleton_container
...
@@ -77,7 +74,6 @@ struct singleton_container
# endif
# endif
// it's safe now to delete all other singletons
// it's safe now to delete all other singletons
delete
m_group_manager
;
delete
m_group_manager
;
if
(
!
m_msg_dummy
->
deref
())
delete
m_msg_dummy
;
if
(
!
m_empty_tuple
->
deref
())
delete
m_empty_tuple
;
if
(
!
m_empty_tuple
->
deref
())
delete
m_empty_tuple
;
delete
m_actor_registry
;
delete
m_actor_registry
;
delete
m_uniform_type_info_map
;
delete
m_uniform_type_info_map
;
...
@@ -139,11 +135,6 @@ network_manager* singleton_manager::get_network_manager()
...
@@ -139,11 +135,6 @@ network_manager* singleton_manager::get_network_manager()
return
result
;
return
result
;
}
}
msg_content
*
singleton_manager
::
get_message_dummy
()
{
return
s_container
.
m_msg_dummy
;
}
empty_tuple
*
singleton_manager
::
get_empty_tuple
()
empty_tuple
*
singleton_manager
::
get_empty_tuple
()
{
{
return
s_container
.
m_empty_tuple
;
return
s_container
.
m_empty_tuple
;
...
...
src/to_uniform_name.cpp
View file @
e9b6839a
...
@@ -18,6 +18,7 @@
...
@@ -18,6 +18,7 @@
#include "cppa/detail/demangle.hpp"
#include "cppa/detail/demangle.hpp"
#include "cppa/detail/to_uniform_name.hpp"
#include "cppa/detail/to_uniform_name.hpp"
#include "cppa/detail/addressed_message.hpp"
namespace
{
namespace
{
...
@@ -96,7 +97,7 @@ std::string to_uniform_name_impl(Iterator begin, Iterator end,
...
@@ -96,7 +97,7 @@ std::string to_uniform_name_impl(Iterator begin, Iterator end,
{
demangled
<
cppa
::
actor_ptr
>
(),
"@actor"
},
{
demangled
<
cppa
::
actor_ptr
>
(),
"@actor"
},
{
demangled
<
cppa
::
group_ptr
>
(),
"@group"
},
{
demangled
<
cppa
::
group_ptr
>
(),
"@group"
},
{
demangled
<
cppa
::
channel_ptr
>
(),
"@channel"
},
{
demangled
<
cppa
::
channel_ptr
>
(),
"@channel"
},
{
demangled
<
cppa
::
any_tupl
e
>
(),
"@msg"
}
{
demangled
<
cppa
::
detail
::
addressed_messag
e
>
(),
"@msg"
}
};
};
// check if we could find the whole string in our lookup map
// check if we could find the whole string in our lookup map
...
...
src/uniform_type_info.cpp
View file @
e9b6839a
...
@@ -30,6 +30,7 @@
...
@@ -30,6 +30,7 @@
#include "cppa/detail/demangle.hpp"
#include "cppa/detail/demangle.hpp"
#include "cppa/detail/object_array.hpp"
#include "cppa/detail/object_array.hpp"
#include "cppa/detail/to_uniform_name.hpp"
#include "cppa/detail/to_uniform_name.hpp"
#include "cppa/detail/addressed_message.hpp"
#include "cppa/detail/singleton_manager.hpp"
#include "cppa/detail/singleton_manager.hpp"
#include "cppa/detail/actor_proxy_cache.hpp"
#include "cppa/detail/actor_proxy_cache.hpp"
#include "cppa/detail/uniform_type_info_map.hpp"
#include "cppa/detail/uniform_type_info_map.hpp"
...
@@ -115,7 +116,7 @@ void push(std::map<int, std::pair<string_set, string_set>>& ints)
...
@@ -115,7 +116,7 @@ void push(std::map<int, std::pair<string_set, string_set>>& ints)
}
// namespace <anonymous>
}
// namespace <anonymous>
namespace
cppa
{
namespace
detail
{
namespace
{
namespace
cppa
{
namespace
detail
{
//
namespace {
const
std
::
string
nullptr_type_name
=
"@0"
;
const
std
::
string
nullptr_type_name
=
"@0"
;
...
@@ -441,6 +442,7 @@ class any_tuple_tinfo : public util::abstract_uniform_type_info<any_tuple>
...
@@ -441,6 +442,7 @@ class any_tuple_tinfo : public util::abstract_uniform_type_info<any_tuple>
};
};
/*
class message_tinfo : public util::abstract_uniform_type_info<any_tuple>
class message_tinfo : public util::abstract_uniform_type_info<any_tuple>
{
{
...
@@ -501,6 +503,7 @@ class message_tinfo : public util::abstract_uniform_type_info<any_tuple>
...
@@ -501,6 +503,7 @@ class message_tinfo : public util::abstract_uniform_type_info<any_tuple>
}
}
};
};
*/
class
atom_value_tinfo
:
public
util
::
abstract_uniform_type_info
<
atom_value
>
class
atom_value_tinfo
:
public
util
::
abstract_uniform_type_info
<
atom_value
>
{
{
...
@@ -594,9 +597,34 @@ class int_tinfo : public detail::default_uniform_type_info_impl<T>
...
@@ -594,9 +597,34 @@ class int_tinfo : public detail::default_uniform_type_info_impl<T>
};
};
}
}
}
// namespace cppa::detail::<anonymous>
struct
addr_msg_tinfo
:
util
::
abstract_uniform_type_info
<
addressed_message
>
{
protected:
void
serialize
(
const
void
*
ptr
,
serializer
*
sink
)
const
{
sink
->
begin_object
(
name
());
reinterpret_cast
<
const
addressed_message
*>
(
ptr
)
->
serialize_to
(
sink
);
sink
->
end_object
();
}
void
deserialize
(
void
*
ptr
,
deserializer
*
source
)
const
{
std
::
string
cname
=
source
->
seek_object
();
if
(
cname
!=
name
())
{
throw
std
::
logic_error
(
"wrong type name found"
);
}
source
->
begin_object
(
name
());
reinterpret_cast
<
addressed_message
*>
(
ptr
)
->
deserialize_from
(
source
);
source
->
end_object
();
}
};
namespace
cppa
{
namespace
detail
{
//} } } // namespace cppa::detail::<anonymous>
//namespace cppa { namespace detail {
using
std
::
is_integral
;
using
std
::
is_integral
;
using
util
::
enable_if
;
using
util
::
enable_if
;
...
@@ -656,8 +684,9 @@ class uniform_type_info_map_helper
...
@@ -656,8 +684,9 @@ class uniform_type_info_map_helper
insert
(
d
,
new
actor_ptr_tinfo
,
{
raw_name
<
actor_ptr
>
()
});
insert
(
d
,
new
actor_ptr_tinfo
,
{
raw_name
<
actor_ptr
>
()
});
insert
(
d
,
new
group_ptr_tinfo
,
{
raw_name
<
actor_ptr
>
()
});
insert
(
d
,
new
group_ptr_tinfo
,
{
raw_name
<
actor_ptr
>
()
});
insert
(
d
,
new
channel_ptr_tinfo
,
{
raw_name
<
channel_ptr
>
()
});
insert
(
d
,
new
channel_ptr_tinfo
,
{
raw_name
<
channel_ptr
>
()
});
insert
(
d
,
new
message_tinfo
,
{
raw_name
<
any_tuple
>
()
});
//
insert(d, new message_tinfo, { raw_name<any_tuple>() });
insert
(
d
,
new
atom_value_tinfo
,
{
raw_name
<
atom_value
>
()
});
insert
(
d
,
new
atom_value_tinfo
,
{
raw_name
<
atom_value
>
()
});
insert
(
d
,
new
addr_msg_tinfo
,
{
raw_name
<
addr_msg_tinfo
>
()
});
insert
<
float
>
(
d
);
insert
<
float
>
(
d
);
insert
<
cppa
::
util
::
void_type
>
(
d
);
insert
<
cppa
::
util
::
void_type
>
(
d
);
if
(
sizeof
(
double
)
==
sizeof
(
long
double
))
if
(
sizeof
(
double
)
==
sizeof
(
long
double
))
...
...
src/yielding_message_queue.cpp
View file @
e9b6839a
...
@@ -60,7 +60,7 @@ yielding_message_queue_impl::filter_msg(const any_tuple& msg)
...
@@ -60,7 +60,7 @@ yielding_message_queue_impl::filter_msg(const any_tuple& msg)
nullptr
,
nullptr
,
atom
(
":Exit"
)))
atom
(
":Exit"
)))
{
{
auto
why
=
*
reinterpret_cast
<
const
std
::
uint32_t
*>
(
msg
.
content
().
at
(
1
));
auto
why
=
*
reinterpret_cast
<
const
std
::
uint32_t
*>
(
msg
.
at
(
1
));
if
(
why
!=
cppa
::
exit_reason
::
normal
)
if
(
why
!=
cppa
::
exit_reason
::
normal
)
{
{
// yields
// yields
...
@@ -68,11 +68,11 @@ yielding_message_queue_impl::filter_msg(const any_tuple& msg)
...
@@ -68,11 +68,11 @@ yielding_message_queue_impl::filter_msg(const any_tuple& msg)
}
}
return
normal_exit_signal
;
return
normal_exit_signal
;
}
}
if
(
match
<
atom_value
,
std
::
uint32_t
>
(
msg
.
content
()
,
if
(
match
<
atom_value
,
std
::
uint32_t
>
(
msg
,
nullptr
,
nullptr
,
atom
(
":Timeout"
)))
atom
(
":Timeout"
)))
{
{
auto
id
=
*
reinterpret_cast
<
const
std
::
uint32_t
*>
(
msg
.
content
().
at
(
1
));
auto
id
=
*
reinterpret_cast
<
const
std
::
uint32_t
*>
(
msg
.
at
(
1
));
return
(
id
==
m_active_timeout_id
)
?
timeout_message
return
(
id
==
m_active_timeout_id
)
?
timeout_message
:
expired_timeout_message
;
:
expired_timeout_message
;
}
}
...
@@ -161,7 +161,7 @@ yielding_message_queue_impl::dq(std::unique_ptr<queue_node>& node,
...
@@ -161,7 +161,7 @@ yielding_message_queue_impl::dq(std::unique_ptr<queue_node>& node,
default:
break
;
default:
break
;
}
}
std
::
unique_ptr
<
intermediate
>
imd
(
rules
.
get_intermediate
(
node
->
msg
.
content
()
));
std
::
unique_ptr
<
intermediate
>
imd
(
rules
.
get_intermediate
(
node
->
msg
));
if
(
imd
)
if
(
imd
)
{
{
m_last_dequeued
=
node
->
msg
;
m_last_dequeued
=
node
->
msg
;
...
@@ -177,7 +177,8 @@ yielding_message_queue_impl::dq(std::unique_ptr<queue_node>& node,
...
@@ -177,7 +177,8 @@ yielding_message_queue_impl::dq(std::unique_ptr<queue_node>& node,
}
}
}
}
bool
yielding_message_queue_impl
::
dequeue_impl
(
timed_invoke_rules
&
rules
,
queue_node_buffer
&
buffer
)
bool
yielding_message_queue_impl
::
dequeue_impl
(
timed_invoke_rules
&
rules
,
queue_node_buffer
&
buffer
)
{
{
if
(
m_queue
.
empty
()
&&
!
m_has_pending_timeout_request
)
if
(
m_queue
.
empty
()
&&
!
m_has_pending_timeout_request
)
{
{
...
...
unit_testing/ping_pong.cpp
View file @
e9b6839a
...
@@ -15,17 +15,18 @@ void pong(actor_ptr ping_actor)
...
@@ -15,17 +15,18 @@ void pong(actor_ptr ping_actor)
// invoke rules
// invoke rules
receive_loop
receive_loop
(
(
on
(
atom
(
"Ping"
),
std
::
int32_t
(
9
))
>>
[]()
on
(
atom
(
"Ping"
),
val
<
actor_ptr
>
(),
std
::
int32_t
(
9
))
>>
[]()
//on<atom("Ping"), std::int32_t>(9) >> []()
//on<atom("Ping"), std::int32_t>(9) >> []()
{
{
// terminate with non-normal exit reason
// terminate with non-normal exit reason
// to force ping actor to quit
// to force ping actor to quit
quit
(
exit_reason
::
user_defined
);
quit
(
exit_reason
::
user_defined
);
},
},
on
(
atom
(
"Ping"
),
val
<
std
::
int32_t
>
())
>>
[](
std
::
int32_t
value
)
on
<
atom
(
"Ping"
),
actor_ptr
,
std
::
int32_t
>
()
>>
[](
actor_ptr
teammate
,
std
::
int32_t
value
)
//on<atom("Ping"), std::int32_t>() >> [](int value)
//on<atom("Ping"), std::int32_t>() >> [](int value)
{
{
reply
(
atom
(
"Pong"
),
value
+
1
);
send
(
teammate
,
atom
(
"Ping"
),
self
(
),
value
+
1
);
}
}
);
);
}
}
...
@@ -36,10 +37,11 @@ void ping()
...
@@ -36,10 +37,11 @@ void ping()
// invoke rule
// invoke rule
receive_loop
receive_loop
(
(
on
<
atom
(
"Pong"
),
std
::
int32_t
>
()
>>
[](
std
::
int32_t
value
)
on
<
atom
(
"Pong"
),
actor_ptr
,
std
::
int32_t
>
()
>>
[](
actor_ptr
teammate
,
std
::
int32_t
value
)
{
{
++
s_pongs
;
++
s_pongs
;
reply
(
atom
(
"Ping"
),
value
+
1
);
send
(
teammate
,
atom
(
"Ping"
),
self
(
),
value
+
1
);
}
}
);
);
}
}
...
...
unit_testing/test__atom.cpp
View file @
e9b6839a
...
@@ -57,7 +57,7 @@ size_t test__atom()
...
@@ -57,7 +57,7 @@ size_t test__atom()
);
);
CPPA_CHECK
(
matched_pattern
[
0
]
&&
matched_pattern
[
1
]
&&
matched_pattern
[
2
]);
CPPA_CHECK
(
matched_pattern
[
0
]
&&
matched_pattern
[
1
]
&&
matched_pattern
[
2
]);
any_tuple
msg
=
receive
();
any_tuple
msg
=
receive
();
CPPA_CHECK
((
match
<
atom_value
,
atom_value
,
atom_value
,
float
>
(
msg
.
content
()
,
nullptr
,
atom
(
"b"
),
atom
(
"a"
),
atom
(
"c"
))));
CPPA_CHECK
((
match
<
atom_value
,
atom_value
,
atom_value
,
float
>
(
msg
,
nullptr
,
atom
(
"b"
),
atom
(
"a"
),
atom
(
"c"
))));
CPPA_CHECK
(
try_receive
(
msg
)
==
false
);
CPPA_CHECK
(
try_receive
(
msg
)
==
false
);
return
CPPA_TEST_RESULT
;
return
CPPA_TEST_RESULT
;
}
}
unit_testing/test__local_group.cpp
View file @
e9b6839a
...
@@ -25,10 +25,17 @@ size_t test__local_group()
...
@@ -25,10 +25,17 @@ size_t test__local_group()
{
{
CPPA_TEST
(
test__local_group
);
CPPA_TEST
(
test__local_group
);
auto
foo_group
=
group
::
get
(
"local"
,
"foo"
);
auto
foo_group
=
group
::
get
(
"local"
,
"foo"
);
actor_ptr
master
=
self
();
for
(
int
i
=
0
;
i
<
5
;
++
i
)
for
(
int
i
=
0
;
i
<
5
;
++
i
)
{
{
// spawn five workers and let them join local/foo
// spawn five workers and let them join local/foo
auto
w
=
spawn
([]()
{
receive
(
on
<
int
>
()
>>
[](
int
v
)
{
reply
(
v
);
});
});
auto
w
=
spawn
([
&
master
]()
{
receive
(
on
<
int
>
()
>>
[
&
master
](
int
v
)
{
send
(
master
,
v
);
});
});
w
->
join
(
foo_group
);
w
->
join
(
foo_group
);
}
}
send
(
foo_group
,
2
);
send
(
foo_group
,
2
);
...
...
unit_testing/test__serialization.cpp
View file @
e9b6839a
...
@@ -112,7 +112,7 @@ bool operator!=(const struct_c& lhs, const struct_c& rhs)
...
@@ -112,7 +112,7 @@ bool operator!=(const struct_c& lhs, const struct_c& rhs)
return
!
(
lhs
==
rhs
);
return
!
(
lhs
==
rhs
);
}
}
static
const
char
*
msg1str
=
u8R"__(@
msg ( @0, @channel ( @0 ), @<> ( { @i32 ( 42 ), @str ( "Hello \"World\"!" ) } )
))__"
;
static
const
char
*
msg1str
=
u8R"__(@
<> ( { @i32 ( 42 ), @str ( "Hello \"World\"!" ) }
))__"
;
size_t
test__serialization
()
size_t
test__serialization
()
{
{
...
@@ -157,8 +157,13 @@ size_t test__serialization()
...
@@ -157,8 +157,13 @@ size_t test__serialization()
}
}
{
{
any_tuple
msg1
(
0
,
0
,
42
,
std
::
string
(
"Hello
\"
World
\"
!"
));
any_tuple
msg1
=
cppa
::
make_tuple
(
42
,
std
::
string
(
"Hello
\"
World
\"
!"
));
CPPA_CHECK_EQUAL
(
msg1str
,
to_string
(
msg1
));
auto
msg1_tostring
=
to_string
(
msg1
);
if
(
msg1str
!=
msg1_tostring
)
{
CPPA_ERROR
(
"msg1str != to_string(msg1)"
);
cerr
<<
"to_string(msg1) = "
<<
msg1_tostring
<<
endl
;
}
binary_serializer
bs
;
binary_serializer
bs
;
bs
<<
msg1
;
bs
<<
msg1
;
binary_deserializer
bd
(
bs
.
data
(),
bs
.
size
());
binary_deserializer
bd
(
bs
.
data
(),
bs
.
size
());
...
@@ -168,8 +173,8 @@ size_t test__serialization()
...
@@ -168,8 +173,8 @@ size_t test__serialization()
CPPA_CHECK_EQUAL
(
obj1
,
obj2
);
CPPA_CHECK_EQUAL
(
obj1
,
obj2
);
if
(
obj1
.
type
()
==
typeid
(
any_tuple
)
&&
obj2
.
type
()
==
obj1
.
type
())
if
(
obj1
.
type
()
==
typeid
(
any_tuple
)
&&
obj2
.
type
()
==
obj1
.
type
())
{
{
auto
&
content1
=
get
<
any_tuple
>
(
obj1
)
.
content
()
;
auto
&
content1
=
get
<
any_tuple
>
(
obj1
);
auto
&
content2
=
get
<
any_tuple
>
(
obj2
)
.
content
()
;
auto
&
content2
=
get
<
any_tuple
>
(
obj2
);
auto
cview1
=
get_view
<
decltype
(
42
),
std
::
string
>
(
content1
);
auto
cview1
=
get_view
<
decltype
(
42
),
std
::
string
>
(
content1
);
auto
cview2
=
get_view
<
decltype
(
42
),
std
::
string
>
(
content2
);
auto
cview2
=
get_view
<
decltype
(
42
),
std
::
string
>
(
content2
);
CPPA_CHECK_EQUAL
(
cview1
.
size
(),
2
);
CPPA_CHECK_EQUAL
(
cview1
.
size
(),
2
);
...
...
unit_testing/test__spawn.cpp
View file @
e9b6839a
...
@@ -25,8 +25,8 @@ void testee1()
...
@@ -25,8 +25,8 @@ void testee1()
others
()
>>
[]()
others
()
>>
[]()
{
{
any_tuple
msg
=
last_received
();
any_tuple
msg
=
last_received
();
actor_ptr
sender
=
msg
.
sender
();
//
actor_ptr sender = msg.sender();
sender
->
enqueue
(
any_tuple
(
self
(),
sender
,
msg
.
content
()));
//
sender->enqueue(any_tuple(self(), sender, msg.content()));
},
},
after
(
std
::
chrono
::
milliseconds
(
10
))
>>
[]()
after
(
std
::
chrono
::
milliseconds
(
10
))
>>
[]()
{
{
...
@@ -45,7 +45,7 @@ void testee2(actor_ptr other)
...
@@ -45,7 +45,7 @@ void testee2(actor_ptr other)
{
{
// "sleep" for sleep_time milliseconds
// "sleep" for sleep_time milliseconds
receive
(
after
(
std
::
chrono
::
milliseconds
(
sleep_time
))
>>
[]()
{});
receive
(
after
(
std
::
chrono
::
milliseconds
(
sleep_time
))
>>
[]()
{});
reply
(
sleep_time
*
2
);
//
reply(sleep_time * 2);
}
}
);
);
}
}
...
@@ -61,7 +61,7 @@ void testee3(actor_ptr parent)
...
@@ -61,7 +61,7 @@ void testee3(actor_ptr parent)
{
{
if
(
polls
<
5
)
if
(
polls
<
5
)
{
{
delayed_reply
(
std
::
chrono
::
milliseconds
(
50
),
atom
(
"Poll"
));
//
delayed_reply(std::chrono::milliseconds(50), atom("Poll"));
}
}
send
(
parent
,
atom
(
"Push"
),
polls
);
send
(
parent
,
atom
(
"Push"
),
polls
);
}
}
...
@@ -70,6 +70,7 @@ void testee3(actor_ptr parent)
...
@@ -70,6 +70,7 @@ void testee3(actor_ptr parent)
size_t
test__spawn
()
size_t
test__spawn
()
{
{
return
0
;
CPPA_TEST
(
test__spawn
);
CPPA_TEST
(
test__spawn
);
auto
report_unexpected
=
[
&
]()
auto
report_unexpected
=
[
&
]()
{
{
...
...
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