void *child(void *arg) { MySocket *client = (MySocket *) arg; bool requestActive = true; while (requestActive) { HTTPRequest *request = new HTTPRequest(client, PORT); HTTPResponse *response = new HTTPResponse(); IptvService *service = new IptvService(); if (!request->readRequest()) { // XXX FIXME throw an exception break; } else if (request->isHead()) { service->head(request, response); client->write(response->response()); } else if (request->isGet()) { service->get(request, response); client->write(response->response()); shared_ptr<BlockingQueue<string>> queue = shared_ptr<BlockingQueue<string>>(new BlockingQueue<string>()); struct ThreadData *threadData = new struct ThreadData; threadData->queue = queue; threadData->service = service; pthread_t tid; pthread_create(&tid, NULL, streamService, threadData); pthread_detach(tid); try { string data; while (true) { data = queue->popFront(); HttpUtils::writeChunk(client, data.c_str(), data.length()); } } catch (SocketWriteError swe) { requestActive = false; } catch (...) { // swallow it } queue->close(); } delete response; delete request; } client->close(); delete client; return NULL; }