abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 15:22 | Zajímavý článek

    Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 160 (pdf).

    Ladislav Hagara | Komentářů: 0
    dnes 14:11 | IT novinky

    Izrael od února zakáže dětem používat v prostorách základních škol mobilní telefony. Podle agentury AFP to uvedlo izraelské ministerstvo školství, které zdůraznilo negativní dopady, které na žactvo používání telefonů má. Izrael se tímto krokem přidává k rostoucímu počtu zemí, které dětem ve vzdělávacích zařízeních přístup k telefonům omezují.

    Ladislav Hagara | Komentářů: 6
    dnes 14:00 | IT novinky

    Internetová společnost Google ze skupiny Alphabet pravděpodobně dostane příští rok pokutu od Evropské komise za nedostatečné dodržování pravidel proti upřednostňování vlastních služeb a produktů ve výsledcích vyhledávání. V březnu EK obvinila Google, že ve výsledcích vyhledávání upřednostňuje na úkor konkurence vlastní služby, například Google Shopping, Google Hotels a Google Flights. Případ staví Google proti specializovaným

    … více »
    Ladislav Hagara | Komentářů: 4
    dnes 12:22 | Pozvánky

    Byl oznámen program a spuštěna registrace na konferenci Prague PostgreSQL Developer Day 2026. Konference se koná 27. a 28. ledna a bude mít tři tracky s 18 přednáškami a jeden den workshopů.

    TomasVondra | Komentářů: 0
    dnes 12:11 | Pozvánky

    Na webu československého síťařského setkání CSNOG 2026 je vyvěšený program, registrace a další informace k akci. CSNOG 2026 se uskuteční 21. a 22. ledna příštího roku a bude se i tentokrát konat ve Zlíně. Přednášky, kterých bude více než 30, budou opět rozdělené do tří bloků - správa sítí, legislativa a regulace a akademické projekty. Počet míst je omezený, proto kdo má zájem, měl by se registrovat co nejdříve.

    VSladek | Komentářů: 0
    včera 00:44 | Zajímavý článek

    Máirín Duffy a Brian Smith v článku pro Fedora Magazine ukazují použití LLM pro diagnostiku systému (Fedora Linuxu) přes Model Context Protocol od firmy Anthropic. I ukázkové výstupy v samotném článku obsahují AI vygenerované nesmysly, např. doporučení přeinstalovat balíček pomocí správce balíčků APT z Debianu místo DNF nativního na Fedoře.

    |🇵🇸 | Komentářů: 33
    13.12. 04:55 | Zajímavý software

    Projekt D7VK dospěl do verze 1.0. Jedná se o fork DXVK implementující překlad volání Direct3D 7 na Vulkan. DXVK zvládá Direct3D 8, 9, 10 a 11.

    Ladislav Hagara | Komentářů: 0
    12.12. 16:00 | Nová verze

    Byla vydána nová verze 2025.4 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem nových nástrojů v oficiálním oznámení na blogu.

    Ladislav Hagara | Komentářů: 2
    12.12. 12:44 | IT novinky

    Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) zveřejnil Národní politiku koordinovaného zveřejňování zranitelností (pdf), jejímž cílem je nejen zvyšování bezpečnosti produktů informačních a komunikačních technologií (ICT), ale také ochrana objevitelů zranitelností před negativními právními dopady. Součástí je rovněž vytvoření „koordinátora pro účely CVD“, jímž je podle nového zákona o kybernetické … více »

    Ladislav Hagara | Komentářů: 27
    12.12. 04:33 | Nová verze

    Vývojáři KDE oznámili vydání balíku aplikací KDE Gear 25.12. Přehled novinek i s náhledy a videi v oficiálním oznámení.

    Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (35%)
     (48%)
     (19%)
     (17%)
     (22%)
     (14%)
     (24%)
     (15%)
     (17%)
    Celkem 467 hlasů
     Komentářů: 19, poslední 11.12. 20:04
    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: 246×
    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.