<div dir="ltr"><span style="color:rgb(33,33,33)">"Deci ordinea ar fi:</span><br class="gmail_msg" style="color:rgb(33,33,33)"><span style="color:rgb(33,33,33)">1. CreateProcess(a)</span><br class="gmail_msg" style="color:rgb(33,33,33)"><span style="color:rgb(33,33,33)">2. CloseHandle(hWrite)</span><br class="gmail_msg" style="color:rgb(33,33,33)"><span style="color:rgb(33,33,33)">3. WaitProcess(a)"</span><div>Deja fac asta. O sa verific in implementare din nou (desi am verificat de mai multe ori)</div><div><br></div><div>"<span style="color:rgb(33,33,33)">Am acces la proiect, dar n-am acces la fișiere. Vezi că e scriptul de</span></div><span style="color:rgb(33,33,33)">care ți-a zis și Mihai mai devreme și care dă acces la toată echipa de teme."</span><div><span style="color:rgb(33,33,33)">Din pacate nu am folosit la inceput acel script si mi-a facut eu un repo manual. Nu mi-a mers din cateva incercari autentificarea din script, asa ca am renuntat. O sa adaug manual responsabilii pentru tema.</span></div><div><span style="color:rgb(33,33,33)">Ti-am dat drepturi de <b>reporter</b> acum. Nu vazusem ca pentru <b>guest</b> nu poti accesa codul. Imi poti confirma daca ai access? Daca nu, ce level ar trebui sa iti acord?</span></div><div><span style="color:rgb(33,33,33)"><br></span></div><div><span style="color:rgb(33,33,33)">Darius</span></div></div><br><div class="gmail_quote"><div dir="ltr">On Sun, Apr 2, 2017 at 4:29 PM Costin Lupu <<a href="mailto:costin.lup@gmail.com">costin.lup@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 04/02/2017 03:44 PM, Darius-Florentin Neatu wrote:<br class="gmail_msg">
> Eu intrebasem despre limita pentru nSize de la Pipe pentru ca in<br class="gmail_msg">
> implementarea de pe Windows fac a | b | c serial. Adica dupa ce s-a<br class="gmail_msg">
> terminat a, b incepe sa citeasca. Dupa ce s-a terminat b, c incepe sa<br class="gmail_msg">
> citeasca.<br class="gmail_msg">
<br class="gmail_msg">
Aici e o problemă. Subcomenzile a, b și c *trebuie* să ruleze în<br class="gmail_msg">
paralel. De altfel ne putem gândi la operatorul '|' ca la un operator de<br class="gmail_msg">
paralelizare, cu diferența că subcomenzile comunică între ele.<br class="gmail_msg">
<br class="gmail_msg">
> Cu limita cel putin 20000000 pentru nSize trec toate testele local &<br class="gmail_msg">
> vmchecker (doar 2 teste au nevoie de limita > cea default), dar as vrea<br class="gmail_msg">
> imi iasa pipe-ul eficient si pe windows.<br class="gmail_msg">
<br class="gmail_msg">
Ce te faci dacă între a, b și c se transferă mai mult de 20MB? Ai avut<br class="gmail_msg">
noroc că nu e cazul în suita de teste.<br class="gmail_msg">
<br class="gmail_msg">
> Am o varianta in care fac paralel. Ex: a | b (b sa poate citi din pipe<br class="gmail_msg">
> imediat dupa ce a face primul write).<br class="gmail_msg">
<br class="gmail_msg">
Asta e varianta pe care trebuie s-o implementezi.<br class="gmail_msg">
<br class="gmail_msg">
> In do_on_pipe fac 2 threaduri:<br class="gmail_msg">
> - thread 1: redirect, CreateProcess("a", ..), undo redirect (inchide<br class="gmail_msg">
> handle de fisiere deschisi in redirect sau veniti de la comanda parinte<br class="gmail_msg">
> pentru pipe - deci inchide write handle din pipe)<br class="gmail_msg">
> - thread 2: redirect, CreateProcess("b", ...) si nu se opreste<br class="gmail_msg">
<br class="gmail_msg">
E clar aici că procesul b așteaptă să citească ceva pentru că celălalt<br class="gmail_msg">
capăt (cel de scriere) nu a fost închis.<br class="gmail_msg">
<br class="gmail_msg">
> Cand rulez a | b apare in terminal tot rezultatul comenzii "a | b", am<br class="gmail_msg">
> pus printuri in program: thread 1 asteapta procesul copil corespunzator<br class="gmail_msg">
> lui a, face close la capatul de write, da ExitThread(cod_copil), iar<br class="gmail_msg">
> parintele il asteapta cu success.<br class="gmail_msg">
<br class="gmail_msg">
Ideea e să închizi în părinte capătul de scriere de îndată ce nu mai<br class="gmail_msg">
nevoie de el, adică după CreateProcess și înainte de terminarea<br class="gmail_msg">
procesului a. Deci ordinea ar fi:<br class="gmail_msg">
1. CreateProcess(a)<br class="gmail_msg">
2. CloseHandle(hWrite)<br class="gmail_msg">
3. WaitProcess(a)<br class="gmail_msg">
<br class="gmail_msg">
> Cu toate acestea comanda b ramane in asteptare. Eu ma asteptam ca<br class="gmail_msg">
> aceasta abordare sa fie corecta: procesul b sa se opreasca deoarece s-a<br class="gmail_msg">
> terminat procesul a si in thread1 am inchis capatul de write. Deci cand<br class="gmail_msg">
> el termina de citit tot din pipe.<br class="gmail_msg">
><br class="gmail_msg">
> As vrea sa stiu daca logica mea e buna. Am tot modificat configurarile,<br class="gmail_msg">
> in niciuna nu se opreste b.<br class="gmail_msg">
<br class="gmail_msg">
Logica pare ok. Din păcate nu pot să mă uit pe codul tău pentru că n-am<br class="gmail_msg">
access la fișiere. Folosește uneltele de care ți-a zis și Mihai pentru a<br class="gmail_msg">
vedea ce handle-uri rămân agățate.<br class="gmail_msg">
<br class="gmail_msg">
> Implementarea se gaseste pe Gitlab[1]. Diferenta intre cele 2 abordari<br class="gmail_msg">
> de la pipe o face linia 552.<br class="gmail_msg">
> // #define PIPE_WITH_THREADS<br class="gmail_msg">
> Afecteaza doar comportamentul functiei do_on_pipe.<br class="gmail_msg">
><br class="gmail_msg">
> P.S. Am dat access pentru Costin si Razvan. Unde gasesc lista cu<br class="gmail_msg">
> resposabilii de la tema X? (sa le pot da access tuturor pentru etapa de<br class="gmail_msg">
> corectare)<br class="gmail_msg">
<br class="gmail_msg">
Am acces la proiect, dar n-am acces la fișiere. Vezi că e scriptul de<br class="gmail_msg">
care ți-a zis și Mihai mai devreme și care dă acces la toată echipa de teme.<br class="gmail_msg">
<br class="gmail_msg">
Costin<br class="gmail_msg">
</blockquote></div>