Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
• Socket wordt geopend (zie vb1)
• << Dataverkeer >>
• User sluit applicatie
• Thread B wil thread A met socket sluiten (vb2)
Maar ik denk dat ik voor de selectfunctie ga inderdaad.
Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!
Ik ben even aan de slag gegaan met select() en ik krijg het vermoeden dat je dit niet op files kan gebruiken. Het gaat hier om een device daar een kernelmodule spullen in stopt. Deze haal ik dan userspace er weer uit met read() voorheen.
Echter blijft select niet wachten en gaat gewoon door (ookal is de fd_set geZERO'd e.d.). poll() Was ook niet veel soeps. Wat kan ik het beste hiervoor gebruiken?
Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!
Kijk eens of deze alle IO operaties implementeert.
ASSUME makes an ASS out of U and ME
edit: ik zie idd dat select() niet is geïmplementeerd, ik dacht dat de kernel wel zo slim was om dit zelf te constateren. Even aanpassen dus.
[ Voor 37% gewijzigd door LauPro op 24-02-2008 09:03 ]
Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| static ssize_t k8055_poll(struct file *file, poll_table * wait) { struct usb_k8055 *dev; int rc; dev = (struct usb_k8055 *)file->private_data; //if (dev->changed == 2) { //dev->changed = 1; poll_wait(file, &dev->wait, wait); //} if (dev->changed != 2) { dev->changed = 1; rc = wait_event_interruptible(dev->wait, dev->changed == 2); /* if (rc != 0) { return rc; } */ } return POLLIN | POLLRDNORM; } |
1
2
3
4
| pfd.fd = fd; pfd.events = POLLIN; pfd.revents = 0; result = poll(&pfd, 1, 1000); |
Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!
[edit]
Ik vraag me trouwens nu af of je ueberhaupt wel zou moeten blocken in de poll callback van je device driver.
Alle voorbeelden die ik heb gevonden zetten vlaggen aan de hand van een status die ergens anders is gemaakt ( bv adhv de data van in -en output buffers )
[edit2]
Ik weet niet of je em bij de hand hebt maar volgens mij is dit het naslagwerk voor Linux driver development:
http://lwn.net/Kernel/LDD3/
[ Voor 65% gewijzigd door farlane op 25-02-2008 12:10 ]
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Tja blocken of niet. Ik zie wel dat poll intern kernel device driver poll meerdere keren kan aanroepen. Voor zover ik begreep moet de driver bij poll onmiddelijk wat returnen als er nieuwe data is, en anders wachten totdat. Het probleem is dan dat de userspace timeout volgens mij nergens meer aan bod komt. Of zit dat in poll_wait() verwerkt ofzo.
Ik heb het idee dat die pollfunctie nog meer fops gebruikt ofzo.
Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!
Ik denk inderdaad dat dat het geval is. Het grote voordeel is dat er genoeg voorbeelden te vinden zijn in de kernel source treeLauPro schreef op maandag 25 februari 2008 @ 15:05:
Het probleem is dan dat de userspace timeout volgens mij nergens meer aan bod komt. Of zit dat in poll_wait() verwerkt ofzo.
Ik heb het idee dat die pollfunctie nog meer fops gebruikt ofzo.
Btw, voor zover ik weet komen select en poll bij dezelfde callback uit maar zeker weten doe ik het niet.
[ Voor 10% gewijzigd door farlane op 25-02-2008 15:28 ]
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
1
2
3
4
5
| if (dev->changed == 2) { return POLLIN | POLLRDNORM; }else{ return 0; } |
[ Voor 189% gewijzigd door LauPro op 26-02-2008 08:57 ]
Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!