#include <src/kernel/activity/ActivityImpl.hpp>
#include <src/kernel/activity/CommImpl.hpp>
+#include <src/kernel/activity/ExecImpl.hpp>
#include <boost/intrusive_ptr.hpp>
#include "popping_enum.h" /* Definition of e_smx_simcall_t, with one value per simcall */
-typedef int (*simix_match_func_t)(void *, void *, smx_activity_t);
+typedef int (*simix_match_func_t)(void*, void*, simgrid::kernel::activity::CommImpl*);
typedef void (*simix_copy_data_func_t)(smx_activity_t, void*, size_t);
typedef void (*simix_clean_func_t)(void *);
typedef void (*FPtr)(void); // Hide the ugliness
inline void unmarshal(type<void>, u_smx_scalar const& simcall)
{
+ /* Nothing to do for void data */
}
inline void unmarshal_raw(type<void>, u_smx_scalar const& simcall)
{
+ /* Nothing to do for void data */
}
template<class T> inline
template <class T>
inline void marshal(type<boost::intrusive_ptr<T>>, u_smx_scalar& simcall, boost::intrusive_ptr<T> value)
{
- intrusive_ptr_add_ref(&*value);
- simcall.dp = static_cast<void*>(&*value);
+ if (value.get() == nullptr) { // Sometimes we return nullptr in an intrusive_ptr...
+ simcall.dp = nullptr;
+ } else {
+ intrusive_ptr_add_ref(&*value);
+ simcall.dp = static_cast<void*>(&*value);
+ }
}
template <class T> inline boost::intrusive_ptr<T> unmarshal(type<boost::intrusive_ptr<T>>, u_smx_scalar const& simcall)
{
+ // refcount was already increased during the marshaling, thus the "false" as last argument
boost::intrusive_ptr<T> res = boost::intrusive_ptr<T>(static_cast<T*>(simcall.dp), false);
- // intrusive_ptr_release(&*res);
return res;
}
template <class T> inline T* unmarshal_raw(type<boost::intrusive_ptr<T>>, u_smx_scalar const& simcall)