abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 13:00 | Nová verze

    Komunita kolem Linuxu From Scratch (LFS) vydala Linux From Scratch 12.1 a Linux From Scratch 12.1 se systemd. Nové verze knih s návody na instalaci vlastního linuxového systému ze zdrojových kódů přichází s Glibc 2.39, Binutils 2.42 a Linuxem 6.7.4. Současně bylo oznámeno vydání verze 12.1 knih Beyond Linux From Scratch (BLFS) a Beyond Linux From Scratch se systemd.

    Ladislav Hagara | Komentářů: 0
    včera 22:22 | Upozornění

    Google blokuje Chaty RCS (Rich Communication Services neboli rozšířené komunikační služby) na telefonech s rootnutým Androidem nebo odemčeným zavaděčem [9to5Google].

    Ladislav Hagara | Komentářů: 7
    včera 12:22 | Komunita

    Bylo spuštěno hlasování o přednáškách a workshopech pro letošní Installfest, jenž proběhne o víkendu 16. a 17. března v Praze na Karlově náměstí 13. O open source hardwaru bude přednášet Mitch Altman.

    Ladislav Hagara | Komentářů: 1
    včera 08:00 | IT novinky

    Počítač NitroPC Pro 2 od společnosti Nitrokey s corebootem Dasharo byl oficiálně certifikován pro Qubes OS verze 4. Qubes OS (Wikipedie) je svobodný a otevřený operační systém zaměřený na bezpečnost desktopu.

    Ladislav Hagara | Komentářů: 1
    včera 07:00 | Nová verze

    Mobilní operační systém /e/OS (Wikipedie) založený na Androidu / LineageOS, ale bez aplikací a služeb od Googlu, byl vydán ve verzi 1.20. Přehled novinek na GitLabu.

    Ladislav Hagara | Komentářů: 17
    29.2. 13:00 | IT novinky

    Jednodeskový počítač Raspberry Pi slaví 12 let. Prodej byl spuštěn 29. února 2012 (Wikipedie, 𝕏).

    Ladislav Hagara | Komentářů: 13
    29.2. 12:00 | Nová verze

    Byla vydána verze 3.2 multiplatformního integrovaného vývojového prostředí (IDE) pro rychlý vývoj aplikaci (RAD) ve Free Pascalu Lazarus (Wikipedie). Přehled novinek v poznámkách k vydání. Využíván je Free Pascal Compiler (FPC) 3.2.2.

    Ladislav Hagara | Komentářů: 0
    29.2. 11:44 | Nová verze

    Byla vydána nová verze 1.6.0 grafického správce diskových oddílů GParted (GNOME Partition Editor) a také verze 1.6.0 živé distribuce GParted Live, která obsahuje tohoto správce a další nástroje pro zálohování či obnovu dat. Linux byl povýšen na verzi 6.6.15-2.

    Ladislav Hagara | Komentářů: 8
    29.2. 06:00 | Nová verze Ladislav Hagara | Komentářů: 0
    28.2. 22:44 | Nová verze

    Byla vydána (𝕏) únorová aktualizace aneb nová verze 1.87 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.87 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 15
    Steam
     (20%)
     (32%)
     (7%)
     (9%)
     (32%)
    Celkem 44 hlasů
     Komentářů: 0
    Rozcestník

    Dotaz: select a jak ho vzbudit

    3.5.2009 00:36 Deleted [8409] | skóre: 14 | blog: darkblog
    select a jak ho vzbudit
    Přečteno: 203×
    Chtěl bych se zeptat, jakým způsobem se dá vzbudit select(), který čeká na X11.

    Mám následující kód:
    void EventPumpX11::waitForWork()
    {
      UISystemX11* uiSystem = UI_SYSTEM();
    
      int fd = uiSystem->_fd;
      int fdSize = fd + 1;
      fd_set fdSet;
    
      struct timeval tval;
      FD_ZERO(&fdSet);
      FD_SET(fd, &fdSet);
    
      TimeDelta delay = _delayedWorkTime - Time::now();
      if (delay > TimeDelta())
      {
        // Go to sleep. X11 will wake us to process X events. We also set interval
        // to wake up if there are planned tasks to specific time (Timers).
        int64_t udelay = delay.inMicroseconds();
        tval.tv_sec = (int)(udelay / 1000000);
        tval.tv_usec = (int)(udelay % 1000000);
        if (tval.tv_usec <= 100) tval.tv_usec = 100;
    
        int ret = ::select(fdSize, &fdSet, NULL, NULL, &tval);
        // TODO: Check for select result
      }
      else
      {
        // It looks like delayedWorkTime indicates a time in the past, so we
        // need to call doDelayedWork now.
        _delayedWorkTime = Time();
      }
    }
    
    kde fd je deskriptor, který jsem obdržel pomocí ConnectionNumber(Display*) (Xlib). O co mi jde, potřeboval bych probudit event loop, když chci z jiného vlákna poslat událost do toho hlavního, které čeká buď na událost z X11 nebo na vypršení časového limitu potřebného pro jiné úkoly (delay).

    Myslím, že správná cesta bude vytvořit vlastní file descriptor, na který pošlu 1 byte v případě, že budu chtít probudit event loop, ale nějak nevím jak přesně na to (toto jsem ještě nikdy nedělal). Použít fd_set a do masky dát vlastní fd?

    Stačí mi nakopnutí správným směrem ;)

    Odpovědi

    3.5.2009 03:41 joe
    Rozbalit Rozbalit vše Re: select a jak ho vzbudit
    Přesně tak, jen přidáš ten další deskriptor (nejlépe asi z pipe()) pomocí FD_SET(fd2, fdSet) a fdSize upravíš na max(fd, fd2) + 1 a po tom selectu otestuješ, na kterých deskriptorech jsou data pomocí FD_ISSET (i ten druhý deskriptor musíš vyprazdňovat). Samozřejmě se to dá přerušit třeba signálem, ale musí člověk přesně vědět, co všechno to může udělat. Přidání dalšího deskriptoru je nejčistší.
    3.5.2009 12:29 Deleted [8409] | skóre: 14 | blog: darkblog
    Rozbalit Rozbalit vše Re: select a jak ho vzbudit
    díky, dopracoval jsem se k něčemu takovému:
    void EventPumpX11::waitForWork()
    {
      UISystemX11* uiSystem = UI_SYSTEM();
    
      int fd = uiSystem->_fd;
      int fdSize = fog_max(fd, uiSystem->_wakeUpPipe[0]) + 1;
      fd_set fdSet;
    
      struct timeval tval;
      struct timeval* ptval = NULL;
      FD_ZERO(&fdSet);
      FD_SET(fd, &fdSet);
      FD_SET(uiSystem->_wakeUpPipe[0], &fdSet);
    
      if (_delayedWorkTime.isNull())
      {
        // There are no scheduled tasks, so ptval is NULL and this tells to select()
        // that it should wait infitine time.
      }
      else
      {
        TimeDelta delay = _delayedWorkTime - Time::now();
    
        if (delay > TimeDelta())
        {
          // Go to sleep. X11 will wake us to process X events and we also set
          // interval to wake up to run planned tasks (usually Timers).
          int64_t udelay = delay.inMicroseconds();
          tval.tv_sec = (int)(udelay / 1000000);
          tval.tv_usec = (int)(udelay % 1000000);
          if (tval.tv_usec <= 100) tval.tv_usec = 100;
          ptval = &tval;
        }
        else
        {
          // It looks like delayedWorkTime indicates a time in the past, so we
          // need to call doDelayedWork now.
          _delayedWorkTime = Time();
          return;
        }
      }
    
      int ret = ::select(fdSize, &fdSet, NULL, NULL, ptval);
    
      if (ret < 0)
      {
        fog_debug("Fog::EventPumpX11::waitForWork() - select() failed (errno=%d).", errno);
      }
    
      if (ret > 0)
      {
        if (FD_ISSET(uiSystem->_wakeUpPipe[0], &fdSet))
        {
          // Dummy c, the actual value is out of our interest.
          uint8_t c;
          read(uiSystem->_wakeUpPipe[0], &c, 1);
          _wakeUpSent.cmpXchg(1, 0);
        }
      }
    }
    
    a Kód pro probuzen9 z jiiného vlákna vypadá takto:
    void EventPumpX11::sendWakeUp()
    {
      if (_wakeUpSent.cmpXchg(0, 1))
      {
        UISystemX11* uiSystem = UI_SYSTEM();
        uint8_t c = 'W';
    
        write(uiSystem->_wakeUpPipe[1], &c, 1);
      }
    }
    
    požil jsem atomické operace k tomu, abych do pipe neposílal příliš moc, teď tam je normálně jen ten 1 BYTE, který probudí select. Funguje to, ale samořejmě to může obsahovat chyby (zase tak moc jsem to neotestoval)...

    Ke kompletnosti ještě vytvoření pipe:
      // Create wakeup pipe.
      if (pipe(_wakeUpPipe) < 0)
      {
        fog_debug("Fog::UISystemX11::Can't create wakeup pipe");
        goto fail;
      }
    
    K zápisu používám _wakeUpPipe[1] a ke čtení _wakeUpPipe[0], doufám, že jsem to pochopil správně...:)

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.