void WorkQueue::executeWorkItem(void* item) { WorkQueue* queue = static_cast<WorkQueue*>(dispatch_get_context(dispatch_get_current_queue())); OwnPtr<WorkItem> workItem(static_cast<WorkItem*>(item)); { MutexLocker locker(queue->m_isValidMutex); if (!queue->m_isValid) return; } workItem->execute(); }
void NetAsync::queueLookup(const char* remoteAddr, NetSocket socket) { // do we have it already? unsigned int i = 0; for (i = 0; i < mLookupRequests.size(); ++i) { if (mLookupRequests[i].sock == socket) // found it. ignore more than one lookup at a time for a socket. return; } // not found, so add it mLookupRequests.increment(); NameLookupRequest& lookupRequest = mLookupRequests.last(); lookupRequest.sock = socket; dStrncpy(lookupRequest.remoteAddr, remoteAddr, sizeof(lookupRequest.remoteAddr)); ThreadSafeRef< NameLookupWorkItem > workItem( new NameLookupWorkItem( lookupRequest ) ); ThreadPool::GLOBAL().queueWorkItem( workItem ); }
void acceptThreadMain(AcceptData* acceptData, MasterMailbox* masterMailbox) { //Do the setup for this threads work Socket* listeningSocket = acceptThreadInit(); //Temp storage SOCKADDRSTORAGE tempIncomingSocketAddress; socklen_t tempIncomingSocketAddressSize = sizeof(tempIncomingSocketAddress); while(acceptData->shouldContinue) { std::unique_lock<std::mutex> workQueueLock(acceptData->mutex); bool receivedMessage = acceptData->conditionVariable.wait_for(workQueueLock, std::chrono::milliseconds(100), [&] {return acceptData->workQueue.size();}); if(receivedMessage) { std::function<void()> workItem = acceptData->workQueue.front(); acceptData->workQueue.pop(); workQueueLock.unlock(); workItem(); } int returnValue; returnValue = NetworkSocketAccept(listeningSocket->handle, (SOCKADDR*)&tempIncomingSocketAddress, &tempIncomingSocketAddressSize); //Nothing to do if(returnValue == -1) { continue; } else //There is a new thread to accept { //Set the socket to be reusable if half closed? int reusableError = NetworkSocketSetReusable(returnValue, true); if(reusableError == -1) { fprintf(stderr, "Unable to set socket as reusable\n"); } //Make a copy of the temp variable SOCKADDRSTORAGE* incomingSocketAddress = (SOCKADDRSTORAGE*)malloc(sizeof(SOCKADDRSTORAGE)); memcpy(incomingSocketAddress, &tempIncomingSocketAddress, sizeof(SOCKADDRSTORAGE)); //Construct a socket object Socket* newClientSocket = new Socket(returnValue, (SOCKADDR*)incomingSocketAddress); //Place the new user in the servers accepted socket buffer masterMailbox->AcceptThreadAddNewConnectedUser(new User(newClientSocket, NULL)); } } delete listeningSocket; masterMailbox->AcceptThreadConfirmShutdown(); //printf("Accept Thread is exiting\n!"); }