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
55f9f4d3
Commit
55f9f4d3
authored
Apr 16, 2012
by
neverlord
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
maintenance (removed delegate, streamlined scheduling interface)
parent
46d6207a
Changes
16
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
84 additions
and
213 deletions
+84
-213
Makefile.am
Makefile.am
+0
-2
benchmarks/mixed_case.cpp
benchmarks/mixed_case.cpp
+4
-17
cppa.files
cppa.files
+0
-2
cppa/abstract_event_based_actor.hpp
cppa/abstract_event_based_actor.hpp
+7
-9
cppa/detail/abstract_scheduled_actor.hpp
cppa/detail/abstract_scheduled_actor.hpp
+5
-18
cppa/detail/converted_thread_context.hpp
cppa/detail/converted_thread_context.hpp
+5
-5
cppa/detail/delegate.hpp
cppa/detail/delegate.hpp
+0
-69
cppa/detail/mock_scheduler.hpp
cppa/detail/mock_scheduler.hpp
+2
-0
cppa/detail/thread_pool_scheduler.hpp
cppa/detail/thread_pool_scheduler.hpp
+5
-5
cppa/detail/yielding_actor.hpp
cppa/detail/yielding_actor.hpp
+5
-14
cppa/scheduler.hpp
cppa/scheduler.hpp
+7
-3
src/abstract_scheduled_actor.cpp
src/abstract_scheduled_actor.cpp
+15
-8
src/delegate.cpp
src/delegate.cpp
+0
-40
src/mock_scheduler.cpp
src/mock_scheduler.cpp
+8
-0
src/thread_pool_scheduler.cpp
src/thread_pool_scheduler.cpp
+14
-17
src/yielding_actor.cpp
src/yielding_actor.cpp
+7
-4
No files found.
Makefile.am
View file @
55f9f4d3
...
@@ -20,7 +20,6 @@ libcppa_la_SOURCES = \
...
@@ -20,7 +20,6 @@ libcppa_la_SOURCES = \
src/channel.cpp
\
src/channel.cpp
\
src/converted_thread_context.cpp
\
src/converted_thread_context.cpp
\
src/cppa.cpp
\
src/cppa.cpp
\
src/delegate.cpp
\
src/demangle.cpp
\
src/demangle.cpp
\
src/deserializer.cpp
\
src/deserializer.cpp
\
src/duration.cpp
\
src/duration.cpp
\
...
@@ -100,7 +99,6 @@ nobase_library_include_HEADERS = \
...
@@ -100,7 +99,6 @@ nobase_library_include_HEADERS = \
cppa/detail/converted_thread_context.hpp
\
cppa/detail/converted_thread_context.hpp
\
cppa/detail/decorated_tuple.hpp
\
cppa/detail/decorated_tuple.hpp
\
cppa/detail/default_uniform_type_info_impl.hpp
\
cppa/detail/default_uniform_type_info_impl.hpp
\
cppa/detail/delegate.hpp
\
cppa/detail/demangle.hpp
\
cppa/detail/demangle.hpp
\
cppa/detail/disablable_delete.hpp
\
cppa/detail/disablable_delete.hpp
\
cppa/detail/empty_tuple.hpp
\
cppa/detail/empty_tuple.hpp
\
...
...
benchmarks/mixed_case.cpp
View file @
55f9f4d3
...
@@ -55,7 +55,6 @@ struct pool_job
...
@@ -55,7 +55,6 @@ struct pool_job
{
{
abstract_event_based_actor
*
job
;
abstract_event_based_actor
*
job
;
handler
(
abstract_event_based_actor
*
mjob
)
:
job
(
mjob
)
{
}
handler
(
abstract_event_based_actor
*
mjob
)
:
job
(
mjob
)
{
}
bool
still_ready
()
{
return
true
;
}
void
exec_done
()
void
exec_done
()
{
{
if
(
!
job
->
deref
())
delete
job
;
if
(
!
job
->
deref
())
delete
job
;
...
@@ -67,11 +66,6 @@ struct pool_job
...
@@ -67,11 +66,6 @@ struct pool_job
}
}
};
};
class
boost_threadpool_scheduler
;
void
enqueue_to_bts
(
boost_threadpool_scheduler
*
where
,
abstract_scheduled_actor
*
what
);
class
boost_threadpool_scheduler
:
public
scheduler
class
boost_threadpool_scheduler
:
public
scheduler
{
{
...
@@ -80,17 +74,16 @@ class boost_threadpool_scheduler : public scheduler
...
@@ -80,17 +74,16 @@ class boost_threadpool_scheduler : public scheduler
public:
public:
void
start
()
/*override*/
void
start
()
{
{
m_pool
.
size_controller
().
resize
(
std
::
max
(
num_cores
(),
4
));
m_pool
.
size_controller
().
resize
(
std
::
max
(
num_cores
(),
4
));
}
}
void
stop
()
/*override*/
void
stop
()
{
{
m_pool
.
wait
();
m_pool
.
wait
();
}
}
void
enqueue
(
abstract_scheduled_actor
*
what
)
void
schedule
(
abstract_scheduled_actor
*
what
)
/*override*/
{
{
auto
job
=
static_cast
<
abstract_event_based_actor
*>
(
what
);
auto
job
=
static_cast
<
abstract_event_based_actor
*>
(
what
);
boost
::
threadpool
::
schedule
(
m_pool
,
pool_job
{
job
});
boost
::
threadpool
::
schedule
(
m_pool
,
pool_job
{
job
});
...
@@ -98,7 +91,7 @@ class boost_threadpool_scheduler : public scheduler
...
@@ -98,7 +91,7 @@ class boost_threadpool_scheduler : public scheduler
actor_ptr
spawn
(
abstract_event_based_actor
*
what
)
actor_ptr
spawn
(
abstract_event_based_actor
*
what
)
{
{
what
->
attach_to_scheduler
(
enqueue_to_bts
,
this
);
what
->
attach_to_scheduler
(
this
);
inc_actor_count
();
inc_actor_count
();
CPPA_MEMORY_BARRIER
();
CPPA_MEMORY_BARRIER
();
intrusive_ptr
<
abstract_event_based_actor
>
ctx
(
what
);
intrusive_ptr
<
abstract_event_based_actor
>
ctx
(
what
);
...
@@ -113,12 +106,6 @@ class boost_threadpool_scheduler : public scheduler
...
@@ -113,12 +106,6 @@ class boost_threadpool_scheduler : public scheduler
};
};
void
enqueue_to_bts
(
boost_threadpool_scheduler
*
where
,
abstract_scheduled_actor
*
what
)
{
where
->
schedule
(
what
);
}
}
}
// namespace cppa::detail
}
}
// namespace cppa::detail
using
std
::
cout
;
using
std
::
cout
;
...
...
cppa.files
View file @
55f9f4d3
...
@@ -154,8 +154,6 @@ src/abstract_scheduled_actor.cpp
...
@@ -154,8 +154,6 @@ src/abstract_scheduled_actor.cpp
src/invokable.cpp
src/invokable.cpp
cppa/detail/thread_pool_scheduler.hpp
cppa/detail/thread_pool_scheduler.hpp
src/thread_pool_scheduler.cpp
src/thread_pool_scheduler.cpp
cppa/detail/delegate.hpp
src/delegate.cpp
cppa/detail/receive_loop_helper.hpp
cppa/detail/receive_loop_helper.hpp
cppa/util/wrapped.hpp
cppa/util/wrapped.hpp
cppa/detail/boxed.hpp
cppa/detail/boxed.hpp
...
...
cppa/abstract_event_based_actor.hpp
View file @
55f9f4d3
...
@@ -55,11 +55,11 @@ class abstract_event_based_actor : public detail::abstract_scheduled_actor
...
@@ -55,11 +55,11 @@ class abstract_event_based_actor : public detail::abstract_scheduled_actor
public:
public:
void
dequeue
(
behavior
&
)
/*override*/
;
void
dequeue
(
behavior
&
)
;
//override
void
dequeue
(
partial_function
&
)
/*override*/
;
void
dequeue
(
partial_function
&
)
;
//override
void
resume
(
util
::
fiber
*
,
resume_callback
*
callback
)
/*override*/
;
void
resume
(
util
::
fiber
*
,
resume_callback
*
callback
)
;
//override
/**
/**
* @brief Initializes the actor by defining an initial behavior.
* @brief Initializes the actor by defining an initial behavior.
...
@@ -71,13 +71,11 @@ class abstract_event_based_actor : public detail::abstract_scheduled_actor
...
@@ -71,13 +71,11 @@ class abstract_event_based_actor : public detail::abstract_scheduled_actor
*/
*/
virtual
void
on_exit
();
virtual
void
on_exit
();
template
<
typename
Scheduler
>
inline
abstract_event_based_actor
*
attach_to_scheduler
(
scheduler
*
sched
)
abstract_event_based_actor
*
attach_to_scheduler
(
void
(
*
enq_fun
)(
Scheduler
*
,
abstract_scheduled_actor
*
),
Scheduler
*
sched
)
{
{
m_enqueue_to_scheduler
.
reset
(
enq_fun
,
sched
,
this
);
CPPA_REQUIRE
(
sched
!=
nullptr
);
this
->
init
();
m_scheduler
=
sched
;
init
();
return
this
;
return
this
;
}
}
...
...
cppa/detail/abstract_scheduled_actor.hpp
View file @
55f9f4d3
...
@@ -31,16 +31,17 @@
...
@@ -31,16 +31,17 @@
#ifndef SCHEDULED_ACTOR_HPP
#ifndef SCHEDULED_ACTOR_HPP
#define SCHEDULED_ACTOR_HPP
#define SCHEDULED_ACTOR_HPP
#include "cppa/scheduler.hpp"
#include "cppa/local_actor.hpp"
#include "cppa/local_actor.hpp"
#include "cppa/scheduled_actor.hpp"
#include "cppa/abstract_actor.hpp"
#include "cppa/abstract_actor.hpp"
#include "cppa/scheduled_actor.hpp"
#include "cppa/util/fiber.hpp"
#include "cppa/util/fiber.hpp"
#include "cppa/intrusive/singly_linked_list.hpp"
#include "cppa/intrusive/singly_linked_list.hpp"
#include "cppa/intrusive/single_reader_queue.hpp"
#include "cppa/intrusive/single_reader_queue.hpp"
#include "cppa/detail/delegate.hpp"
namespace
cppa
{
class
scheduler
;
}
namespace
cppa
{
namespace
detail
{
namespace
cppa
{
namespace
detail
{
...
@@ -57,7 +58,7 @@ class abstract_scheduled_actor : public abstract_actor<local_actor>
...
@@ -57,7 +58,7 @@ class abstract_scheduled_actor : public abstract_actor<local_actor>
protected:
protected:
std
::
atomic
<
int
>
m_state
;
std
::
atomic
<
int
>
m_state
;
delegate
m_enqueue_to
_scheduler
;
scheduler
*
m
_scheduler
;
typedef
abstract_actor
super
;
typedef
abstract_actor
super
;
typedef
super
::
queue_node_guard
queue_node_guard
;
typedef
super
::
queue_node_guard
queue_node_guard
;
...
@@ -113,17 +114,7 @@ class abstract_scheduled_actor : public abstract_actor<local_actor>
...
@@ -113,17 +114,7 @@ class abstract_scheduled_actor : public abstract_actor<local_actor>
abstract_scheduled_actor
(
int
state
=
done
);
abstract_scheduled_actor
(
int
state
=
done
);
template
<
typename
Scheduler
>
abstract_scheduled_actor
(
scheduler
*
sched
);
abstract_scheduled_actor
(
void
(
*
enqueue_fun
)(
Scheduler
*
,
abstract_scheduled_actor
*
),
Scheduler
*
sched
)
:
next
(
nullptr
)
,
m_state
(
ready
)
,
m_enqueue_to_scheduler
(
enqueue_fun
,
sched
,
this
)
,
m_has_pending_timeout_request
(
false
)
,
m_active_timeout_id
(
0
)
{
}
void
quit
(
std
::
uint32_t
reason
);
void
quit
(
std
::
uint32_t
reason
);
...
@@ -136,10 +127,6 @@ class abstract_scheduled_actor : public abstract_actor<local_actor>
...
@@ -136,10 +127,6 @@ class abstract_scheduled_actor : public abstract_actor<local_actor>
struct
resume_callback
struct
resume_callback
{
{
virtual
~
resume_callback
();
virtual
~
resume_callback
();
// actor could continue computation
// - if false: actor interrupts
// - if true: actor continues
virtual
bool
still_ready
()
=
0
;
// called if an actor finished execution
// called if an actor finished execution
virtual
void
exec_done
()
=
0
;
virtual
void
exec_done
()
=
0
;
};
};
...
...
cppa/detail/converted_thread_context.hpp
View file @
55f9f4d3
...
@@ -69,15 +69,15 @@ class converted_thread_context : public abstract_actor<local_actor>
...
@@ -69,15 +69,15 @@ class converted_thread_context : public abstract_actor<local_actor>
// called if the converted thread finished execution
// called if the converted thread finished execution
void
cleanup
(
std
::
uint32_t
reason
=
exit_reason
::
normal
);
void
cleanup
(
std
::
uint32_t
reason
=
exit_reason
::
normal
);
void
quit
(
std
::
uint32_t
reason
)
/*override*/
;
void
quit
(
std
::
uint32_t
reason
)
;
//override
void
enqueue
(
actor
*
sender
,
any_tuple
&&
msg
)
/*override*/
;
void
enqueue
(
actor
*
sender
,
any_tuple
&&
msg
)
;
//override
void
enqueue
(
actor
*
sender
,
any_tuple
const
&
msg
)
/*override*/
;
void
enqueue
(
actor
*
sender
,
any_tuple
const
&
msg
)
;
//override
void
dequeue
(
behavior
&
rules
)
/*override*/
;
void
dequeue
(
behavior
&
rules
)
;
//override
void
dequeue
(
partial_function
&
rules
)
/*override*/
;
void
dequeue
(
partial_function
&
rules
)
;
//override
inline
decltype
(
m_mailbox
)
&
mailbox
()
inline
decltype
(
m_mailbox
)
&
mailbox
()
{
{
...
...
cppa/detail/delegate.hpp
deleted
100644 → 0
View file @
46d6207a
/******************************************************************************\
* ___ __ *
* /\_ \ __/\ \ *
* \//\ \ /\_\ \ \____ ___ _____ _____ __ *
* \ \ \ \/\ \ \ '__`\ /'___\/\ '__`\/\ '__`\ /'__`\ *
* \_\ \_\ \ \ \ \L\ \/\ \__/\ \ \L\ \ \ \L\ \/\ \L\.\_ *
* /\____\\ \_\ \_,__/\ \____\\ \ ,__/\ \ ,__/\ \__/.\_\ *
* \/____/ \/_/\/___/ \/____/ \ \ \/ \ \ \/ \/__/\/_/ *
* \ \_\ \ \_\ *
* \/_/ \/_/ *
* *
* Copyright (C) 2011, 2012 *
* Dominik Charousset <dominik.charousset@haw-hamburg.de> *
* *
* This file is part of libcppa. *
* libcppa is free software: you can redistribute it and/or modify it under *
* the terms of the GNU Lesser General Public License as published by the *
* Free Software Foundation, either version 3 of the License *
* or (at your option) any later version. *
* *
* libcppa is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with libcppa. If not, see <http://www.gnu.org/licenses/>. *
\******************************************************************************/
#ifndef DELEGATE_HPP
#define DELEGATE_HPP
namespace
cppa
{
namespace
detail
{
class
delegate
{
typedef
void
(
*
void_fun
)(
void
*
,
void
*
);
void_fun
m_fun
;
void
*
m_arg1
;
void
*
m_arg2
;
public:
template
<
typename
Arg1
,
typename
Arg2
,
typename
Function
>
delegate
(
Function
*
fun
,
Arg1
*
a1
,
Arg2
*
a2
)
:
m_fun
(
reinterpret_cast
<
void_fun
>
(
fun
))
,
m_arg1
(
reinterpret_cast
<
void
*>
(
a1
))
,
m_arg2
(
reinterpret_cast
<
void
*>
(
a2
))
{
}
template
<
typename
Arg1
,
typename
Arg2
,
typename
Function
>
void
reset
(
Function
*
fun
,
Arg1
*
a1
,
Arg2
*
a2
)
{
m_fun
=
reinterpret_cast
<
void_fun
>
(
fun
);
m_arg1
=
reinterpret_cast
<
void
*>
(
a1
);
m_arg2
=
reinterpret_cast
<
void
*>
(
a2
);
}
void
operator
()();
};
}
}
// namespace cppa::detail
#endif // DELEGATE_HPP
cppa/detail/mock_scheduler.hpp
View file @
55f9f4d3
...
@@ -46,6 +46,8 @@ class mock_scheduler : public scheduler
...
@@ -46,6 +46,8 @@ class mock_scheduler : public scheduler
static
actor_ptr
spawn
(
scheduled_actor
*
);
static
actor_ptr
spawn
(
scheduled_actor
*
);
void
enqueue
(
detail
::
abstract_scheduled_actor
*
);
};
};
}
}
// namespace cppa::detail
}
}
// namespace cppa::detail
...
...
cppa/detail/thread_pool_scheduler.hpp
View file @
55f9f4d3
...
@@ -47,15 +47,15 @@ class thread_pool_scheduler : public scheduler
...
@@ -47,15 +47,15 @@ class thread_pool_scheduler : public scheduler
struct
worker
;
struct
worker
;
void
start
()
/*override*/
;
void
start
()
;
// override
void
stop
()
/*override*/
;
void
stop
()
;
// override
void
schedule
(
abstract_scheduled_actor
*
what
)
/*override*/
;
void
enqueue
(
abstract_scheduled_actor
*
what
);
// override
actor_ptr
spawn
(
abstract_event_based_actor
*
what
);
actor_ptr
spawn
(
abstract_event_based_actor
*
what
);
//override
actor_ptr
spawn
(
scheduled_actor
*
behavior
,
scheduling_hint
hint
);
actor_ptr
spawn
(
scheduled_actor
*
behavior
,
scheduling_hint
hint
);
//override
private:
private:
...
...
cppa/detail/yielding_actor.hpp
View file @
55f9f4d3
...
@@ -40,7 +40,6 @@
...
@@ -40,7 +40,6 @@
#include "cppa/either.hpp"
#include "cppa/either.hpp"
#include "cppa/pattern.hpp"
#include "cppa/pattern.hpp"
#include "cppa/detail/delegate.hpp"
#include "cppa/detail/yield_interface.hpp"
#include "cppa/detail/yield_interface.hpp"
#include "cppa/detail/abstract_scheduled_actor.hpp"
#include "cppa/detail/abstract_scheduled_actor.hpp"
...
@@ -64,23 +63,15 @@ class yielding_actor : public abstract_scheduled_actor
...
@@ -64,23 +63,15 @@ class yielding_actor : public abstract_scheduled_actor
public:
public:
template
<
typename
Scheduler
>
yielding_actor
(
scheduled_actor
*
behavior
,
scheduler
*
sched
);
yielding_actor
(
scheduled_actor
*
behavior
,
void
(
*
enqueue_fun
)(
Scheduler
*
,
abstract_scheduled_actor
*
),
Scheduler
*
sched
)
:
super
(
enqueue_fun
,
sched
)
,
m_fiber
(
&
yielding_actor
::
run
,
this
)
,
m_behavior
(
behavior
)
{
}
~
yielding_actor
()
/*override*/
;
~
yielding_actor
()
;
//override
void
dequeue
(
behavior
&
bhvr
)
/*override*/
;
void
dequeue
(
behavior
&
bhvr
)
;
//override
void
dequeue
(
partial_function
&
fun
)
/*override*/
;
void
dequeue
(
partial_function
&
fun
)
;
//override
void
resume
(
util
::
fiber
*
from
,
resume_callback
*
callback
)
/*override*/
;
void
resume
(
util
::
fiber
*
from
,
resume_callback
*
callback
)
;
//override
};
};
...
...
cppa/scheduler.hpp
View file @
55f9f4d3
...
@@ -37,20 +37,22 @@
...
@@ -37,20 +37,22 @@
#include "cppa/self.hpp"
#include "cppa/self.hpp"
#include "cppa/atom.hpp"
#include "cppa/atom.hpp"
#include "cppa/cow_tuple.hpp"
#include "cppa/actor.hpp"
#include "cppa/actor.hpp"
#include "cppa/channel.hpp"
#include "cppa/cow_tuple.hpp"
#include "cppa/attachable.hpp"
#include "cppa/attachable.hpp"
#include "cppa/local_actor.hpp"
#include "cppa/local_actor.hpp"
#include "cppa/scheduling_hint.hpp"
#include "cppa/scheduling_hint.hpp"
#include "cppa/abstract_event_based_actor.hpp"
#include "cppa/util/duration.hpp"
#include "cppa/util/duration.hpp"
namespace
cppa
{
namespace
cppa
{
//class local_actor;
class
scheduled_actor
;
class
scheduled_actor
;
class
scheduler_helper
;
class
scheduler_helper
;
class
abstract_event_based_actor
;
namespace
detail
{
class
abstract_scheduled_actor
;
}
/**
/**
* @brief
* @brief
...
@@ -80,6 +82,8 @@ class scheduler
...
@@ -80,6 +82,8 @@ class scheduler
*/
*/
virtual
void
stop
();
virtual
void
stop
();
virtual
void
enqueue
(
detail
::
abstract_scheduled_actor
*
)
=
0
;
/**
/**
* @brief Spawns a new actor that executes <code>behavior->act()</code>
* @brief Spawns a new actor that executes <code>behavior->act()</code>
* with the scheduling policy @p hint if possible.
* with the scheduling policy @p hint if possible.
...
...
src/abstract_scheduled_actor.cpp
View file @
55f9f4d3
...
@@ -28,19 +28,15 @@
...
@@ -28,19 +28,15 @@
\******************************************************************************/
\******************************************************************************/
#include <iostream>
#include "cppa/cppa.hpp"
#include "cppa/cppa.hpp"
#include "cppa/config.hpp"
#include "cppa/to_string.hpp"
#include "cppa/to_string.hpp"
#include "cppa/exception.hpp"
#include "cppa/exception.hpp"
#include "cppa/scheduler.hpp"
#include "cppa/detail/types_array.hpp"
#include "cppa/detail/types_array.hpp"
#include "cppa/detail/yield_interface.hpp"
#include "cppa/detail/yield_interface.hpp"
#include "cppa/detail/abstract_scheduled_actor.hpp"
#include "cppa/detail/abstract_scheduled_actor.hpp"
using
std
::
cout
;
using
std
::
endl
;
#include <iostream>
namespace
cppa
{
namespace
detail
{
namespace
cppa
{
namespace
detail
{
namespace
{
namespace
{
...
@@ -48,10 +44,20 @@ void dummy_enqueue(void*, abstract_scheduled_actor*) { }
...
@@ -48,10 +44,20 @@ void dummy_enqueue(void*, abstract_scheduled_actor*) { }
types_array
<
atom_value
,
std
::
uint32_t
>
t_atom_ui32_types
;
types_array
<
atom_value
,
std
::
uint32_t
>
t_atom_ui32_types
;
}
}
abstract_scheduled_actor
::
abstract_scheduled_actor
(
scheduler
*
sched
)
:
next
(
nullptr
)
,
m_state
(
ready
)
,
m_scheduler
(
sched
)
,
m_has_pending_timeout_request
(
false
)
,
m_active_timeout_id
(
0
)
{
CPPA_REQUIRE
(
sched
!=
nullptr
);
}
abstract_scheduled_actor
::
abstract_scheduled_actor
(
int
state
)
abstract_scheduled_actor
::
abstract_scheduled_actor
(
int
state
)
:
next
(
nullptr
)
:
next
(
nullptr
)
,
m_state
(
state
)
,
m_state
(
state
)
,
m_
enqueue_to_scheduler
(
dummy_enqueue
,
static_cast
<
void
*>
(
nullptr
),
this
)
,
m_
scheduler
(
nullptr
)
,
m_has_pending_timeout_request
(
false
)
,
m_has_pending_timeout_request
(
false
)
,
m_active_timeout_id
(
0
)
,
m_active_timeout_id
(
0
)
{
{
...
@@ -80,7 +86,8 @@ void abstract_scheduled_actor::enqueue_node(queue_node* node)
...
@@ -80,7 +86,8 @@ void abstract_scheduled_actor::enqueue_node(queue_node* node)
{
{
if
(
m_state
.
compare_exchange_weak
(
state
,
ready
))
if
(
m_state
.
compare_exchange_weak
(
state
,
ready
))
{
{
m_enqueue_to_scheduler
();
CPPA_REQUIRE
(
m_scheduler
!=
nullptr
);
m_scheduler
->
enqueue
(
this
);
return
;
return
;
}
}
break
;
break
;
...
...
src/delegate.cpp
deleted
100644 → 0
View file @
46d6207a
/******************************************************************************\
* ___ __ *
* /\_ \ __/\ \ *
* \//\ \ /\_\ \ \____ ___ _____ _____ __ *
* \ \ \ \/\ \ \ '__`\ /'___\/\ '__`\/\ '__`\ /'__`\ *
* \_\ \_\ \ \ \ \L\ \/\ \__/\ \ \L\ \ \ \L\ \/\ \L\.\_ *
* /\____\\ \_\ \_,__/\ \____\\ \ ,__/\ \ ,__/\ \__/.\_\ *
* \/____/ \/_/\/___/ \/____/ \ \ \/ \ \ \/ \/__/\/_/ *
* \ \_\ \ \_\ *
* \/_/ \/_/ *
* *
* Copyright (C) 2011, 2012 *
* Dominik Charousset <dominik.charousset@haw-hamburg.de> *
* *
* This file is part of libcppa. *
* libcppa is free software: you can redistribute it and/or modify it under *
* the terms of the GNU Lesser General Public License as published by the *
* Free Software Foundation, either version 3 of the License *
* or (at your option) any later version. *
* *
* libcppa is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with libcppa. If not, see <http://www.gnu.org/licenses/>. *
\******************************************************************************/
#include "cppa/detail/delegate.hpp"
namespace
cppa
{
namespace
detail
{
void
delegate
::
operator
()()
{
m_fun
(
m_arg1
,
m_arg2
);
}
}
}
// namespace cppa::detail
src/mock_scheduler.cpp
View file @
55f9f4d3
...
@@ -39,6 +39,7 @@
...
@@ -39,6 +39,7 @@
#include "cppa/attachable.hpp"
#include "cppa/attachable.hpp"
#include "cppa/local_actor.hpp"
#include "cppa/local_actor.hpp"
#include "cppa/scheduled_actor.hpp"
#include "cppa/scheduled_actor.hpp"
#include "cppa/abstract_event_based_actor.hpp"
#include "cppa/detail/thread.hpp"
#include "cppa/detail/thread.hpp"
#include "cppa/detail/actor_count.hpp"
#include "cppa/detail/actor_count.hpp"
...
@@ -47,6 +48,7 @@
...
@@ -47,6 +48,7 @@
#include "cppa/detail/converted_thread_context.hpp"
#include "cppa/detail/converted_thread_context.hpp"
using
std
::
cout
;
using
std
::
cout
;
using
std
::
cerr
;
using
std
::
endl
;
using
std
::
endl
;
namespace
{
namespace
{
...
@@ -92,4 +94,10 @@ actor_ptr mock_scheduler::spawn(scheduled_actor* behavior, scheduling_hint)
...
@@ -92,4 +94,10 @@ actor_ptr mock_scheduler::spawn(scheduled_actor* behavior, scheduling_hint)
return
spawn
(
behavior
);
return
spawn
(
behavior
);
}
}
void
mock_scheduler
::
enqueue
(
detail
::
abstract_scheduled_actor
*
)
{
cerr
<<
"mock_scheduler::enqueue"
<<
endl
;
abort
();
}
}
}
// namespace detail
}
}
// namespace detail
src/thread_pool_scheduler.cpp
View file @
55f9f4d3
...
@@ -32,6 +32,9 @@
...
@@ -32,6 +32,9 @@
#include <cstddef>
#include <cstddef>
#include <iostream>
#include <iostream>
#include "cppa/config.hpp"
#include "cppa/abstract_event_based_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/mock_scheduler.hpp"
...
@@ -45,12 +48,6 @@ namespace cppa { namespace detail {
...
@@ -45,12 +48,6 @@ namespace cppa { namespace detail {
namespace
{
namespace
{
void
enqueue_fun
(
cppa
::
detail
::
thread_pool_scheduler
*
where
,
cppa
::
detail
::
abstract_scheduled_actor
*
what
)
{
where
->
schedule
(
what
);
}
typedef
unique_lock
<
mutex
>
guard_type
;
typedef
unique_lock
<
mutex
>
guard_type
;
typedef
std
::
unique_ptr
<
thread_pool_scheduler
::
worker
>
worker_ptr
;
typedef
std
::
unique_ptr
<
thread_pool_scheduler
::
worker
>
worker_ptr
;
typedef
intrusive
::
single_reader_queue
<
thread_pool_scheduler
::
worker
>
worker_queue
;
typedef
intrusive
::
single_reader_queue
<
thread_pool_scheduler
::
worker
>
worker_queue
;
...
@@ -142,9 +139,9 @@ struct thread_pool_scheduler::worker
...
@@ -142,9 +139,9 @@ struct thread_pool_scheduler::worker
{
{
abstract_scheduled_actor
*
job
;
abstract_scheduled_actor
*
job
;
handler
()
:
job
(
nullptr
)
{
}
handler
()
:
job
(
nullptr
)
{
}
bool
still_ready
()
{
return
true
;
}
void
exec_done
()
void
exec_done
()
{
{
CPPA_REQUIRE
(
job
!=
nullptr
);
if
(
!
job
->
deref
())
delete
job
;
if
(
!
job
->
deref
())
delete
job
;
dec_actor_count
();
dec_actor_count
();
job
=
nullptr
;
job
=
nullptr
;
...
@@ -186,7 +183,7 @@ void thread_pool_scheduler::supervisor_loop(job_queue* jqueue,
...
@@ -186,7 +183,7 @@ void thread_pool_scheduler::supervisor_loop(job_queue* jqueue,
abstract_scheduled_actor
*
dummy
)
abstract_scheduled_actor
*
dummy
)
{
{
std
::
vector
<
worker_ptr
>
workers
;
std
::
vector
<
worker_ptr
>
workers
;
size_t
num_workers
=
std
::
max
<
size_t
>
(
thread
::
hardware_concurrency
()
*
2
,
8
);
auto
num_workers
=
std
::
max
<
size_t
>
(
thread
::
hardware_concurrency
()
*
2
,
8
);
for
(
size_t
i
=
0
;
i
<
num_workers
;
++
i
)
for
(
size_t
i
=
0
;
i
<
num_workers
;
++
i
)
{
{
worker_ptr
wptr
(
new
worker
(
jqueue
,
dummy
));
worker_ptr
wptr
(
new
worker
(
jqueue
,
dummy
));
...
@@ -214,7 +211,7 @@ void thread_pool_scheduler::stop()
...
@@ -214,7 +211,7 @@ void thread_pool_scheduler::stop()
super
::
stop
();
super
::
stop
();
}
}
void
thread_pool_scheduler
::
schedul
e
(
abstract_scheduled_actor
*
what
)
void
thread_pool_scheduler
::
enqueu
e
(
abstract_scheduled_actor
*
what
)
{
{
m_queue
.
push_back
(
what
);
m_queue
.
push_back
(
what
);
}
}
...
@@ -234,10 +231,15 @@ actor_ptr thread_pool_scheduler::spawn_impl(abstract_scheduled_actor* what,
...
@@ -234,10 +231,15 @@ actor_ptr thread_pool_scheduler::spawn_impl(abstract_scheduled_actor* what,
actor_ptr
thread_pool_scheduler
::
spawn
(
abstract_event_based_actor
*
what
)
actor_ptr
thread_pool_scheduler
::
spawn
(
abstract_event_based_actor
*
what
)
{
{
// do NOT push event-based actors to the queue on startup
// do NOT push event-based actors to the queue on startup
return
spawn_impl
(
what
->
attach_to_scheduler
(
enqueue_fun
,
this
),
false
);
return
spawn_impl
(
what
->
attach_to_scheduler
(
this
)
);
}
}
#ifndef CPPA_DISABLE_CONTEXT_SWITCHING
#ifdef CPPA_DISABLE_CONTEXT_SWITCHING
actor_ptr
thread_pool_scheduler
::
spawn
(
scheduled_actor
*
bhvr
,
scheduling_hint
)
{
return
mock_scheduler
::
spawn
(
bhvr
);
}
#else
actor_ptr
thread_pool_scheduler
::
spawn
(
scheduled_actor
*
bhvr
,
actor_ptr
thread_pool_scheduler
::
spawn
(
scheduled_actor
*
bhvr
,
scheduling_hint
hint
)
scheduling_hint
hint
)
{
{
...
@@ -247,14 +249,9 @@ actor_ptr thread_pool_scheduler::spawn(scheduled_actor* bhvr,
...
@@ -247,14 +249,9 @@ actor_ptr thread_pool_scheduler::spawn(scheduled_actor* bhvr,
}
}
else
else
{
{
return
spawn_impl
(
new
yielding_actor
(
bhvr
,
enqueue_fun
,
this
));
return
spawn_impl
(
new
yielding_actor
(
bhvr
,
this
));
}
}
}
}
#else
actor_ptr
thread_pool_scheduler
::
spawn
(
scheduled_actor
*
bhvr
,
scheduling_hint
)
{
return
mock_scheduler
::
spawn
(
bhvr
);
}
#endif
#endif
}
}
// namespace cppa::detail
}
}
// namespace cppa::detail
src/yielding_actor.cpp
View file @
55f9f4d3
...
@@ -39,6 +39,13 @@
...
@@ -39,6 +39,13 @@
namespace
cppa
{
namespace
detail
{
namespace
cppa
{
namespace
detail
{
yielding_actor
::
yielding_actor
(
scheduled_actor
*
behavior
,
scheduler
*
sched
)
:
super
(
sched
)
,
m_fiber
(
&
yielding_actor
::
run
,
this
)
,
m_behavior
(
behavior
)
{
}
yielding_actor
::~
yielding_actor
()
yielding_actor
::~
yielding_actor
()
{
{
delete
m_behavior
;
delete
m_behavior
;
...
@@ -159,8 +166,6 @@ void yielding_actor::resume(util::fiber* from, resume_callback* callback)
...
@@ -159,8 +166,6 @@ void yielding_actor::resume(util::fiber* from, resume_callback* callback)
case
yield_state
:
:
ready
:
case
yield_state
:
:
ready
:
{
{
break
;
break
;
//if (callback->still_ready()) break;
//else return;
}
}
case
yield_state
:
:
blocked
:
case
yield_state
:
:
blocked
:
{
{
...
@@ -170,8 +175,6 @@ void yielding_actor::resume(util::fiber* from, resume_callback* callback)
...
@@ -170,8 +175,6 @@ void yielding_actor::resume(util::fiber* from, resume_callback* callback)
case
abstract_scheduled_actor
:
:
ready
:
case
abstract_scheduled_actor
:
:
ready
:
{
{
break
;
break
;
//if (callback->still_ready()) break;
//else return;
}
}
case
abstract_scheduled_actor
:
:
blocked
:
case
abstract_scheduled_actor
:
:
blocked
:
{
{
...
...
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