Example #1
0
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);
 }
Example #5
0
Lockable::Lockable() :
  mutex_(pthread_mutex_t())
{
}