Service/thread/semaphore


#1

Dames, Heren,

Ik ga in deze “post thread” een service/thread/semaphore ondersteund programma maken die ik ga gebruiken bij mijn andere programma’tjes isdnlog, gpslogd, poort van gnunetd, etc.

Ik ga ‘het’ hoofdzakelijk uit mysqld halen want dat is lekker stabiel en veelgebruikt. Mysqld heeft ook weer source code (nt_serv.c) van iemand anders gebruikt --) Daarnaast simuleert het de posix threads (Linux) calls voor WIN95 en NT.

Een 0.00 versie (fshservice-0.00.zip) heb ik op mijn anonieme ftp server gezet (www.foonsearch.com). Ik heb het alleen gecompileerd, dus nog niet op werking getest.

De vriendelijke groet Jan Marco


#2

Dames, Heren,

Ik zie in mysqld dat een ‘service’ naar windows threads wordt gemapped. Dit specifieke gedeelte is door iemand anders in het verleden een keer gemaakt en mysql heeft dat gewoon gebruikt --)

Daarnaast worden in mysqld de posix threads (Linux) calls voor WIN95 en NT ook op windows threads geprogrammeerd. Dit gedeelte moet ik nog zo omzetten dat het kan compileren en dat het ook gaat werken in Visual Studio C. Ik zie in dit gedeelte ook code om memory leaks op te sporen. Ik zal mogelijk ook het andere (service) gedeelte moeten bestuderen om het aan de praat te krijgen.

Ik heb een tweezijdige strategie voor aankomend weekend. Ik ga beginnen om gnunetd (Linux) om te zetten naar 1 file en het zo maken dat gnunetd op Linux en Windows (visual studio) goed compileert/executeert. Voor Windows heb je m.i. het extract uit myslqd nodig om posix threads te emuleren.

Indien gnunetd goed werkt op Linux en Windows kan je nadat je hebt bestudeerd hoe het werkt iets simpels er in gaan maken dat je data in een netwerk kan uitwisselen. Bijvoorbeeld een gnunetd (windows) heeft een nieuwe 06 nummer “gevonden”, daarna gaan de andere gnunetd servers (windows en Linux) deze nieuwe info overnemen in de onderliggende (“foondump”) databases.

Je hebt dan een eerste versie van de online versie. Het is best een leuke uitdaging. In hoofdlijn heb ik wel in mijn hoofd wat ik wil echter hoe het precies gaat worden is mij nog niet zo duidelijk. Het wordt mij vaak wel duidelijker als je er concreet mee gaat beginnen,

De vriendelijke groet Jan Marco

P.S. Tip van Nils --)

GNUnet is designed to use pthreads. You can get a windows port from
http://sources.redhat.com/pthreads-win32/


#3

Dames, Heren,

Ben momenteel bezig om service sjabloon programma (gnunet-0.00.zip) te maken.

Ik kan het programma al wel als service installeren en removen. Echter het opstarten als service wil nog niet. Zie ook appendix A. Ik weet al wel waar het fout gaat. Alleen moet nog even gefixt worden.

De vriendelijke groet Jan Marco

Appendix A: Feedback van Nils:

Hi,

I have a problem with starting it as a service

Looks like:
http://www.hiteksoftware.com/mize/Knowledge/articles/050.htm
http://support.microsoft.com/default.aspx?scid=kb;en-us;322140&Product=sql2k

The service control manager calls the ServiceMain() function of the
service’s executable. This function has to register a Service Control
Handler and set the “running” status as quickly as possible. Otherwise
you’ll get the error described above.
See
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/servicemain.asp

Nils

#4

Dames, Heren,

Best erg leuk uitzoek werk --)

De service gnunetd-0.00.zip start nu ook op. Alleen kan ik hem niet meer stoppen.

mysqlwatch.c uit mysql distributie werkt wel goed. Ik zal even “zoek de tien verschillen” met nt_servc.cpp moeten doen.

Volgende week Linux (gnunetd van http://www.gnu.org/software/gnunet/ ) in 1 file werkend krijgen. Hierna ga ik het swappen naar mijn windows sjabloon service programma.

Je kan dan files anomiem onderling uitwisselen. Hierna zal ik iets inbouwen dat je (telefoon, etc) records kan uitwisselen. Mogelijk kan je 1 record als 1 file zien.

De vriendelijke groet Jan Marco

P.S. Het is best experimenteel. Ben namelijk “wat” directories kwijt geraakt. Kan nog niet duiden hoe dit komt.


#5

Dames, Heren,

De service gnunetd-0.00.zip start nu ook op. Alleen kan ik hem niet meer stoppen.

Gisteren uitgezocht hoe de gnunetd.exe service gestopt kan worden. Het “Onderbreken” en “Doorgaan” werkt momenteel nog niet.

Het draait nu op mijn laptop. Wat mij opviel is dat het programmanaam in hoofdletters staat in de tasklist. Mogelijk gebeurt dit na een reboot.

Gnunetd.exe heeft eerst 2088 kb geheugen. Na een lange periode is dit geslonken tot 36 kb geheugen in de tasklist.

Ik denk dat ik volgend weekend eerst hashd.exe ga maken met het “format service programma”. Met hashd ga je het filesysteem aflopen en alle footprints van alle files in MySQL zetten.

In de tasklist kan je een proces indelen in de volgende categorieen “Realtime, Hoog, Hoger dan Normaal, Normaal, Lager dan normaal, Laag”. Ik moet nog uitzoeken hoe je dit in het service format programma kan programmeren. N.B. Je wilt zo weinig mogelijk handmatige handelingen doen --)

De vriendelijke groet Jan Marco

P.S. De werking van format “ service programma” op hoofdlijnen:

win_main2(…) is het hoofdprogramma.

while (!ready_to_exit)
pthread_cond_wait(&COND_thread_count,&LOCK_thread_count);

Blijft het hoofdprogramma ophangen totdat ready_to_exit waar wordt. Dit kan door signalering op {SIGINT,SIGILL,SIGFPE,SIGSEGV,SIGTERM,SIGBREAK,SIGABRT}.
Zie ook init_signals(void).

Als hij door bovengenoemde statement (in win_main2() ) heen is gekomen gaat hij de opgebouwde zaken weer afbreken (pthread_kill(…),clean_up_mutexes2(), etc.).


#6

Hoi Dames, Heren,

Ik heb op mijn anonieme ftp server (www.foonsearch.com) gnunetd-0.02.zip gezet. Dit is een service sjabloon programma. Ik ben deze versie momenteel aan het testen. Zal geen rare dingen doen want zit niet veel extra logica in.

gnunetd -install

Hierna in “services window” hem laten starten.

gnunetd -remove

Om te kunnen removen zal je hem eerst moeten stoppen in “services window”.

Ik denk aan om een “startservice” optie te programmeren:

gnunetd -startservice

te maken want dan kan je hem in een bat file laten starten.

De vriendelijke groet Jan Marco

P.S. “Stop” en “Resume” werken nog niet. Deze zijn namelijk ook niet in mysqld geimplementeerd. Ik heb mysqld als voorbeeld programma gebruikt. Je krijgt op deze wijze een structuur van een goed programma. Zonder proefondervindelijk veel tijd te investeren om ook op deze goede structuur te komen.


#7

Dames, Heren,

De service programma template gnunetd-0.03.zip werkt nu het starten en stoppen als service --)

“Pauze” en “Resume” heb ik uitgezet. Pauze staat bij mysqld wel aan alleen werkt niet. Bij Filezilla werkt “Pauze” en “Resume” ook niet. Ik denk dat dit bij veel meer services niet werkt.

Ik ben momenteel bezig om 1 file van de Linux gnunetd.c te maken die op Linux en Windows (Visual Studio) compileert/executeert. Alle informatie in de database stoppen.

Ik zal een samenvoeging van FileZilla en Megafoon gaan maken voor een MFC GUI. Deze foonsearch.exe GUI gaat dan inprikken in de verschillende database(s).

De vriendelijke groet Jan Marco


#8

Dames, Heren, Ter Info,

Ik heb net alle gnunetd source van http://www.gnu.org/software/gnunet/ in 1 file gedaan. Het zijn 54000 regels aan source code. Ik zal eerst het op Linux aan de praat maken. Hierna de code swappen in mijn lege Windows gnunetd-0.03.zip programma. Wel het zo houden dat het op Linux en Windows (Visual studio) blijft werken. Je krijgt een netwerk van peers (pc’s met bekende ip nummers) op internet. Voor path seperator maar de Linux variant kiezen om het path gelijksoortig schrijfwijze in de database te krijgen.

Met FileZilla kan je files van de peers op gaan halen en de hashcode van de files gaan bepalen. Path + hashcode zet je in een database en deze database kan je ook onderling gaan uitwisselen. Hoef je dus geen files meer op te halen om de files op te zoeken.

In foondump staan ook www. Adressen op een subscriber entry (info record). Je kan natuurlijk je eigen www. adres in foondump gaan invoegen. Hierna kan je in FileZilla dit adres gebruiken om mensen wel of geen toegang tot je ftp server te geven.

De vriendelijke groet Jan Marco


#9

gasp
Alsjeblieft doe dat nou toch niet… :frowning:


#10

Hoi RGJ,

Alsjeblieft doe dat nou toch niet…

Het is geen doel opzich om alles in 1 file te doen. Ik heb er wel meer structuur voor mijzelf in aangebracht. Alle defines bij elkaar zetten en type defs op 1 plaats onderbrengen. Ik leer er een hoop van. Bij het compileren kom ik nu veel dezelfde procedures tegen die een andere bedoeling hebben.

Ik hoop het volgend weekend draaiend op Linux en alle data in MySQL te hebben. Een week later beginnen met het omzetten naar Visual studio. Hierna het gaan integreren met FileZilla,

De vriendelijke groet Jan Marco


#11

Dames, Heren,

Ik heb testgnunetd-0.01.zip op mijn anonieme ftp server gezet. Het werkt nog niet zonder de configuratiefile (gnunetd.conf) van gnunetd op Linux.

Ik ga nu beginnen om de configuratie in mysql onder te brengen. Ik gebruik gnunetd_config_map.xls om de configuratiedatabase te gaan vullen. Deze heb ik ook op mijn ftp server gezet. De configuratieitems heb ik wel iets beter gestructureerd dan ze standaard in gnunet zitten.

Het grootste verschil van mijn versie in vergelijking tot het orgineel is dat ik geen gebruik van libraries maak. Voor elk protocol en applicatie gebruiken ze bij gnunet een library. Zonder library programmeren kan je het gemakkelijk poorten naar een andere omgeving.

Het programma heb ik vanmorgen met 100 threads van het hoofdprogramma getest.

Volgens RGJ maak je een stel threads aan, en als dat op een gegeven moment niet genoeg is nog een paar erbij. En als er een stel een tijd lang ongebruikt zijn dan sluit je ze weer.

“Dynamische resource pooling” heet dat. Ik heb zelf nog niet zo’n beeld waarom je veel threads (kopieën van hoofdprogramma) zou moeten gebruiken. (N.B. Apache maakt bij opstarten een hele boel threads aan.)

Je hebt op de pc toch maar 1 processor. Ik kan met multiprocessors wel voorstellen dat het sneller gaat met meerdere threads.

Of wordt er voor elke tcp verbinding met een buurserver een andere thread gebruikt?

Het programma loopt nu door zonder dat info in de database wordt gezet of gehaald. Alleen wordt het filesysteem gebruikt om sleutelfiles van buurservers op te slaan.

De koppeling om alle gegevens (sleutelfiles, blokken, etc) in mysql te zetten moet ik nog programmeren/aanzetten.

Er zit nog wel een afhankelijkheid in met het project gmp (libary libgmp). Als het straks werkt zonder deze afhankelijkheid ga ik het poorten naar Visual Studio C.

Ik hoop jullie voldoende ingelicht te hebben, zo nee, gaarne reactie,

De vriendelijke groet Jan Marco


#12

Dames, Heren,

Ik heb testgnunetd-0.02.zip op mijn anonieme ftp server gezet. Ik ben teruggegaan naar 1 thread. Je kan dan gemakkelijk zien dat de thread blijft werken. N.B. Het is een stuk moeilijker te checken welke threads het nog doen als je bijvoorbeeld 100 concurrent hebt draaien. Mogelijk ga ik in mysql database bijhouden wat de status is van de threads. Ik heb al iets aan gnunet toegevoegd om de “thread id” bij te kunnen houden.

Ik heb nu in totaal 6 Mutex_locks uitgezet, want anders blijft het programma hangen op een mutex_lock.

De high/low level link naar mysql heb ik uitgezet, want het programma “moet” doorlopen ook al kan je de database (mysql) niet benaderen.

Ik ga nu rustig beginnen om eerst de configuratie gegevens in mysql onder te brengen en aan te zetten in testgnunetd. Hierna ga ik de high/lowlevel link naar mysql programmeren/aanzetten,

De vriendelijke groet Jan Marco


#13

De oplossing hiervoor is meer threads gebruiken. Meer mutex locks aanmaken sloopt de programmalogica. Een mutex is niet voor niets een mutex.


#14

Hoi RGJ,

Bedankt voor jouw terugkoppeling —)

De oplossing hiervoor is meer threads gebruiken. Meer mutex locks aanmaken sloopt de programmalogica. Een mutex is niet voor niets een mutex.

Ik test nu met 5 threads. Het gaat nog steeds kapot op Mutex_locks. Ik haal de mutex_locks waarop het kapot gaat er uit en hoop dat het dan beter gaat lopen.

Ik weet dat Christian Mutex_locks inbouwde als hij segmentation errors kreeg.

Ik zal mij wel meer in het programma/mutex technologie moeten verdiepen.

De vriendelijke groet Jan Marco

P.S. Ik zie ook dat alleen het UDP protocol connect. Leuke uitdaging om uit te zoeken waarom de andere protocollen (tcp, nat) niet meer werken.


#15

Hoi RGJ,

Het grootste verschil tussen “mijn” test programma (testgnunetd.c) en het orginele programma is dat ik info naar en uit database heb uitgezet.

Het programma stopte aldoor op een MUTEX_LOCK(&lock). Dus alle “MUTEX_LOCK(&lock)” er uit gehaald.

Ik denk dat Christian te ruim de mutex lock heeft gezet. Is er een procedure in het kritische gebied die blijft wachten, dan wordt de mutex lock nooit meer vrij gegeven. Het wachten zou ik gesimuleerd kunnen hebben door het niet kunnen vinden van info in de database. N.B. Het programma moet zoveel mogelijk doorlopen ook al kan hij geen info vinden.

M.i. kan je beter alleen om de echt kritische gebieden een mutex lock te zetten. Bijvoorbeeld tellers die geupdate moeten worden.

De vriendelijke groet Jan Marco


#16

Hoi RGJ,

Erg leuk om testgnunetd te poorten naar mysql --)

Bij het verder omzetten kreeg ik steeds segmentation errors rondom mysql queries. Ik ben er achter gekomen dat het komt dat er maar 1 connection naar mysql database gemaakt wordt. Gaat bijvoorbeeld thread 3 een select statement uitvoeren en voordat het resultaat vrijgegeven wordt gaat thead 5 ook een select doen dan heb je problemen.

Christian heeft het ‘opgelost’ door een mutex op het kritisch gebied te zetten. Mutexen geeft op elkaar wachten en het ‘verstoken’ van meer cpu cycles.

Ik denk dat ik per thread een connection naar mysql ga opzetten. Dus zoveel mogelijk zonder mutexen werken.

Het programma heb ik net naar 1 thread teruggezet en het blijkt al een hele poos te werken.

Een ander belangrijk punt is hoevaak de parameters uitgevraagd worden in de tijd gezien. Soms zie ik dat hij een paar seconden super veel activiteiten heeft waarbij hij in elke seconden een paar honderd keer 1 parameter opvraagt.

Je kan beter elke 6 sekonden een andere parameter uit mysql lezen en vergelijken met de interne waarde. Is de waarde verschillend neem dan de waarde van mysql en zet in de log database dat je de parameter hebt aangepast. De MFC client kan dan in log file zien dat de demon het heeft overgenomen.

De vriendelijke groet Jan Marco


#17

Hoi RGJ,

Het is mij gelukt om van de configuratie file (gnunet.conf) af te komen. Het zit nu (gelukkig) in mysql --)

Ik heb nog wel “mutex problemen”. Met meerdere threads van het hoofdprogramma crasht hij op databasecall fouten. Ik wil wel naar dynamisch opschalen en verminderen van threads toewerken.

Met 1 thread werkt het wel voor een langere periode, dus tijdelijk weer naar 1 thread ‘terugschakelen’.

Van het weekend ga ik proberen de fout m.b.t. decryptData op te lossen.

acceptSessionKey:
sizeof(SESSIONKEY)=16!
decryptData(&sessionkeySigned->body.key, &key, sizeof(SESSIONKEY))=-1

Kan natuurlijk dat de inhoud van de parameters fout zijn, maar ik denk ook aan de libary die gebruikt wordt. Mogelijk link ik de verkeerde library mee,

De vriendelijke groet Jan Marco