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
fdd29977
Commit
fdd29977
authored
Jan 18, 2012
by
neverlord
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CPPA_DISABLE_CONTEXT_SWITCHING
parent
b3471511
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
102 additions
and
179 deletions
+102
-179
cppa/config.hpp
cppa/config.hpp
+8
-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
+6
-0
cppa/util/fiber.hpp
cppa/util/fiber.hpp
+11
-2
src/converted_thread_context.cpp
src/converted_thread_context.cpp
+6
-9
src/fiber.cpp
src/fiber.cpp
+28
-154
src/mailman.cpp
src/mailman.cpp
+1
-1
src/mock_scheduler.cpp
src/mock_scheduler.cpp
+1
-1
src/post_office.cpp
src/post_office.cpp
+1
-1
src/task_scheduler.cpp
src/task_scheduler.cpp
+11
-2
src/thread_pool_scheduler.cpp
src/thread_pool_scheduler.cpp
+10
-5
src/yielding_actor.cpp
src/yielding_actor.cpp
+9
-1
unit_testing/test__remote_actor.cpp
unit_testing/test__remote_actor.cpp
+1
-1
unit_testing/test__spawn.cpp
unit_testing/test__spawn.cpp
+1
-0
unit_testing/test__yield_interface.cpp
unit_testing/test__yield_interface.cpp
+7
-0
No files found.
cppa/config.hpp
View file @
fdd29977
...
@@ -31,6 +31,11 @@
...
@@ -31,6 +31,11 @@
#ifndef CPPA_CONFIG_HPP
#ifndef CPPA_CONFIG_HPP
#define CPPA_CONFIG_HPP
#define CPPA_CONFIG_HPP
// uncomment this line or use
// ./configure CXXFLAGS="-DCPPA_DISABLE_CONTEXT_SWITCHING"
// if ucontext_t is not available on your platform
//#define CPPA_DISABLE_CONTEXT_SWITCHING
#if defined(__GNUC__)
#if defined(__GNUC__)
# define CPPA_GCC
# define CPPA_GCC
#endif
#endif
...
@@ -55,8 +60,10 @@
...
@@ -55,8 +60,10 @@
#ifdef CPPA_MACOS
#ifdef CPPA_MACOS
# include <libkern/OSAtomic.h>
# include <libkern/OSAtomic.h>
# define CPPA_MEMORY_BARRIER() OSMemoryBarrier()
# define CPPA_MEMORY_BARRIER() OSMemoryBarrier()
#elif defined(CPPA_
LINUX
)
#elif defined(CPPA_
GCC
)
# define CPPA_MEMORY_BARRIER() __sync_synchronize()
# define CPPA_MEMORY_BARRIER() __sync_synchronize()
#else
# error Plattform and/or compiler not supportet
#endif
#endif
#endif // CPPA_CONFIG_HPP
#endif // CPPA_CONFIG_HPP
cppa/detail/converted_thread_context.hpp
View file @
fdd29977
...
@@ -103,7 +103,7 @@ class converted_thread_context : public abstract_actor<local_actor>
...
@@ -103,7 +103,7 @@ class converted_thread_context : public abstract_actor<local_actor>
throw_on_exit_result
throw_on_exit
(
any_tuple
const
&
msg
);
throw_on_exit_result
throw_on_exit
(
any_tuple
const
&
msg
);
pattern
<
atom_value
,
actor_ptr
,
std
::
uint32_t
>
m_exit_msg_pattern
;
pattern
<
atom_value
,
std
::
uint32_t
>
m_exit_msg_pattern
;
};
};
...
...
cppa/detail/yielding_actor.hpp
View file @
fdd29977
...
@@ -31,6 +31,10 @@
...
@@ -31,6 +31,10 @@
#ifndef YIELDING_ACTOR_HPP
#ifndef YIELDING_ACTOR_HPP
#define YIELDING_ACTOR_HPP
#define YIELDING_ACTOR_HPP
#include "cppa/config.hpp"
#ifndef CPPA_DISABLE_CONTEXT_SWITCHING
#include <stack>
#include <stack>
#include "cppa/pattern.hpp"
#include "cppa/pattern.hpp"
...
@@ -85,4 +89,6 @@ class yielding_actor : public abstract_scheduled_actor
...
@@ -85,4 +89,6 @@ class yielding_actor : public abstract_scheduled_actor
}
}
// namespace cppa::detail
}
}
// namespace cppa::detail
#endif // CPPA_DISABLE_CONTEXT_SWITCHING
#endif // YIELDING_ACTOR_HPP
#endif // YIELDING_ACTOR_HPP
cppa/util/fiber.hpp
View file @
fdd29977
...
@@ -33,13 +33,22 @@
...
@@ -33,13 +33,22 @@
#include "cppa/config.hpp"
#include "cppa/config.hpp"
#if defined
(CPPA_MACOS) || defined
(CPPA_LINUX)
#if defined
(CPPA_MACOS) || defined
(CPPA_LINUX)
# define CPPA_USE_UCONTEXT_IMPL
# define CPPA_USE_UCONTEXT_IMPL
#elif defined (CPPA_WINDOWS)
#elif defined (CPPA_WINDOWS)
# define CPPA_USE_FIBER_IMPL
# define CPPA_USE_FIBER_IMPL
#endif
#endif
#ifdef CPPA_USE_UCONTEXT_IMPL
#ifdef CPPA_DISABLE_CONTEXT_SWITCHING
namespace
cppa
{
namespace
util
{
struct
fiber
{
inline
static
void
swap
(
fiber
&
,
fiber
&
)
{
}
};
}
}
#elif defined(CPPA_USE_UCONTEXT_IMPL)
namespace
cppa
{
namespace
util
{
namespace
cppa
{
namespace
util
{
...
...
src/converted_thread_context.cpp
View file @
fdd29977
...
@@ -47,11 +47,10 @@ converted_thread_context::converted_thread_context()
...
@@ -47,11 +47,10 @@ converted_thread_context::converted_thread_context()
void
converted_thread_context
::
quit
(
std
::
uint32_t
reason
)
void
converted_thread_context
::
quit
(
std
::
uint32_t
reason
)
{
{
try
{
super
::
cleanup
(
reason
);
}
catch
(...)
{
}
super
::
cleanup
(
reason
);
// actor_exited should not be catched, but if anyone does,
// actor_exited should not be catched, but if anyone does,
// self must point to a newly created instance
// self must point to a newly created instance
self
.
set
(
nullptr
);
//self.set(nullptr);
//set_self(nullptr);
throw
actor_exited
(
reason
);
throw
actor_exited
(
reason
);
}
}
...
@@ -88,7 +87,7 @@ void converted_thread_context::dequeue(timed_invoke_rules& rules) /*override*/
...
@@ -88,7 +87,7 @@ void converted_thread_context::dequeue(timed_invoke_rules& rules) /*override*/
queue_node_ptr
node
(
m_mailbox
.
try_pop
());
queue_node_ptr
node
(
m_mailbox
.
try_pop
());
do
do
{
{
while
(
!
node
)
if
(
!
node
)
{
{
node
.
reset
(
m_mailbox
.
try_pop
(
timeout
));
node
.
reset
(
m_mailbox
.
try_pop
(
timeout
));
if
(
!
node
)
if
(
!
node
)
...
@@ -102,13 +101,11 @@ void converted_thread_context::dequeue(timed_invoke_rules& rules) /*override*/
...
@@ -102,13 +101,11 @@ void converted_thread_context::dequeue(timed_invoke_rules& rules) /*override*/
while
(
dq
(
node
,
rules
,
buffer
)
==
false
);
while
(
dq
(
node
,
rules
,
buffer
)
==
false
);
}
}
converted_thread_context
::
throw_on_exit_result
converted_thread_context
::
throw_on_exit_result
converted_thread_context
::
throw_on_exit
(
const
any_tuple
&
msg
)
converted_thread_context
::
throw_on_exit
(
any_tuple
const
&
msg
)
{
{
pattern
<
atom_value
,
actor_ptr
,
std
::
uint32_t
>::
mapping_vector
*
ptr
=
nullptr
;
if
(
matches
(
msg
.
begin
(),
m_exit_msg_pattern
.
begin
()))
auto
j
=
m_exit_msg_pattern
.
begin
();
if
(
detail
::
matches
(
pm_decorated
(
msg
.
begin
(),
ptr
),
j
))
{
{
auto
reason
=
*
reinterpret_cast
<
const
std
::
uint32_t
*>
(
msg
.
at
(
2
)
);
auto
reason
=
msg
.
get_as
<
std
::
uint32_t
>
(
1
);
if
(
reason
!=
exit_reason
::
normal
)
if
(
reason
!=
exit_reason
::
normal
)
{
{
// throws
// throws
...
...
src/fiber.cpp
View file @
fdd29977
...
@@ -32,6 +32,9 @@
...
@@ -32,6 +32,9 @@
#define _XOPEN_SOURCE
#define _XOPEN_SOURCE
#endif
#endif
#include "cppa/config.hpp"
#ifndef CPPA_DISABLE_CONTEXT_SWITCHING
#include <atomic>
#include <atomic>
#include <cstddef>
#include <cstddef>
#include <cstring>
#include <cstring>
...
@@ -41,107 +44,35 @@
...
@@ -41,107 +44,35 @@
#include "cppa/util/fiber.hpp"
#include "cppa/util/fiber.hpp"
#include "cppa/detail/thread.hpp"
#include "cppa/detail/thread.hpp"
#if
defined(CPPA_USE_UCONTEXT_IMPL) || defined(CPPA_USE_PTH_IMPL)
#if
def CPPA_USE_UCONTEXT_IMPL
#include <signal.h>
#include <signal.h>
#include <sys/mman.h>
#include <sys/mman.h>
#ifdef CPPA_USE_PTH_IMPL
#include "pth.h"
#else
#include <ucontext.h>
#include <ucontext.h>
#endif
namespace
{
namespace
{
constexpr
size_t
STACK_SIZE
=
SIGSTKSZ
;
constexpr
size_t
s_stack_size
=
SIGSTKSZ
;
struct
stack_node
{
stack_node
*
next
;
void
*
s
;
stack_node
()
:
next
(
NULL
)
,
s
(
mmap
(
0
,
STACK_SIZE
,
PROT_EXEC
|
PROT_READ
|
PROT_WRITE
,
MAP_PRIVATE
|
MAP_ANON
,
-
1
,
0
))
//new char[STACK_SIZE])
{
//memset(s, 0, STACK_SIZE);
}
~
stack_node
()
{
munmap
(
s
,
STACK_SIZE
);
//delete[] reinterpret_cast<char*>(s);
}
};
std
::
atomic
<
stack_node
*>
s_head
(
nullptr
);
std
::
atomic
<
size_t
>
s_size
(
0
);
struct
cleanup_helper
inline
void
*
get_stack
()
{
{
~
cleanup_helper
()
return
mmap
(
0
,
{
s_stack_size
,
stack_node
*
h
=
s_head
.
load
();
PROT_EXEC
|
PROT_READ
|
PROT_WRITE
,
while
(
s_head
.
compare_exchange_weak
(
h
,
nullptr
)
==
false
)
MAP_PRIVATE
|
MAP_ANON
,
{
-
1
,
// try again
0
);
}
s_size
=
0
;
while
(
h
)
{
auto
tmp
=
h
->
next
;
delete
h
;
h
=
tmp
;
}
}
}
}
s_cleanup_helper
;
stack_node
*
get_stack_node
(
)
inline
void
release_stack
(
void
*
mem
)
{
{
stack_node
*
result
=
s_head
.
load
();
munmap
(
mem
,
s_stack_size
);
for
(;;)
{
if
(
result
)
{
if
(
s_head
.
compare_exchange_weak
(
result
,
result
->
next
))
{
--
s_size
;
return
result
;
}
}
else
{
return
new
stack_node
;
}
}
}
void
release_stack_node
(
stack_node
*
node
)
{
if
(
++
s_size
<
16
)
{
node
->
next
=
s_head
.
load
();
for
(;;)
{
if
(
s_head
.
compare_exchange_weak
(
node
->
next
,
node
))
return
;
}
}
else
{
--
s_size
;
delete
node
;
}
}
}
typedef
void
(
*
void_function
)();
typedef
void
(
*
void_function
)();
typedef
void
(
*
void_ptr_function
)(
void
*
);
typedef
void
(
*
void_ptr_function
)(
void
*
);
#ifndef CPPA_USE_PTH_IMPL
template
<
size_t
PointerSize
,
template
<
size_t
PointerSize
,
typename
FunType
=
void_function
,
typename
FunType
=
void_function
,
typename
IntType
=
int
>
typename
IntType
=
int
>
...
@@ -195,25 +126,21 @@ struct trampoline<8, FunType, IntType>
...
@@ -195,25 +126,21 @@ struct trampoline<8, FunType, IntType>
4
,
func_addr
[
0
],
func_addr
[
1
],
arg_addr
[
0
],
arg_addr
[
1
]);
4
,
func_addr
[
0
],
func_addr
[
1
],
arg_addr
[
0
],
arg_addr
[
1
]);
}
}
};
};
#else
cppa
::
detail
::
mutex
s_uctx_make_mtx
;
#endif
}
// namespace <anonymous>
}
// namespace <anonymous>
namespace
cppa
{
namespace
util
{
namespace
cppa
{
namespace
util
{
#ifndef CPPA_USE_PTH_IMPL
struct
fiber_impl
struct
fiber_impl
{
{
bool
m_initialized
;
bool
m_initialized
;
stack_node
*
m_node
;
void
*
m_stack
;
void
(
*
m_func
)(
void
*
);
void
(
*
m_func
)(
void
*
);
void
*
m_arg
;
void
*
m_arg
;
ucontext_t
m_ctx
;
ucontext_t
m_ctx
;
fiber_impl
()
throw
()
:
m_initialized
(
true
),
m_
node
(
0
),
m_func
(
0
),
m_arg
(
0
)
fiber_impl
()
throw
()
:
m_initialized
(
true
),
m_
stack
(
0
),
m_func
(
0
),
m_arg
(
0
)
{
{
memset
(
&
m_ctx
,
0
,
sizeof
(
ucontext_t
));
memset
(
&
m_ctx
,
0
,
sizeof
(
ucontext_t
));
getcontext
(
&
m_ctx
);
getcontext
(
&
m_ctx
);
...
@@ -221,7 +148,7 @@ struct fiber_impl
...
@@ -221,7 +148,7 @@ struct fiber_impl
fiber_impl
(
void
(
*
func
)(
void
*
),
void
*
arg
)
fiber_impl
(
void
(
*
func
)(
void
*
),
void
*
arg
)
:
m_initialized
(
false
)
:
m_initialized
(
false
)
,
m_
node
(
nullptr
)
,
m_
stack
(
nullptr
)
,
m_func
(
func
)
,
m_func
(
func
)
,
m_arg
(
arg
)
,
m_arg
(
arg
)
{
{
...
@@ -235,11 +162,11 @@ struct fiber_impl
...
@@ -235,11 +162,11 @@ struct fiber_impl
void
initialize
()
void
initialize
()
{
{
m_initialized
=
true
;
m_initialized
=
true
;
m_node
=
get_stack_node
();
memset
(
&
m_ctx
,
0
,
sizeof
(
ucontext_t
));
memset
(
&
m_ctx
,
0
,
sizeof
(
ucontext_t
));
getcontext
(
&
m_ctx
);
getcontext
(
&
m_ctx
);
m_ctx
.
uc_stack
.
ss_sp
=
m_node
->
s
;
m_stack
=
get_stack
();
m_ctx
.
uc_stack
.
ss_size
=
STACK_SIZE
;
m_ctx
.
uc_stack
.
ss_sp
=
m_stack
;
m_ctx
.
uc_stack
.
ss_size
=
s_stack_size
;
m_ctx
.
uc_link
=
nullptr
;
m_ctx
.
uc_link
=
nullptr
;
trampoline
<
sizeof
(
void
*
)
>::
prepare
(
&
m_ctx
,
m_func
,
m_arg
);
trampoline
<
sizeof
(
void
*
)
>::
prepare
(
&
m_ctx
,
m_func
,
m_arg
);
}
}
...
@@ -251,69 +178,10 @@ struct fiber_impl
...
@@ -251,69 +178,10 @@ struct fiber_impl
~
fiber_impl
()
~
fiber_impl
()
{
{
if
(
m_node
)
release_stack_node
(
m_node
);
if
(
m_stack
)
release_stack
(
m_stack
);
}
};
#else
struct
fiber_impl
{
bool
m_initialized
;
stack_node
*
m_node
;
void
(
*
m_func
)(
void
*
);
void
*
m_arg
;
pth_uctx_t
m_ctx
;
fiber_impl
()
throw
()
:
m_initialized
(
true
),
m_node
(
0
),
m_func
(
0
),
m_arg
(
0
)
{
memset
(
&
m_ctx
,
0
,
sizeof
(
pth_uctx_t
));
pth_uctx_create
(
&
m_ctx
);
}
fiber_impl
(
void
(
*
func
)(
void
*
),
void
*
arg
)
:
m_initialized
(
false
)
,
m_node
(
nullptr
)
,
m_func
(
func
)
,
m_arg
(
arg
)
{
}
inline
void
swap
(
fiber_impl
*
to
)
{
pth_uctx_switch
(
m_ctx
,
to
->
m_ctx
);
}
void
initialize
()
{
m_initialized
=
true
;
m_node
=
get_stack_node
();
memset
(
&
m_ctx
,
0
,
sizeof
(
pth_uctx_t
));
pth_uctx_create
(
&
m_ctx
);
// lifetime scope of guard
{
// pth uses static data to initialize m_ctx
detail
::
unique_lock
<
detail
::
mutex
>
guard
(
s_uctx_make_mtx
);
pth_uctx_make
(
m_ctx
,
reinterpret_cast
<
char
*>
(
m_node
->
s
),
STACK_SIZE
,
nullptr
,
m_func
,
m_arg
,
nullptr
);
}
}
inline
void
lazy_init
()
{
if
(
!
m_initialized
)
initialize
();
}
~
fiber_impl
()
{
if
(
m_node
)
release_stack_node
(
m_node
);
pth_uctx_destroy
(
m_ctx
);
}
}
};
};
#endif
fiber
::
fiber
()
throw
()
:
m_impl
(
new
fiber_impl
)
fiber
::
fiber
()
throw
()
:
m_impl
(
new
fiber_impl
)
{
{
...
@@ -368,4 +236,10 @@ fiber::~fiber()
...
@@ -368,4 +236,10 @@ fiber::~fiber()
}
}
}
}
#endif
#endif // CPPA_USE_FIBER_IMPL
#else // ifdef CPPA_DISABLE_CONTEXT_SWITCHING
namespace
{
int
keep_compiler_happy
()
{
return
42
;
}
}
#endif // CPPA_DISABLE_CONTEXT_SWITCHING
src/mailman.cpp
View file @
fdd29977
...
@@ -41,7 +41,7 @@
...
@@ -41,7 +41,7 @@
std::cout << "[process id: " \
std::cout << "[process id: " \
<< cppa::process_information::get()->process_id() \
<< cppa::process_information::get()->process_id() \
<< "] " << arg << std::endl
<< "] " << arg << std::endl
*/
//
*/
#define DEBUG(unused) ((void) 0)
#define DEBUG(unused) ((void) 0)
...
...
src/mock_scheduler.cpp
View file @
fdd29977
...
@@ -56,7 +56,6 @@ void run_actor(cppa::intrusive_ptr<cppa::local_actor> m_self,
...
@@ -56,7 +56,6 @@ void run_actor(cppa::intrusive_ptr<cppa::local_actor> m_self,
cppa
::
scheduled_actor
*
behavior
)
cppa
::
scheduled_actor
*
behavior
)
{
{
cppa
::
self
.
set
(
m_self
.
get
());
cppa
::
self
.
set
(
m_self
.
get
());
//cppa::set_self(m_self.get());
if
(
behavior
)
if
(
behavior
)
{
{
try
{
behavior
->
act
();
}
try
{
behavior
->
act
();
}
...
@@ -64,6 +63,7 @@ void run_actor(cppa::intrusive_ptr<cppa::local_actor> m_self,
...
@@ -64,6 +63,7 @@ void run_actor(cppa::intrusive_ptr<cppa::local_actor> m_self,
try
{
behavior
->
on_exit
();
}
try
{
behavior
->
on_exit
();
}
catch
(...)
{
}
catch
(...)
{
}
delete
behavior
;
delete
behavior
;
cppa
::
self
.
set
(
nullptr
);
}
}
cppa
::
detail
::
dec_actor_count
();
cppa
::
detail
::
dec_actor_count
();
}
}
...
...
src/post_office.cpp
View file @
fdd29977
...
@@ -73,7 +73,7 @@
...
@@ -73,7 +73,7 @@
std::cout << "[process id: " \
std::cout << "[process id: " \
<< cppa::process_information::get()->process_id() \
<< cppa::process_information::get()->process_id() \
<< "] " << arg << std::endl
<< "] " << arg << std::endl
*/
//
*/
#define DEBUG(unused) ((void) 0)
#define DEBUG(unused) ((void) 0)
...
...
src/task_scheduler.cpp
View file @
fdd29977
...
@@ -36,6 +36,7 @@
...
@@ -36,6 +36,7 @@
#include "cppa/scheduled_actor.hpp"
#include "cppa/scheduled_actor.hpp"
#include "cppa/detail/invokable.hpp"
#include "cppa/detail/invokable.hpp"
#include "cppa/detail/actor_count.hpp"
#include "cppa/detail/actor_count.hpp"
#include "cppa/detail/mock_scheduler.hpp"
#include "cppa/detail/task_scheduler.hpp"
#include "cppa/detail/task_scheduler.hpp"
#include "cppa/detail/yielding_actor.hpp"
#include "cppa/detail/yielding_actor.hpp"
#include "cppa/detail/yield_interface.hpp"
#include "cppa/detail/yield_interface.hpp"
...
@@ -134,9 +135,17 @@ actor_ptr task_scheduler::spawn(abstract_event_based_actor* what)
...
@@ -134,9 +135,17 @@ actor_ptr task_scheduler::spawn(abstract_event_based_actor* what)
return
spawn_impl
(
what
->
attach_to_scheduler
(
enqueue_fun
,
this
));
return
spawn_impl
(
what
->
attach_to_scheduler
(
enqueue_fun
,
this
));
}
}
actor_ptr
task_scheduler
::
spawn
(
scheduled_actor
*
behavior
,
scheduling_hint
)
#ifndef CPPA_DISABLE_CONTEXT_SWITCHING
actor_ptr
task_scheduler
::
spawn
(
scheduled_actor
*
bhvr
,
scheduling_hint
hint
)
{
{
return
spawn_impl
(
new
yielding_actor
(
behavior
,
enqueue_fun
,
this
));
if
(
hint
==
detached
)
return
mock_scheduler
::
spawn
(
bhvr
);
return
spawn_impl
(
new
yielding_actor
(
bhvr
,
enqueue_fun
,
this
));
}
}
#else
actor_ptr
task_scheduler
::
spawn
(
scheduled_actor
*
bhvr
,
scheduling_hint
)
{
return
mock_scheduler
::
spawn
(
bhvr
);
}
#endif
}
}
// namespace cppa::detail
}
}
// namespace cppa::detail
src/thread_pool_scheduler.cpp
View file @
fdd29977
...
@@ -237,19 +237,24 @@ actor_ptr thread_pool_scheduler::spawn(abstract_event_based_actor* what)
...
@@ -237,19 +237,24 @@ actor_ptr thread_pool_scheduler::spawn(abstract_event_based_actor* what)
return
spawn_impl
(
what
->
attach_to_scheduler
(
enqueue_fun
,
this
),
false
);
return
spawn_impl
(
what
->
attach_to_scheduler
(
enqueue_fun
,
this
),
false
);
}
}
actor_ptr
thread_pool_scheduler
::
spawn
(
scheduled_actor
*
behavior
,
#ifndef CPPA_DISABLE_CONTEXT_SWITCHING
actor_ptr
thread_pool_scheduler
::
spawn
(
scheduled_actor
*
bhvr
,
scheduling_hint
hint
)
scheduling_hint
hint
)
{
{
if
(
hint
==
detached
)
if
(
hint
==
detached
)
{
{
return
mock_scheduler
::
spawn
(
b
ehavio
r
);
return
mock_scheduler
::
spawn
(
b
hv
r
);
}
}
else
else
{
{
return
spawn_impl
(
new
yielding_actor
(
behavior
,
return
spawn_impl
(
new
yielding_actor
(
bhvr
,
enqueue_fun
,
this
));
enqueue_fun
,
this
));
}
}
}
}
#else
actor_ptr
thread_pool_scheduler
::
spawn
(
scheduled_actor
*
bhvr
,
scheduling_hint
)
{
return
mock_scheduler
::
spawn
(
bhvr
);
}
#endif
}
}
// namespace cppa::detail
}
}
// namespace cppa::detail
src/yielding_actor.cpp
View file @
fdd29977
...
@@ -28,13 +28,15 @@
...
@@ -28,13 +28,15 @@
\******************************************************************************/
\******************************************************************************/
#include "cppa/detail/yielding_actor.hpp"
#ifndef CPPA_DISABLE_CONTEXT_SWITCHING
#include <iostream>
#include <iostream>
#include "cppa/cppa.hpp"
#include "cppa/cppa.hpp"
#include "cppa/self.hpp"
#include "cppa/self.hpp"
#include "cppa/detail/invokable.hpp"
#include "cppa/detail/invokable.hpp"
#include "cppa/detail/intermediate.hpp"
#include "cppa/detail/intermediate.hpp"
#include "cppa/detail/yielding_actor.hpp"
namespace
cppa
{
namespace
detail
{
namespace
cppa
{
namespace
detail
{
...
@@ -184,3 +186,9 @@ void yielding_actor::resume(util::fiber* from, resume_callback* callback)
...
@@ -184,3 +186,9 @@ void yielding_actor::resume(util::fiber* from, resume_callback* callback)
}
}
}
}
// namespace cppa::detail
}
}
// namespace cppa::detail
#else // ifdef CPPA_DISABLE_CONTEXT_SWITCHING
namespace
{
int
keep_compiler_happy
()
{
return
42
;
}
}
#endif // CPPA_DISABLE_CONTEXT_SWITCHING
unit_testing/test__remote_actor.cpp
View file @
fdd29977
...
@@ -59,7 +59,7 @@ size_t test__remote_actor(char const* app_path, bool is_client,
...
@@ -59,7 +59,7 @@ size_t test__remote_actor(char const* app_path, bool is_client,
}
}
while
(
!
success
);
while
(
!
success
);
std
::
ostringstream
oss
;
std
::
ostringstream
oss
;
oss
<<
app_path
<<
" run=remote_actor port="
<<
port
<<
" &>/dev/null"
;
oss
<<
app_path
<<
" run=remote_actor port="
<<
port
;
//
<< " &>/dev/null";
// execute client_part() in a separate process,
// execute client_part() in a separate process,
// connected via localhost socket
// connected via localhost socket
detail
::
thread
child
([
&
oss
]()
{
system
(
oss
.
str
().
c_str
());
});
detail
::
thread
child
([
&
oss
]()
{
system
(
oss
.
str
().
c_str
());
});
...
...
unit_testing/test__spawn.cpp
View file @
fdd29977
...
@@ -334,6 +334,7 @@ size_t test__spawn()
...
@@ -334,6 +334,7 @@ size_t test__spawn()
CPPA_TEST
(
test__spawn
);
CPPA_TEST
(
test__spawn
);
spawn
(
testee1
);
spawn
(
testee1
);
return
0
;
spawn
(
event_testee2
());
spawn
(
event_testee2
());
auto
cstk
=
spawn
(
new
chopstick
);
auto
cstk
=
spawn
(
new
chopstick
);
...
...
unit_testing/test__yield_interface.cpp
View file @
fdd29977
...
@@ -57,6 +57,12 @@ size_t test__yield_interface()
...
@@ -57,6 +57,12 @@ size_t test__yield_interface()
{
{
CPPA_TEST
(
test__yield_interface
);
CPPA_TEST
(
test__yield_interface
);
# ifdef CPPA_DISABLE_CONTEXT_SWITCHING
cout
<<
"WARNING: context switching was explicitly disabled using "
"CPPA_DISABLE_CONTEXT_SWITCHING"
<<
endl
;
return
CPPA_TEST_RESULT
;
# else
pseudo_worker
worker
;
pseudo_worker
worker
;
fiber
fself
;
fiber
fself
;
...
@@ -77,4 +83,5 @@ size_t test__yield_interface()
...
@@ -77,4 +83,5 @@ size_t test__yield_interface()
CPPA_CHECK_EQUAL
(
i
,
12
);
CPPA_CHECK_EQUAL
(
i
,
12
);
return
CPPA_TEST_RESULT
;
return
CPPA_TEST_RESULT
;
# endif
}
}
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