void TEDemo::doneSession(TESession* s, int status) { //printf("%s(%d): Exited:%d ExitStatus:%d\n",__FILE__,__LINE__,WIFEXITED(status),WEXITSTATUS(status)); #if 0 // die silently if (!WIFEXITED((status)) || WEXITSTATUS((status))) { QString str; //FIXME: "Title" is not a precise locator for the message. // The command would be better. str.sprintf(i18n("`%s' terminated abnormally."), s->Title()); if (WIFEXITED((status))) {char rcs[100]; sprintf(rcs,"%d.\n",WEXITSTATUS((status))); str = str + i18n("\nReturn code = ") + rcs; } KMsgBox::message( this, i18n("Error"), str, KMsgBox::EXCLAMATION ); } #endif int no = (int)session2no.find(s); if (!no) return; // oops no2session.remove(no); session2no.remove(s); m_sessions->removeItem(no); s->setConnect(FALSE); // This slot (doneSession) is activated from the Shell when receiving a // SIGCHLD. A lot is done during the signal handler, apparently deleting // the Shell additionally, is sometimes too much, causing something // to get messed up in rare cases. The following causes delete not to // be called from within the signal handler. QTimer::singleShot(100,s,SLOT(terminate())); if (s == se) { // pick a new session se = NULL; QIntDictIterator<TESession> it( no2session ); if ( it.current() ) activateSession(it.currentKey()); else kapp->quit(); } }
void PukeController::closefd(int fd) { if(bClosing == TRUE) return; bClosing = TRUE; if(qidConnectFd[fd] == NULL){ kdDebug(5008) << "PukeController: Connect table NULL, closed twice?" << endl; return; } // Shutof the listener before closing the socket, just in case. qidConnectFd[fd]->sr->setEnabled(FALSE); // Shut them off qidConnectFd[fd]->sw->setEnabled(FALSE); delete qidConnectFd[fd]->sr; delete qidConnectFd[fd]->sw; qidConnectFd[fd]->server.truncate(0); qidConnectFd.remove(fd); close(fd); /* * Now let's remove all traces of the widgets */ QIntDict<WidgetS> *qidWS = WidgetList[fd]; if(qidWS == 0){ kdDebug(5008) << "WidgetRunner:: Close called twice?" << endl; bClosing = FALSE; return; } qidWS->remove(PUKE_CONTROLLER); do { QIntDictIterator<WidgetS> it(*qidWS); if(it.count() == 0){ kdDebug(5008) << "WidgetRunner: nothing left to delete\n" << endl; break; } PObject *po = 0x0; while(it.current()){ /* * Delete all the layouts first * */ if(it.current()->type == POBJECT_LAYOUT){ po = it.current()->pwidget; break; } ++it; } if(po != 0x0){ po->manTerm(); delete po; continue; } /* * reset */ it.toFirst(); po = it.current()->pwidget; po->manTerm(); delete po; } while (qidWS->count() > 0); WidgetList.remove(fd); bClosing = FALSE; }