Commit 2e6af718 authored by jan.koester's avatar jan.koester
Browse files

working on threading

parent 01cddda6
Loading
Loading
Loading
Loading
+12 −21
Original line number Diff line number Diff line
@@ -81,7 +81,6 @@ netplus::con::condata *netplus::con::addSendQueue(const char*data,unsigned long
        _SendDataLast=_SendDataLast->_nextConnectionData;
    }
    _SendDataLength+=datasize;
    _eventapi->sendReady(this,true);
    return _SendDataLast;
}

@@ -92,12 +91,8 @@ void netplus::con::cleanSendData(){
   _SendDataLength=0;
}

netplus::con::condata *netplus::con::resizeSendQueue(unsigned long size){
    try{
netplus::con::condata *netplus::con::resizeSendQueue(size_t size){
    return _resizeQueue(&_SendDataFirst,&_SendDataLast,_SendDataLength,size);
    }catch(char *e){
        throw e; 
    }
}

netplus::con::condata* netplus::con::getSendData(){
@@ -133,12 +128,8 @@ void netplus::con::cleanRecvData(){
}


netplus::con::condata *netplus::con::resizeRecvQueue(unsigned long size){
    try{
netplus::con::condata *netplus::con::resizeRecvQueue(size_t size){
    return _resizeQueue(&_ReadDataFirst,&_ReadDataLast,_ReadDataLength,size);
    }catch(char *e){
        throw e; 
    }
}

netplus::con::condata *netplus::con::getRecvData(){
@@ -155,7 +146,7 @@ void netplus::con::sending(bool state) {
}

netplus::con::condata *netplus::con::_resizeQueue(condata** firstdata, condata** lastdata,
                                                               unsigned long &qsize,unsigned long size){
                                                               size_t &qsize,size_t size){
    NetException exception;
    if(!*firstdata || size > qsize || qsize==0 || size==0){
        exception[NetException::Error] << "_resizeQueue wrong datasize or ConnectionData";
@@ -168,12 +159,10 @@ netplus::con::condata *netplus::con::_resizeQueue(condata** firstdata, condata**

    qsize-=size;

    int curlen =0;
HAVEDATA:
    if((*firstdata)) {
            curlen += ((int)(*firstdata)->getDataLength() - size);

            if ( curlen <= 0 || size >= (unsigned long)curlen) {
            int curlen = ((int)(*firstdata)->getDataLength() - size);
            if ( curlen <= 0) {
                size -= (*firstdata)->getDataLength();
#ifdef DEBUG
                delsize += (*firstdata)->getDataLength();
@@ -184,17 +173,19 @@ HAVEDATA:
                    (*lastdata) = nullptr;
                delete* firstdata;
                (*firstdata) = newdat;

            }else{
                std::string buf = (*firstdata)->_Data.substr(size,curlen);
                (*firstdata)->_Data = buf;
#ifdef DEBUG
                delsize += size;
#endif
            }
                size -= curlen;
            }

            if(size!=0)
                goto HAVEDATA;
    }

#ifdef DEBUG
    // std::cout << " delsize: "    << delsize << ": " << size
+3 −3
Original line number Diff line number Diff line
@@ -61,14 +61,14 @@ namespace netplus {
                                        const char* keyword,unsigned long keylen);
            
            condata *addSendQueue(const char *data,unsigned long datasize);
            condata *resizeSendQueue(unsigned long size);
            condata *resizeSendQueue(size_t size);
            void     cleanSendData();
            condata *getSendData();
            size_t   getSendLength();
            
            /*Get Data funtions Recv Queue*/
            condata *addRecvQueue(const char *data,unsigned long datasize);
            condata *resizeRecvQueue(unsigned long size);
            condata *resizeRecvQueue(size_t size);
            void     cleanRecvData();
            condata *getRecvData();
            size_t   getRecvLength();
@@ -89,7 +89,7 @@ namespace netplus {
            size_t   _SendDataLength;
        private:
            condata *_resizeQueue(condata **firstdata, condata **lastdata,
                                  unsigned long &qsize,unsigned long size);
                                  size_t &qsize,size_t size);
            
            /*Incomming Data*/
            condata *_ReadDataFirst;
+0 −1
Original line number Diff line number Diff line
@@ -41,7 +41,6 @@ namespace netplus {
            virtual ~eventapi();
            virtual void initEventHandler()=0;
            virtual const char *getpolltype()=0;

            /*pollstate*/
            virtual int pollState(int pos)=0;

+33 −27
Original line number Diff line number Diff line
@@ -102,9 +102,8 @@ namespace netplus {
    int poll::pollState(int pos){
        NetException exception;
        con* ccon = (con*)_Events[pos].data.ptr;
        if (!ccon) {
            return EventHandlerStatus::EVCON;
        }
        if(!ccon)
            throw "Scheiße !";
        if (ccon->getSendData()) {
            return EventHandlerStatus::EVOUT;
        }
@@ -122,13 +121,19 @@ namespace netplus {
    };

    void poll::ConnectEventHandler(int pos) {
        const std::lock_guard<std::mutex> lock(_StateLock);
        NetException exception;
        con *ccon;
        con *ccon = (con*)_Events[pos].data.ptr;
        if(ccon)
            return;
        try {
            ccon = new con(this);
            ccon->conlock.lock();
            ccon->csock = _ServerSocket->accept();
            ccon->csock->setnonblocking();
            std::string ip;
            ccon->csock->getAddress(ip);
            std::cout << "Connected: " << ip  << std::endl;

            struct poll_event setevent { 0 };
            setevent.events = EPOLLIN;
@@ -138,9 +143,7 @@ namespace netplus {
                exception[NetException::Error] << "ConnectEventHandler: can't add socket to epoll";
                throw exception;
            }
            std::string ip;
            ccon->csock->getAddress(ip);
            std::cout << "Connected: " << ip  << std::endl;

            ConnectEvent(ccon);
            ccon->conlock.unlock();
        } catch (NetException& e) {
@@ -166,7 +169,6 @@ namespace netplus {
            RequestEvent(rcon);
        }
        catch (NetException& e) {
            rcon->conlock.unlock();
            throw e;
        }
    };
@@ -193,19 +195,17 @@ namespace netplus {
            ResponseEvent(wcon);
        }
        catch (NetException& e) {
            wcon->conlock.unlock();
            throw e;
        }
    };

    void poll::CloseEventHandler(int pos) {
        const std::lock_guard<std::mutex> lock(_StateLock);
        NetException except;

        con* delcon = (con*)_Events[pos].data.ptr;

        if(!delcon || !delcon->conlock.try_lock()){
            except[NetException::Error] << "CloseEvent connection not exists or locked!";
        if(!delcon){
            except[NetException::Error] << "CloseEvent connection not exists!";
            throw except;
        }

@@ -278,11 +278,10 @@ namespace netplus {
                    int wfd = eventptr->waitEventHandler();
                    for (int i = 0; i < wfd; ++i) {
                        try {
                            int state=eventptr->pollState(i);
                            if(state==poll::EVCON)
                            eventptr->ConnectEventHandler(i);
                            if(eventptr->trylockCon(i)){
                                switch (state) {
                                try{
                                    switch (eventptr->pollState(i)) {
                                        case poll::EVIN:
                                            eventptr->ReadEventHandler(i);
                                            break;
@@ -290,18 +289,25 @@ namespace netplus {
                                            eventptr->WriteEventHandler(i);
                                            break;
                                        default:
                                        break;
                                            NetException excep;
                                            excep[NetException::Note] << "Eventworker: nothing todo close connection";
                                            throw excep;
                                    }
                                    eventptr->unlockCon(i);
                            }
                                }catch(NetException& e){
                                    eventptr->CloseEventHandler(i);
                                    throw e;
                                }
                            }
                        } catch (NetException& e) {
                            if (e.getErrorType() == NetException::Critical) {
                                throw e;
                            }
                            if(e.getErrorType() != NetException::Note)
                            if(e.getErrorType() != NetException::Note){
                                std::cerr << e.what() << std::endl;
                            }

                        }
                    }
                }
                catch (NetException& e) {