-/* Copyright (c) 2006-2022. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2006-2023. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
void* src_buff_ = nullptr;
size_t src_buff_size_ = sizeof(void*);
- /* specified only for direct host-to-host communications */
- Host* from_ = nullptr;
- Host* to_ = nullptr;
-
/* FIXME: expose these elements in the API */
bool detached_ = false;
- bool (*match_fun_)(void*, void*, kernel::activity::CommImpl*) = nullptr;
- void (*clean_fun_)(void*) = nullptr;
- void (*copy_data_function_)(kernel::activity::CommImpl*, void*, size_t) = nullptr;
+ std::function<bool(void*, void*, kernel::activity::CommImpl*)> match_fun_;
+ std::function<void(void*)> clean_fun_;
+ std::function<void(kernel::activity::CommImpl*, void*, size_t)> copy_data_function_;
Comm() = default;
+ Comm* do_start() override;
public:
/* signals and related callbacks */
static xbt::signal<void(Comm const&)> on_send;
static xbt::signal<void(Comm const&)> on_recv;
static xbt::signal<void(Comm const&)> on_start;
- static xbt::signal<void(Comm const&)> on_completion;
#endif
static void on_send_cb(const std::function<void(Comm const&)>& cb) { on_send.connect(cb); }
static void on_recv_cb(const std::function<void(Comm const&)>& cb) { on_recv.connect(cb); }
static void on_start_cb(const std::function<void(Comm const&)>& cb) { on_start.connect(cb); }
- static void on_completion_cb(const std::function<void(Activity const&)>& cb) { on_completion.connect(cb); }
+ void fire_this_completion() const override { on_completion(*this); }
/* More callbacks */
- CommPtr set_copy_data_callback(void (*callback)(kernel::activity::CommImpl*, void*, size_t));
- static void copy_buffer_callback(kernel::activity::CommImpl*, void*, size_t);
- static void copy_pointer_callback(kernel::activity::CommImpl*, void*, size_t);
+ CommPtr set_copy_data_callback(const std::function<void(kernel::activity::CommImpl*, void*, size_t)>& callback);
+ XBT_ATTRIB_DEPRECATED_v337("Please manifest if you actually need this function") static void copy_buffer_callback(
+ kernel::activity::CommImpl*, void*, size_t);
+ XBT_ATTRIB_DEPRECATED_v337("Please manifest if you actually need this function") static void copy_pointer_callback(
+ kernel::activity::CommImpl*, void*, size_t);
~Comm() override;
+ static void send(kernel::actor::ActorImpl* sender, const Mailbox* mbox, double task_size, double rate, void* src_buff,
+ size_t src_buff_size,
+ const std::function<bool(void*, void*, simgrid::kernel::activity::CommImpl*)>& match_fun,
+ const std::function<void(simgrid::kernel::activity::CommImpl*, void*, size_t)>& copy_data_fun,
+ void* data, double timeout);
+ static void recv(kernel::actor::ActorImpl* receiver, const Mailbox* mbox, void* dst_buff, size_t* dst_buff_size,
+ const std::function<bool(void*, void*, simgrid::kernel::activity::CommImpl*)>& match_fun,
+ const std::function<void(simgrid::kernel::activity::CommImpl*, void*, size_t)>& copy_data_fun,
+ void* data, double timeout, double rate);
+
/* "One-sided" communications. This way of communicating bypasses the mailbox and actors mechanism. It creates a
* communication (vetoabled, asynchronous, or synchronous) directly between two hosts. There is really no limit on
* the hosts involved. In particular, the actor creating such a communication does not have to be on one of the
static void sendto(Host* from, Host* to, uint64_t simulated_size_in_bytes);
CommPtr set_source(Host* from);
- Host* get_source() const { return from_; }
+ Host* get_source() const;
CommPtr set_destination(Host* to);
- Host* get_destination() const { return to_; }
+ Host* get_destination() const;
/* Mailbox-based communications */
CommPtr set_mailbox(Mailbox* mailbox);
* That's a buffer where the sent data will be copied */
CommPtr set_dst_data(void** buff, size_t size);
/** Retrieve where the data will be copied on the receiver side */
- void* get_dst_data() { return dst_buff_; }
- /** Retrieve the size of the received data. Not to be mixed with @ref Activity::set_remaining() */
+ void* get_dst_data() const { return dst_buff_; }
+ /** Retrieve the size of the received data. Not to be mixed with @ref Activity::get_remaining() */
size_t get_dst_data_size() const { return dst_buff_size_; }
/* Common functions */
/** Sets the maximal communication rate (in byte/sec). Must be done before start */
CommPtr set_rate(double rate);
- bool is_assigned() const override { return (to_ != nullptr && from_ != nullptr) || (mailbox_ != nullptr); }
+ bool is_assigned() const override;
Actor* get_sender() const;
/* Comm life cycle */
- Comm* start() override;
/** Start the comm, and ignore its result. It can be completely forgotten after that. */
Comm* detach();
/** Start the comm, and ignore its result. It can be completely forgotten after that. */
- Comm* detach(void (*clean_function)(void*))
+ Comm* detach(const std::function<void(void*)>& clean_function)
{
clean_fun_ = clean_function;
return detach();
/*! Same as wait_all, but with a timeout. Return the number of terminated comm (less than comms.size() if the timeout
* occurs). */
static size_t wait_all_for(const std::vector<CommPtr>& comms, double timeout);
-
-#ifndef DOXYGEN
- XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for parameter") static int wait_any(
- const std::vector<CommPtr>* comms)
- {
- return static_cast<int>(wait_any_for(*comms, -1));
- }
- XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for first parameter") static int wait_any_for(
- const std::vector<CommPtr>* comms, double timeout)
- {
- return static_cast<int>(wait_any_for(*comms, timeout));
- }
- XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for parameter") static void wait_all(
- const std::vector<CommPtr>* comms)
- {
- wait_all(*comms);
- }
- XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for parameter") static int test_any(
- const std::vector<CommPtr>* comms)
- {
- return static_cast<int>(test_any(*comms));
- }
-#endif
};
} // namespace s4u
} // namespace simgrid