Dispatcher::Dispatcher() { std::string message; epoll = ::epoll_create1(0); if (epoll == -1) { message = "epoll_create1 failed, " + lastErrorMessage(); } else { mainContext.ucontext = new ucontext_t; if (getcontext(reinterpret_cast<ucontext_t*>(mainContext.ucontext)) == -1) { message = "getcontext failed, " + lastErrorMessage(); } else { remoteSpawnEvent = eventfd(0, O_NONBLOCK); if(remoteSpawnEvent == -1) { message = "eventfd failed, " + lastErrorMessage(); } else { remoteSpawnEventContext.writeContext = nullptr; remoteSpawnEventContext.readContext = nullptr; epoll_event remoteSpawnEventEpollEvent; remoteSpawnEventEpollEvent.events = EPOLLIN; remoteSpawnEventEpollEvent.data.ptr = &remoteSpawnEventContext; if (epoll_ctl(epoll, EPOLL_CTL_ADD, remoteSpawnEvent, &remoteSpawnEventEpollEvent) == -1) { message = "epoll_ctl failed, " + lastErrorMessage(); } else { *reinterpret_cast<pthread_mutex_t*>(this->mutex) = pthread_mutex_t(PTHREAD_MUTEX_INITIALIZER); mainContext.interrupted = false; mainContext.group = &contextGroup; mainContext.groupPrev = nullptr; mainContext.groupNext = nullptr; contextGroup.firstContext = nullptr; contextGroup.lastContext = nullptr; contextGroup.firstWaiter = nullptr; contextGroup.lastWaiter = nullptr; currentContext = &mainContext; firstResumingContext = nullptr; firstReusableContext = nullptr; runningContextCount = 0; return; } auto result = close(remoteSpawnEvent); assert(result == 0); } } auto result = close(epoll); assert(result == 0); } throw std::runtime_error("Dispatcher::Dispatcher, "+message); }
TaskStore::TaskStore() { pthread_mutex_init(&this->get_mutex, NULL); pthread_mutex_init(&this->set_mutex, NULL); this->num_tasks_pending = 0; // Initialize first task queue queue<int> q; pair<pthread_mutex_t, queue<int>> *new_pair = new pair<pthread_mutex_t, queue<int>>; *new_pair = { pthread_mutex_t(), queue<int>() }; this->get_queues.push(new_pair); this->set_queues.push(new_pair); }
// NOT THREAD SAFE void TaskStore::add_task_queue() { printf("TaskStore::add_task_queue() { message: \"%s\" }\n", "Called"); pthread_mutex_t mutex; pthread_mutex_init(&mutex, NULL); pair<pthread_mutex_t, queue<int>> *new_pair = new pair<pthread_mutex_t, queue<int>>; *new_pair = { pthread_mutex_t() , queue<int>() }; pthread_mutex_init(&new_pair->first, NULL); queue<int> & q = new_pair->second; size_t avg_q_size = this->num_tasks_pending / this->get_queues.size(); while (q.size() < avg_q_size) { pthread_mutex_lock(&this->get_mutex); if (!this->get_queues.front()->second.empty()) { pthread_mutex_lock(&this->get_queues.front()->first); q.push(this->get_queues.front()->second.front()); this->get_queues.front()->second.pop(); pthread_mutex_unlock(&this->get_queues.front()->first); } pair<pthread_mutex_t, queue<int>> * old_pair = this->get_queues.front(); this->get_queues.pop(); this->get_queues.push(old_pair); pthread_mutex_unlock(&this->get_mutex); } pthread_mutex_lock(&this->get_mutex); this->get_queues.push(new_pair); pthread_mutex_unlock(&this->get_mutex); pthread_mutex_lock(&this->set_mutex); this->set_queues.push(this->get_queues.back()); pthread_mutex_unlock(&this->set_mutex); printf("TaskStore::add_task_queue() { message: \"%s\" }\n", "Finished"); }
MyBindHelper::MyBindHelper() :mutex(pthread_mutex_t()){ pthread_mutex_init(&mutex, NULL); }
Lockable::Lockable() : mutex_(pthread_mutex_t()) { }