<< " time_id=" << time_event_next_id << ").";
}
-EventCenter *EventCenter::centers[MAX_EVENTCENTER];
thread_local EventCenter* local_center = nullptr;
int EventCenter::init(int n, unsigned i)
void EventCenter::set_owner()
{
- centers[idx] = local_center = this;
+ cct->lookup_or_create_singleton_object<EventCenter::AssociatedCenters>(
+ global_centers, "AsyncMessenger::EventCenter::global_center");
+ assert(global_centers && !global_centers->centers[idx]);
+ global_centers->centers[idx] = local_center = this;
+ ldout(cct, 1) << __func__ << " idx=" << idx << " local_center=" << local_center << dendl;
}
int EventCenter::create_file_event(int fd, int mask, EventCallbackRef ctxt)
* EventCenter maintain a set of file descriptor and handle registered events.
*/
class EventCenter {
+
using clock_type = ceph::coarse_mono_clock;
// should be enough;
static const int MAX_EVENTCENTER = 24;
- static EventCenter *centers[MAX_EVENTCENTER];
+
+ struct AssociatedCenters {
+ EventCenter *centers[MAX_EVENTCENTER];
+ AssociatedCenters(CephContext *c) {
+ memset(centers, 0, MAX_EVENTCENTER * sizeof(EventCenter*));
+ }
+ };
struct FileEvent {
int mask;
NetHandler net;
EventCallbackRef notify_handler;
unsigned idx = 10000;
+ AssociatedCenters *global_centers;
int process_time_events();
FileEvent *_get_file_event(int fd) {
public:
template <typename func>
- static void submit_to(int i, func &&f, bool nowait = false) {
- assert(i < MAX_EVENTCENTER);
- EventCenter *c = centers[i];
+ void submit_to(int i, func &&f, bool nowait = false) {
+ assert(i < MAX_EVENTCENTER && global_centers);
+ EventCenter *c = global_centers->centers[i];
+ assert(c);
if (c->in_thread()) {
f();
return ;