示例#1
0
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!");


}