[pso] Tema 2 Windows

Ioan MANEA pso@cursuri.cs.pub.ro
2 Sep 2004 08:02:41 -0000


mda, era un exemplu continutul DDK-ului (problema era cu numarul de '\'-uri) :)
Oricum, acum merge chestia asta, dar nu merg altele:

1. Nu se genereaza nici moarte intreruperile alea! Adica initializez totul frumos, scriu in port, si nimic!
Daca aveti vreo idee..

2. am scos APIC-ul ala (sau cum se numeste) - adica pc-ul meu acum este Standard PC.
Problema este ca COM-urile nu mai sunt disabled, sunt cu driverele Not Loaded, si orice modific peacolo, tot drivere not loaded au (in Device Manager, nu apare un X rosu, ci un semn de excalamare galben).
Ar putea fi din cauza asta problema 1? Adica eu sa nu pot comunica liber si neingradit cu COM-urile?

3. Cum fac in windows "adormirea" unui proces pana cand un anumit eveniment are loc? (ceva gen interruptible_sleep_on() din linux + functia de trezire).
Ideea este ca din ce am vz. eu prin DDK, structurile folosite nu prea functioneaza ca "eveniment", adica daca undeva se face ceva de genu' WakeUp(eveniment), acel eveniment ramane triggered (deci, daca in alt loc se face sleep_on(eveniment) de fapt nu se face sleep, se iese imediat).

Se pare ca acel sleep_on ar fi WaitForSingleObject(), iar la eveniment pot folosi spin_lock, mutex sau event.

As avea asa:
void A()
{
...
WaitForSingleObject(obj);
...
}

void B()
{
...
if (ceva)
    WakeUp(obj);
...
}


As vrea asa:
cand intra in A, sa se opreasca la wait.
cand intra in B, daca if (ceva) da true, sa se faca acel wakeUp si sa plece procesul care s-a oprit in A.

pana aici e ok, dar din ce am citit, DACA avem invers:
Ajunge un proces, mai intai, in B, si face WakeUp, obj ramane triggered.
Cum ajunge alt proces in A, ceva mai tarziu, nu se mai opreste la Wait.
As dori sa se opreasca la A, si sa plece DOAR cand primeste un wakeup DUPA ce s-a oprit (sa nu conteze wakeup-urile dinainte).
(ca o informatie, in sleep se ajunge daca trimit ceva pe cablu. Cand termin tot de trimis, ar trebui sa-mi vina wakeup-ul.)

Deci, ce tip de element de sincronizare sa folosesc la implementarea FLUSH-ului?

Teoretic, as putea folosi un mutex ceva, pe care sa-l tot eliberez, si pe care sa-l tot "iau", si sa am un while, de genul:
while (transmit_ceva)
{
WaitForSingleObject(obj);
}

iar dincolo:
{
..
transmit_stuff();
wakeUp(obj) - nu-mi amintesc functia de eliberat mutex, dar e prin ddk, am dat de ea acasa :)
}

si deci stau in while ala si ma trezesc la fiecare transmisie, dar poate exista o metoda mai frumoasa (din transmit_stuff() sa-i dau wakeUp).





----

Home, no matter how far...
http://www.home.ro