Changeset 2632


Ignore:
Timestamp:
Aug 5, 2007, 3:52:45 AM (15 years ago)
Author:
joshe
Message:

Wait a bit for torrents to stop on exit.

Location:
trunk/beos
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/beos/TRWindow.cpp

    r2622 r2632  
    1515
    1616#include <malloc.h>
     17#include <time.h> /* for time() */
     18#include <unistd.h> /* for sleep() */
    1719
    1820#include "Prefs.h"
     
    3032{
    3133        engine = NULL;
     34        stopping = false;
     35        quitter = NULL;
    3236        Prefs prefs(TRANSMISSION_SETTINGS);
    3337       
     
    9397}
    9498
     99static void torrentclose(tr_torrent_t *torrent, void *)
     100{
     101        tr_torrentClose(torrent);
     102}
     103
    95104TRWindow::~TRWindow() {
     105        tr_torrentIterate(engine, torrentclose, NULL);
     106        const int MAX_EXIT_WAIT_SECS = 10;
     107        const time_t deadline = time(0) + MAX_EXIT_WAIT_SECS;
     108        while (tr_torrentCount(engine) && time(NULL) < deadline)) {
     109                snooze(100000);
     110        }
     111        /* XXX there's no way to make sure the torrent threads are running so this might crash */
    96112        tr_close(engine);
    97113        stop_watching(this);
     114        delete quitter;
    98115}
    99116
     
    336353 */
    337354bool TRWindow::QuitRequested() {
     355        if (stopping)
     356                return true;
     357
    338358        bool quit = false;
     359        int running;
    339360       
    340361        quit_info *quitData = (quit_info*)calloc(1, sizeof(quit_info));
    341362        quitData->running = 0;
    342363        transfers->DoForEach(TRWindow::CheckQuitStatus, (void *)quitData);
    343        
    344         if (quitData->running > 0) {
     364        running = quitData->running;
     365        free(quitData);
     366       
     367        if (running > 0) {
    345368                BString quitMsg("");
    346                 quitMsg << "There's " << quitData->running << " torrent";
    347                 if (quitData->running > 1) {
     369                quitMsg << "There's " << running << " torrent";
     370                if (running > 1) {
    348371                        quitMsg << "s";
    349372                }
     
    358381                quit = true;
    359382        }
    360         free(quitData);
    361383       
    362384        if (quit) {
     
    381403                delete prefs;
    382404               
    383                 be_app->PostMessage(new BMessage(B_QUIT_REQUESTED));
     405                if (running > 0) {
     406                        stopping = true;
     407                        BAlert *waiting = new BAlert("Stopping Torrents", "Waiting for torrents to stop...", "Quit");
     408                        quitter = new BInvoker(new BMessage(B_QUIT_REQUESTED), BMessenger(be_app));
     409                        waiting->Go(quitter);
     410                        quit = false;
     411                } else {
     412                        be_app->PostMessage(new BMessage(B_QUIT_REQUESTED));
     413                }
    384414        }
    385415        return quit;
     
    430460 */
    431461void TRWindow::UpdateList(int32 selection = -1, bool menus = true) {
     462        if (stopping)
     463        {
     464                quit_info *quitData = (quit_info*)calloc(1, sizeof(quit_info));
     465                quitData->running = 0;
     466                transfers->DoForEach(TRWindow::CheckQuitStatus, (void *)quitData);
     467                if (quitData->running == 0)
     468                        be_app->PostMessage(new BMessage(B_QUIT_REQUESTED));
     469                free(quitData);
     470        }
     471
    432472        update_info *upData = (update_info*)calloc(1, sizeof(update_info));
    433473        upData->running = false;
  • trunk/beos/TRWindow.h

    r2622 r2632  
    6262        static bool CheckQuitStatus(BListItem *item, void *data);
    6363        static bool UpdateStats(BListItem *item, void *data);
     64       
     65        bool stopping;
     66        BInvoker *quitter;
    6467};
    6568
Note: See TracChangeset for help on using the changeset viewer.