oem software frankreich
Free Autodesk Design Center upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Cheap Adobe Encore inkjet definition oem software
student discount adobe cs
Online Office financial planning software australia?
Buy cheap PhotoShop CS 2
Nero 7 Windows Xp 64 Bit iCorrect EditLab Pro 4.52
software oem cd line business
Adobe Photoshop Student Discount Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Buy Acad locate software oem files
widows oem software,
Remove Autodesk Connectivityedmwsserverexe window 2000 upgrade download
quark xpress 6 crack
Quark Xpress Training Uk Oem software bundle oem software bundles 814.
software oem italiano
Order Dreamweaver Cs4 adobe photo shop element
oem software cds;
Buy Microsoft Office Enterprise microsoft window 2000 professional oem software
cheap software downloads; Discounts On Adobe Software oem Microsoft Office;
Adobe Standard,
Review Of Autodesk Maya "oem office 2000 software"
"Upgrade Version"
Adobe Photoshop Cs4 Final dvd to pocket pc 1.2.4
import oem software cds
Prices Of Microsoft Office 2007 The Logo Creator MEGA pak 3.6
financial planning software australia?
Purchase Windows Activation Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Buy Windows Product Key software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Adobe Lightroom Educational Discount microsoft office 2003 oem
locate software oem files
Purchase Flash Cs4 widows oem software,
window 2000 upgrade download
Oem Repair Set Up Software quark xpress 6 crack
Oem software bundle oem software bundles 814.
Download Autodesk Flame And Flint Torrent software oem italiano
adobe photo shop element
Microsoft Office 2003 Sales oem software cds;
microsoft office software oem;
Retail Box cheap software downloads;
oem Microsoft Office;
Microsoft Visual Basic Rad Professional V1.01 adobe standard encoding
"oem office 2000 software"
Learn Photoshop Cs upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Photoshop Cs2 Retail Price inkjet definition oem software
The Logo Creator MEGA pak 3.6
Finance Accounting Software financial planning software australia?
Buy cheap PhotoShop CS 2
Windows 7, Release Date iCorrect EditLab Pro 4.52
software oem cd line business
Adobe Creative Suite 3 Design Premium Edition Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Windows Ie Ver 7 locate software oem files
uk software oem frontpage
Oem Software Microsoft Office window 2000 upgrade download
quark xpress 6 crack
Buy Acrobat 8 Oem software bundle oem software bundles 814.
software oem italiano Buy Autocad Lt 2004 adobe photo shop element
oem software buys
Counter Strike Full Version Download microsoft window 2000 professional oem software
cheap software downloads;
Microsoft Office Word 2003 oem Microsoft Office;
adobe standard encoding
Microsoft Office Oem "oem office 2000 software"
upgrade window 2000 to xp
Oem Software Suppliers In The Us dvd to pocket pc 1.2.4
inkjet definition oem software
Buy Used Autocad The Logo Creator MEGA pak 3.6
financial planning software australia? Photoshop 7 Price Buy cheap PhotoShop CS 2
how to activate reget deluxe
Windows Messenger Live 7 software oem cd line business
adobe any cs2 from photo photo shop shop upgrade version
Microsoft Project 2003 Professional (deutsch) microsoft office 2003 oem
locate software oem files
Windows Xp Error Code 7 widows oem software,
window 2000 upgrade download
Buy Cheap Oem Software Adobe Creative Suite 3 Design Premium For Win quark xpress 6 crack
Oem software bundle oem software bundles 814.
Autodesk Inventor Download software oem italiano
adobe photo shop cs 2 oem software cds;
microsoft oem software cd
Autocad Estimator cheap software downloads;
oem full version
Educational Software adobe standard encoding
"oem office 2000 software"
Buy Windows Vista Retail upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Photoshop Cs3 Cheap Buy inkjet definition oem software
The Logo Creator MEGA pak 3.6
Quark Xpress 6 Passport Multilanguage financial planning software australia?
Buy cheap PhotoShop CS 2
Vista Ultimate To Buy iCorrect EditLab Pro 4.52
software oem cd line business
Adobe Acrobat Sale Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Windows 7 M1 Vs locate software oem files
uk software oem frontpage
Oem Software Flyers window 2000 upgrade download
quark xpress 6 crack
Windows 7 Team Blog Oem software bundle oem software bundles 814.
software oem italiano
Licence Pro Upgrade Window Xp adobe photo shop element
oem software cds;
Adobe Web Design Premium microsoft window 2000 professional oem software
cheap software downloads;
Oem Software 450 oem Microsoft Office;
adobe standard encoding
Intuit Quicken Rental Property Manager 2009 "oem office 2000 software"
upgrade window 2000 to xp
Autodesk P dvd to pocket pc 1.2.4
inkjet definition oem software
Oem Software Macintosh The Logo Creator MEGA pak 3.6
financial planning software australia?
Nero 7 Essentials Drivers For Windows Vista Buy cheap PhotoShop CS 2
how to activate reget deluxe
Office 2004 software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Adobe Acrobat 7.0 And Older microsoft office 2003 oem
locate software oem files
Buy Microsoft Office Powerpoint widows oem software,
window 2000 upgrade download
Adobe Writer quark xpress 6 crack
Oem software bundle oem software bundles 814.
Autodesk Inventor Series 8 software oem italiano
adobe photo shop element
Microsoft Office Downloads oem software cds;
microsoft window 2000 professional oem software
Purchase Windows Vista Home cheap software downloads;
oem Microsoft Office;
Quark Xpress 6.0 Crack adobe standard encoding
"oem office 2000 software"
Oem Software Backups upgrade window 2000 to xp
download worm armageddon full version;
Update Microsoft inkjet definition oem software
The Logo Creator MEGA pak 3.6
Microsoft Office 07 financial planning software australia?
Buy cheap PhotoShop CS 2
Office 2003 Upgrade iCorrect EditLab Pro 4.52
software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
magix vs steinberg
Buy Windows Vista With locate software oem files
widows oem software,
Cs3 Design Standard window 2000 upgrade download
quark xpress 5 download
Autocad Mechanical Oem software bundle oem software bundles 814.
software oem italiano
Windows Internet Explorer 7 Problems adobe photo shop element
oem software cds;
Download Star Craft Full Version microsoft window 2000 professional oem software
cheap software downloads;
Oem Autocad Software oem Microsoft Office;
adobe standard encoding
Steganos Internet Anonym Pro 2006 8.0.1 "oem office 2000 software"
upgrade window 2000 to xp
Microsoft Windows Xp Home dvd to pocket pc 1.2.4
inkjet definition oem software
Logo Windows 7 The Logo Creator MEGA pak 3.6
financial planning software australia?
Purchase Microsoft Office Professional 2007 Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Microsoft Office Xp 2003 software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Originlab Originpro 8.0 microsoft office 2003 oem
locate software oem files
Fast Autodesk Autocad 2009 Fdownload Free widows oem software,
window 2000 upgrade download
Oem Software Scams quark xpress 6 crack
Oem software bundle oem software bundles 814.
Autocad Trial software oem italiano
adobe photo shop element
Windows 7 Ces oem software cds;
microsoft window 2000 professional oem software
cheap software downloads;
oem full version game
Windows Xp Updates adobe standard encoding
"oem office 2000 software"
Macromedia Studio 8.0 English upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Autodesk Com inkjet definition oem software
The Logo Creator MEGA pak 3.6
Readiris Pro 11.5 For Mac financial planning software australia?
Buy cheap PhotoShop CS 2
Buy Quark Express iCorrect EditLab Pro 4.52
software oem cd line business
Free Autodesk Rivet Blocks Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Windows 7 Beta Takes The Test locate software oem files
widows oem software,
Internet Explorer 7 For Windows Xp Sp2 window 2000 upgrade download
quark xpress 6 crack
Creative Suite Serial Oem software bundle oem software bundles 814.
software oem italiano
Microsoft Office Software 2003 adobe photo shop element
oem software cds;
Adobe Cs2 Trial microsoft window 2000 professional oem software
cheap software downloads;
Adobe Design Premium Download oem Microsoft Office;
adobe standard encoding
Free Autocad Autodesk "oem office 2000 software"
upgrade window 2000 to xp
Ms Office Discount dvd to pocket pc 1.2.4
inkjet definition oem software
Adobe After Effects Free The Logo Creator MEGA pak 3.6
finance software
Cheap Oem Software 20 Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Buy Books software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
legal oem software
Steinberg Nuendo 3.1 widows oem software,
window 2000 upgrade download
Prices For Microsoft Office 2003 quark xpress 6 crack
Oem software bundle oem software bundles 814.
Photoshop Software Sale software oem italiano
adobe photo shop element
Oem Adobe Download Software oem software cds;
microsoft window 2000 professional oem software
Microsoft Upgrade cheap software downloads;
oem Microsoft Office;
Buy Microsoft Office Ultimate 2007 adobe standard encoding
oem nero software
Microsoft Office Home Student upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Macromedia Flash Professional 8 inkjet definition oem software
The Logo Creator MEGA pak 3.6
Install Windows Explorer 7 financial planning software australia?
Buy cheap PhotoShop CS 2
Windows 7 Build 6801 iCorrect EditLab Pro 4.52
software oem cd line business
Paragon Partition Manager 8.5 Server Edition Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
locate software oem files
uk software oem frontpage
Quark Xpress Demo window 2000 upgrade download
quark xpress 6 crack
Itunes 7 Wont Open On Windows Xp Oem software bundle oem software bundles 814.
software oem italiano
Symantec Winfax Pro V 10.03 adobe photo shop element
oem software cds;
Buy Windows Xp Service Pack 2 microsoft window 2000 professional oem software
cheap software downloads;
Buy Microsoft oem Microsoft Office;
adobe standard encoding Low Cost Oem Software Cheap "oem office 2000 software"
"Upgrade Version"
Autodesk Obits dvd to pocket pc 1.2.4
inkjet definition oem software
Buy Microsoft Word The Logo Creator MEGA pak 3.6
financial planning software australia?
Discount Adobe Design Premium Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Software Easter Eggs software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Windows Internet Explorer 7 Downloads microsoft office 2003 oem
locate software oem files
Cheap Vista widows oem software,
window 2000 upgrade download
Autocad Licence Cost quark xpress 6 crack
Oem software bundle oem software bundles 814.
Windows Ie 7 software oem italiano
adobe photo shop element
Adobe Creative Suite 4 Master oem software cds;
microsoft window 2000 professional oem software
Buy Windows Vista Key cheap software downloads;
oem Microsoft Office;
Windows Media Player 7 Skins adobe standard encoding
"oem office 2000 software"
Discount Autocad Software upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Firewall Software inkjet definition oem software
The Logo Creator MEGA pak 3.6
Cheap Windows Vista Business financial planning software australia?
Buy cheap PhotoShop CS 2
Photoshop Elements 4.0 Buy iCorrect EditLab Pro 4.52
software oem cd line business
Microsoft Buy Adobe Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Mcafee all in 1 2006
locate software oem files
symantec oem software,
Used Photoshop Cs2 window 2000 upgrade download
quark xpress 6 crack
Autocad Price In Oem software bundle oem software bundles 814.
software oem italiano
Prices For Autocad adobe photo shop element
oem software cds;
Corel Videostudio X2 microsoft window 2000 professional oem software
cheap software downloads;
Rosetta Stone Version 3 Arabic Level 1, 2 For Mac oem Microsoft Office;
adobe standard encoding
Buy Microsoft Office Software "oem office 2000 software"
upgrade window 2000 to xp
Cheap Oem Downlaod Software dvd to pocket pc 1.2.4
inkjet definition oem software
Microsoft Office For Sale The Logo Creator MEGA pak 3.6
financial planning software australia?
Office Xp Standard Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
software oem cd line business
adobe any cs2 from photo photo shop shop upgrade version
Buy Cheap Autodesk Autocad 2009 microsoft office 2003 oem
locate software oem files
Oem Software Is It Legal widows oem software,
window 2000 professional upgrade!
Oem Macintosh Software Down Loads quark xpress 6 crack
Oem software bundle oem software bundles 814.
Purchase Windows Software software oem italiano
adobe photo shop element
Adobe Creative Suite Design Premium oem software cds;
microsoft window 2000 professional oem software
Rosetta Stone Version 3 German Level 1, 2 3 Set For Mac cheap software downloads;
oem Microsoft Office;
Adobe Photoshop Lightroom 1.2 For Mac adobe standard encoding
"oem office 2000 software"
Chrome Photoshop upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Microsoft Office 2007 Professional Full Version inkjet definition oem software
The Logo Creator MEGA pak 3.6
Explore The New Taskbar Features In Windows 7 Beta financial planning software australia?
Buy cheap After Effects 5.5 Production Bundle
Microsoft Windows 7 Swot Offerings iCorrect EditLab Pro 4.52
software oem cd line business
Windows 7 Netzero Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Mcafee all in 1 2006
Microsoft Office Suite 2003 locate software oem files
uk software oem frontpage
Adobe Indesign Cs2 Cropmarks window 2000 upgrade download
quark xpress 6 crack
Adobe After Effects Cs3 Oem software bundle oem software bundles 814.
software oem italiano
Internet Explorer 7 Dynamic Installer Para Windows Xp adobe photo shop element
oem software cds;
Quark Xpress 6.1 Keygen microsoft window 2000 professional oem software
cheap software downloads;
Autodesk Inventor Free Download oem Microsoft Office;
adobe standard encoding
Master Collection Creative Suite "oem office 2000 software"
upgrade window 2000 to xp
Download Msn 7 Per Windows 2000 dvd to pocket pc 1.2.4
import oem software cds
Dreamweaver Flash The Logo Creator MEGA pak 3.6
financial planning software australia?
Autocad 2006 Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Used Photoshop Cs software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Asistente De Impresion Por Lotes Autodesk microsoft office 2003 oem
locate software oem files Cheap Microsoft Office 2007 widows oem software,
window 2000 professional upgrade!
Cs2 Premium quark xpress 6 crack
Oem software bundle oem software bundles 814.
Photoshop Cs2 To Buy software oem italiano
adobe photo shop element
Full Professional Sp2 Version Window Xp oem software cds;
microsoft window 2000 professional oem software
Adobe Design Premium 3 cheap software downloads;
oem Microsoft Office;
Photoshop Resellers adobe standard encoding
"oem office 2000 software"
Microsoft Office Powerpoint 2003 upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Indesign Version 4 Software inkjet definition oem software
The Logo Creator MEGA pak 3.6
Office Xp Small Business financial planning software australia?
Buy cheap After Effects 5.5 Production Bundle
Oem Adobe Photoshop7 Software Cheap iCorrect EditLab Pro 4.52
software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Mcafee all in 1 2006
Deals Cheap Oem Software locate software oem files
widows oem software,
Transform Xp Into Windows 7 window 2000 upgrade download
quark xpress 6 crack
Fireworks Photoshop Oem software bundle oem software bundles 814.
software oem italiano
Autodesk 3d Rapidshare Indir adobe photo shop element
oem software buys
Photoshop Cs 3 Extended microsoft window 2000 professional oem software
cheap software downloads;
Cheap Adobe Premiere oem Microsoft Office;
adobe standard encoding
Buy Windows Vista Cd Key "oem office 2000 software"
upgrade window 2000 to xp
Microsoft Windows 7 Beta dvd to pocket pc 1.2.4
inkjet definition oem software
Adobe Acrobat Student Discount The Logo Creator MEGA pak 3.6
finance software
Download Ie 7 Windows Xp Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Adobe Cs 3 software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Quarkxpress 7.3 Passport microsoft office 2003 oem
legal oem software
Unpin From Start Menu Windows 7 widows oem software,
window 2000 upgrade download
Cheap Adobe Cheap Oem Software quark xpress 6 crack
Oem software bundle oem software bundles 814.
Autocad Electrical software oem italiano
adobe photo shop element
Adobe Suite 3 Design Premium oem software cds;
microsoft window 2000 professional oem software
Buy Microsoft Office Picture cheap software downloads;
oem full version game Flash 8 Tutorial Ebook adobe standard encoding
oem nero software
Autodesk Inventor Professional upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Microsoft Frontpage inkjet definition oem software
The Logo Creator MEGA pak 3.6
Buying Oem Software financial planning software australia?
Buy cheap PhotoShop CS 2
Fastreport iCorrect EditLab Pro 4.52
software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Mcafee all in 1 2006
How To Draw Torsion Spring On Autodesk Inventor locate software oem files
widows oem software,
Longhorn Vista window 2000 upgrade download
quark xpress 6 crack
What Is Windows 7 Oem software bundle oem software bundles 814.
software oem italiano
Microsoft Office Student Sale adobe photo shop element
oem software cds;
Lotus Note Oem Software microsoft window 2000 professional oem software
cheap software downloads;
Microsoft Reveals Windows 7 oem Microsoft Office;
adobe standard encoding
Autocad "oem office 2000 software"
upgrade window 2000 to xp
Photoshop Cs3 Academic Discount dvd to pocket pc 1.2.4
inkjet definition oem software
Photoshop Styles The Logo Creator MEGA pak 3.6
finance software
Price For Autocad Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Price Of Latest Version Of Microsoft Office software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Purchase Windows Xp Service Pack 2 microsoft office 2003 oem
locate software oem files
Solid Edge V17 widows oem software,
window 2000 upgrade download
Software Retail Oem Symantec Microsoft Adobe quark xpress 6 crack
oem software autoroute
Cheap Software Solutions software oem italiano
adobe photo shop element
Adobe Acrobat Reader 6.0 oem software cds;
microsoft window 2000 professional oem software
Adobe Cs3 Design Premium Os X cheap software downloads;
oem Microsoft Office;
Adobe Photoshop Cs2 Price adobe standard encoding
oem nero software Microsoft Office Xp Sale upgrade window 2000 to xp
download worm armageddon full version;
Adobe Software Sales inkjet definition oem software
student discount adobe cs
Visio Office financial planning software australia?
Buy cheap PhotoShop CS 2
Adobe Illustrator Cs2 Cheap iCorrect EditLab Pro 4.52
software oem cd line business
Cheap Microsoft Office Uk Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Photoshop Cs 3 Download locate software oem files
widows oem software,
Purchase Microsoft Office Pro window 2000 upgrade download
quark xpress 5 download
Windows Internet Explorer 7 Windows Xp Oem software bundle oem software bundles 814.
software oem italiano
Order Microsoft Windows Xp adobe photo shop element
oem software cds;
Oem Software Adobe Audition microsoft window 2000 professional oem software
cheap software downloads;
Microsoft Isa 2000 Server oem Microsoft Office;
adobe standard encoding
Directx 7 For Windows Xp "oem office 2000 software"
upgrade window 2000 to xp
Microsoft Office Professional 2007 Upgrade dvd to pocket pc 1.2.4
inkjet definition oem software
Microsoft Frontpage 2003 The Logo Creator MEGA pak 3.6
financial planning software australia?
Microsoft Office Xp Price Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Cheap Adobe Photoshop 7 software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
legal oem software
Oem Software Scam widows oem software,
window 2000 upgrade download
Oem Software Wholesalers quark xpress 6 crack
Oem software bundle oem software bundles 814.
software oem italiano
adobe photo shop cs 2
Autodesk Guide oem software cds;
microsoft office software oem;
Buy Microsoft Vista Online cheap software downloads;
oem Microsoft Office; Software Dream Weaver adobe standard encoding
oem nero software
Purchasing Photoshop upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Photoshop Cs Requirements inkjet definition oem software
The Logo Creator MEGA pak 3.6
Buy Autocad For financial planning software australia?
Buy cheap PhotoShop CS 2
Price Illustrator iCorrect EditLab Pro 4.52
software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Mcafee all in 1 2006
Windows 7 7015 locate software oem files
widows oem software,
Cheap Photoshop Cs4 Oem window 2000 upgrade download
quark xpress 5 download
Microsoft Adobe Oem software bundle oem software bundles 814.
software oem agreements
Adobe Cs3 Design Premium 2dvd adobe photo shop element
oem software cds;
Buy Windows Xp Media Center Edition microsoft window 2000 professional oem software
cheap software?
Autocad Lt Prices oem Microsoft Office;
adobe standard encoding
Dreamweaver Dw "oem office 2000 software"
upgrade window 2000 to xp
Free Download Autodesk Autocad 2004 Installer dvd to pocket pc 1.2.4
inkjet definition oem software
Buy Photoshop Brushes The Logo Creator MEGA pak 3.6
financial planning software australia?
Tutorial Autodesk Revit Building 90 Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
How To Buy Photoshop software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Cheap Software Autodesk microsoft office 2003 oem
locate software oem files
Photoshop 7.0 Prices widows oem software,
window 2000 professional upgrade!
Photoshop Brushes Used quark xpress 6 crack
oem software autoroute
Serial Number Cs4 software oem italiano
adobe photo shop element
Cheap Autocad 2007 oem software cds;
microsoft window 2000 professional oem software
Buy Downloadable Software cheap software downloads;
oem Microsoft Office;
Adobe Photoshop Com adobe standard encoding
"oem office 2000 software"
Order Acad upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Adobe Acrobat 7 Professional For Mac inkjet definition oem software
The Logo Creator MEGA pak 3.6
Windows 7 Release Dates financial planning software australia?
Buy cheap PhotoShop CS 2
Autodesk 3ds Max 8 Serial iCorrect EditLab Pro 4.52
software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Mcafee all in 1 2006
Microsoft Office 2007 Professional Oem locate software oem files
widows oem software,
Eyeon Fusion 5.0 window 2000 upgrade download
quark xpress 6 crack
Adobe Photoshop Oem software bundle oem software bundles 814.
software oem italiano Diablo 2 Full Version Download adobe photo shop element
oem software backups adobe golive
Price For Microsoft Office 2007 microsoft window 2000 professional oem software
cheap software downloads;
Microsoft Office Standard Price oem Microsoft Office;
adobe standard encoding
Office Upgrade "oem office 2000 software"
upgrade window 2000 to xp
Oem Dvd Burn Software dvd to pocket pc 1.2.4
import oem software cds
Student Discount The Logo Creator MEGA pak 3.6
financial planning software australia?
Adobe Photoshop 7.0 For Sale Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Software Now Oem software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Adobe Design Suite Premium Cs3 Us R Copy With K microsoft office 2003 oem
locate software oem files
Discount Education widows oem software,
window 2000 upgrade download
Creative Suite Cs quark xpress 6 crack
Oem software bundle oem software bundles 814.
Oem Software Price software oem italiano
adobe photo shop element
Buy Quark Xpress 7 oem software cds;
microsoft office software oem;
Adobe Design Premium Creative Suite V3 cheap software downloads;
oem full version
Features Of Windows 7 adobe standard encoding
"oem office 2000 software"
Price Of Autocad 2007 upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Oem Download Ejay Full Version inkjet definition oem software
The Logo Creator MEGA pak 3.6
Microsoft Office 2007 Prices financial planning software australia?
Buy cheap PhotoShop CS 2
Windows Xp Computers For Sale iCorrect EditLab Pro 4.52
software oem cd line business
Best Prices For Windows Vista Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Windows 7 Beta Exe locate software oem files
widows oem software,
Quark Xpress Passport 6.0 window 2000 upgrade download
quark xpress 6 crack
Purchase Adobe Acrobat Writer Oem software bundle oem software bundles 814.
software oem italiano
Purchase Window Vista adobe photo shop element
oem software cds;
Buy Vista Basic microsoft window 2000 professional oem software
cheap software downloads;
Cheap Microsoft Office 2003 oem Microsoft Office;
adobe standard encoding
Daracteristicas De Windows 7 "oem office 2000 software"
upgrade window 2000 to xp
Microsoft Windows 7 Nonfinancial Plans dvd to pocket pc 1.2.4
inkjet definition oem software
Download Windows Media Player 7 The Logo Creator MEGA pak 3.6
financial planning software australia?
Microsoft Windows Xp Home Edition Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Photoshop Discounts software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
legal oem software
Windows 7 7000 widows oem software,
window 2000 professional upgrade!
Student Discount For Microsoft Office quark xpress 6 crack
Oem software bundle oem software bundles 814.
Windows Vista software oem italiano
adobe photo shop brush
Cheap Windows Vista Home Premium oem software cds;
microsoft window 2000 professional oem software
Autocad License Cost cheap software downloads;
oem Microsoft Office;
Dj Software adobe standard encoding
"oem office 2000 software" Where To Buy Photoshop Cs3 upgrade window 2000 to xp
download worm armageddon full version;
Student Adobe Acrobat inkjet definition oem software
The Logo Creator MEGA pak 3.6
Learning Maya 2008 Autodesk Animation And Modeling financial planning software australia?
Buy cheap PhotoShop CS 2
Descarga Gratuita De Autodesk Autocad 2009 iCorrect EditLab Pro 4.52
software oem cd line business
Autodesk 3ds Max 8.0 Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Buy Oem Online Software locate software oem files
widows oem software,
Photoshop 7.0 Sale window 2000 upgrade download
quark xpress 6 crack
Photoshop 7.0 Retail Oem software bundle oem software bundles 814.
software oem italiano Adobe Cs2 Student Discount adobe photo shop element
oem software buys
Windows 7 Download Beta microsoft window 2000 professional oem software
cheap software downloads; Adobe Flash Cs3 Professional oem Microsoft Office;
Adobe Standard,
Oem Software Faq "oem office 2000 software"
upgrade window 2000 to xp
Apple Iwork08 dvd to pocket pc 1.2.4
inkjet definition oem software
Architectural Desktop Price The Logo Creator MEGA pak 3.6
finance software
Full Free Version Autodesk 3ds Max V7 Downloads Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
When To Buy Windows Vista software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Cost Of Autocad microsoft office 2003 oem
locate software oem files
Best Buy Autocad widows oem software,
window 2000 upgrade download
Downloadable Software Oem Pinnacle quark xpress 6 crack
Oem software bundle oem software bundles 814.
Prices Of Photoshop software oem italiano
adobe photo shop element
Buy Windows Vista Enterprise oem software cds;
microsoft window 2000 professional oem software
Windows Xp Oem cheap software downloads;
oem Microsoft Office;
Adobe Photoshop 7 Prices adobe standard encoding
"oem office 2000 software"
Financial Software Mac upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Cheap Microsoft Windows Xp inkjet definition oem software
The Logo Creator MEGA pak 3.6
Ms Windows Xp Professional X64 financial planning software australia?
Buy cheap PhotoShop CS 2
Illustrator Cs2 iCorrect EditLab Pro 4.52
software oem cd line business
Software Give-away Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Windows Media Player 7 Downloads locate software oem files
widows oem software,
Mediachance Dvdlab Pro window 2000 upgrade download
quark xpress 6 crack
Ms Project Office Oem software bundle oem software bundles 814.
software oem italiano
Photoshop Price Comparison adobe photo shop element
oem software cds;
Macromedia Dreamweaver Software microsoft window 2000 professional oem software
cheap software downloads;
Emr Software oem Microsoft Office;
adobe standard encoding
Price Of Autocad 2008 "oem office 2000 software"
upgrade window 2000 to xp
Microsoft Office Cd Key dvd to pocket pc 1.2.4
inkjet definition oem software
Advanced Photoshop The Logo Creator MEGA pak 3.6
finance software
Autodesk Rivenditori Puglia Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Adobe Photoshop Cs4 Setup software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Download Full Version Game microsoft office 2003 oem
locate software oem files
Adobe Design Help widows oem software,
window 2000 upgrade download
Download Window Xp Upgrade Oem quark xpress 6 crack
Oem software bundle oem software bundles 814.
Order Windows Xp Service Pack software oem italiano
adobe photo shop element
Acrobat 7.0 Professional oem software cds;
microsoft oem software cd
Oem Software Corel Word Perfect cheap software downloads;
oem Microsoft Office;
Microsoft Office Standard Edition adobe standard encoding
"oem office 2000 software" Discount Security Software upgrade window 2000 to xp
download worm armageddon full version;
Buy Cheap Photoshop Cs4 inkjet definition oem software
The Logo Creator MEGA pak 3.6
Windows Xp Software Sale financial planning software australia?
Buy cheap PhotoShop CS 2
Oem Software Abobe Cs iCorrect EditLab Pro 4.52
software oem cd line business
Adobe Creative Suite Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Microsoft Office 2007 Ultimate Mcaffe Antivirus Total Norton System Works locate software oem files
widows oem software,
Autodesk Land Desktop 2007 window 2000 upgrade download
quark xpress 6 crack
Cheap Software Adobe Acrobat Oem software bundle oem software bundles 814.
software oem italiano
Buy Microsoft Windows Vista Ultimate adobe photo shop element
oem software cds;
Digicel Font microsoft window 2000 professional oem software
cheap software downloads;
Fallout 3 On Windows 7 oem Microsoft Office;
adobe standard encoding
Raxco Perfectdisk 2008 Professional "oem office 2000 software"
upgrade window 2000 to xp
Adobe Creative Design Premium dvd to pocket pc 1.2.4
inkjet definition oem software
Cs4 Quantum The Logo Creator MEGA pak 3.6
financial planning software australia?
Windows 7 Wallpaper Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Windows 7 Photoshop Cs2 software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Autocad Lite Prices microsoft office 2003 oem
locate software oem files
Autodesk Max Student Version widows oem software,
window 2000 upgrade download
Spec On Windows 7 quark xpress 6 crack
Oem software bundle oem software bundles 814.
Adobe Flash Sale software oem italiano
adobe photo shop cs 2
Adobe Creative Suite 2.0 oem software cds;
microsoft window 2000 professional oem software
Oem Full Version cheap software downloads;
oem Microsoft Office;
Buy Autocad 14 adobe standard encoding
"oem office 2000 software"
Cheap Software Cd upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Office Sbe inkjet definition oem software
The Logo Creator MEGA pak 3.6
Autodesk Symbles financial planning software australia?
Buy cheap PhotoShop CS 2
Quark Xpress Training iCorrect EditLab Pro 4.52
software oem cd line business
Autocad Academic Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Photoshop Cs Shortcuts locate software oem files
uk software oem frontpage
Purchase Windows Xp Media Center window 2000 upgrade download
quark xpress 6 crack
Adobe Cs4 Key Oem software bundle oem software bundles 814.
software oem italiano
Microsoft Office Oem Price adobe photo shop element
oem software cds;
Paloalto Business Plan Pro 2007 Premier Edition 9.06 microsoft window 2000 professional oem software
cheap software downloads; Office Suite oem Microsoft Office;
Adobe Standard,
Adobe Illustrator Cs "oem office 2000 software"
upgrade window 2000 to xp
Order Quarkxpress dvd to pocket pc 1.2.4
inkjet definition oem software
Cheap Windows Xp Upgrade The Logo Creator MEGA pak 3.6
financial planning software australia?
Uninstall Windows Internet Explorer 7 7.0.5730.1 Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Discount Adobe Products software oem cd line business
adobe any cs2 from photo photo shop shop upgrade version
microsoft office 2003 oem
legal oem software
Office 2003 Student widows oem software,
window 2000 upgrade download
Autodesk Impression quark xpress 6 crack
Oem software bundle oem software bundles 814.
Finance Software Download software oem italiano
adobe photo shop element
Autodesk Revit oem software cds;
microsoft window 2000 professional oem software
Portale Autodesk Student Community cheap software downloads;
oem Microsoft Office;
Buy Oem Software Online adobe standard encoding
oem nero software
Purchase Photoshop 7.0 upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Remograph Remo 3d 1.4 inkjet definition oem software
The Logo Creator MEGA pak 3.6
Oem Adobe Store financial planning software australia?
Buy cheap PhotoShop CS 2
Oem Software For Purchase iCorrect EditLab Pro 4.52
software discount oem
Liquid Series Horn Section Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Windows 7 Pobierz locate software oem files
widows oem software,
Download Adobe Photo Shop 8 window 2000 upgrade download
quark xpress 6 crack
Difference Between Oem And Retail Software Oem software bundle oem software bundles 814.
software oem italiano
Cheapest Cad adobe photo shop element
oem software cds;
Buy Cheap Corel Oem Software microsoft window 2000 professional oem software
cheap software downloads;
Oem Agreement For Software oem Microsoft Office;
Adobe Standard,
Quark Xpress 6.1 Update "oem office 2000 software"
upgrade window 2000 to xp
I.e. 7 For Windows 98se dvd to pocket pc 1.2.4
inkjet definition oem software
The Logo Creator MEGA pak 3.6
finance software Discount Microsoft Office 2007 Buy cheap PhotoShop CS 2
"house window"
Lease Autocad software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Adobe Flash Cs4 Beta microsoft office 2003 oem
locate software oem files
Licensing Adobe widows oem software,
window 2000 upgrade download
Buy Microsoft Office 2003 For quark xpress 6 crack
oem software autoroute
Microsoft Office Enterprise 2007 Prices software oem italiano
adobe photo shop element Buy Cheap Quark Oem Software oem software cds;
microsoft office software oem;
Autodesk Student Engineering cheap software downloads;
oem Microsoft Office;
Dreamweaver 8 adobe standard encoding
oem nero software
Cheapest Window Vista upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Best Buy Adobe Photoshop inkjet definition oem software
The Logo Creator MEGA pak 3.6
Windows 7 2009 financial planning software australia?
Buy cheap PhotoShop CS 2
Windows 7 Taskbar For Windows Xp iCorrect EditLab Pro 4.52
software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Mcafee all in 1 2006
Prices Microsoft Office Home locate software oem files
widows oem software,
Microsoft Office 2003 To Buy window 2000 upgrade download
quark xpress 6 crack
Photoshop Class Oem software bundle oem software bundles 814.
software oem italiano
Order Files adobe photo shop element
oem software cds;
Autodesk Toxik microsoft window 2000 professional oem software
cheap software downloads;
Buy Discount Adobe Acrobat oem Microsoft Office;
adobe standard encoding
Download Full Version Diner Dash "oem office 2000 software"
"Upgrade Version"
Internet Explorer 7 For Windows Vista dvd to pocket pc 1.2.4
inkjet definition oem software
Photoshop Teacher Discount The Logo Creator MEGA pak 3.6
finance software Cheap 3d Cad Buy cheap PhotoShop CS 2
how to activate reget deluxe
Cheap Adobe Software Mac software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Free Autodesk Autocad microsoft office 2003 oem
locate software oem files
Buy Oem Software Downloads widows oem software,
window 2000 upgrade download
Oem Windows Programming Software quark xpress 6 crack
Oem software bundle oem software bundles 814.
Autodesk Key Generator software oem italiano
adobe photo shop element
Windows Vista Ultimate Student Discount oem software cds;
microsoft office software oem;
cheap software downloads;
oem full version game
Hp 720 Driver Windows 7 adobe standard encoding
"oem office 2000 software"
Microsoft Office Professional Plus 2007 Price upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Photoshop Discount inkjet definition oem software
The Logo Creator MEGA pak 3.6
Windows Media Player 7 financial planning software australia?
Buy cheap After Effects 5.5 Production Bundle
Microsoft Office Oem Software iCorrect EditLab Pro 4.52
software oem cd line business
Download Internet 7 For Windows Xp Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Extensis Suitcase X1 For Mac locate software oem files
widows oem software,
Cheap Accounting Software window 2000 upgrade download
quark xpress 6 crack
Ie 7 For Windows 2000 Oem software bundle oem software bundles 814.
software oem italiano
Adobe Flash Cs4 adobe photo shop element
oem software buys
Windows 7 Beta Release Notes microsoft window 2000 professional oem software
cheap software downloads;
Microsoft Xp oem Microsoft Office;
adobe standard encoding
Finance Softwares "oem office 2000 software"
upgrade window 2000 to xp
Fl Studio 5.0.0 dvd to pocket pc 1.2.4
inkjet definition oem software
Best Price On Autocad The Logo Creator MEGA pak 3.6
financial planning software australia?
Windows Explorer 7 Free Download Buy cheap PhotoShop CS 2
"house window"
Oem Software With Hardware software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Curso Autodesk microsoft office 2003 oem
locate software oem files
Realize Voice 3.51 widows oem software,
window 2000 professional upgrade!
Windows 7 Blue Card quark xpress 6 crack
Oem software bundle oem software bundles 814.
Diskeeper 9.0 532 software oem italiano
adobe photo shop element
Windows Xp Discounts oem software cds;
microsoft window 2000 professional oem software
Adobe Creative Suite 5 Master Collection For Mac cheap software downloads;
oem Microsoft Office;
Autodesk W adobe standard encoding
"oem office 2000 software"
Microsoft Office Programs upgrade window 2000 to xp
download worm armageddon full version;
Autocad Buy inkjet definition oem software
The Logo Creator MEGA pak 3.6
Discount Windows Office financial planning software australia?
Buy cheap PhotoShop CS 2
Windows 2000 Startup Order iCorrect EditLab Pro 4.52
software discount oem
Photoshop Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Office 2003 Small Business locate software oem files
uk software oem frontpage
Purchase Pagemaker window 2000 upgrade download
quark xpress 6 crack
Sale Microsoft Office Oem software bundle oem software bundles 814.
software oem italiano
Final Cut Studio adobe photo shop element
oem software buys
Windows 7 Requirements microsoft window 2000 professional oem software
cheap software downloads;
Cheap Oem Software Downloed oem Microsoft Office;
adobe standard encoding
Dreamweaver Extension "oem office 2000 software"
upgrade window 2000 to xp
Cakewalk Sonar 8.0 Producer Edition dvd to pocket pc 1.2.4
inkjet definition oem software
Purchase Microsoft Office Key The Logo Creator MEGA pak 3.6
financial planning software australia?
How To Add Free Disk Space Windows Internet Explorer 7 Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Ms Access Office software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Microsoft Office Sbe 2003 microsoft office 2003 oem
locate software oem files
Oem Full Version Window Xp widows oem software,
window 2000 upgrade download
Oem Software Licensing Site quark xpress 6 crack
Oem software bundle oem software bundles 814.
Photoshop Cs4 software oem italiano
adobe photo shop element
Cheap Encore oem software cds;
microsoft window 2000 professional oem software
Dvdidle Pro 5.9.5.0 cheap software downloads;
oem Microsoft Office; Internet 7 Download For Windows Xp adobe standard encoding
oem nero software
Creative Suite 2 upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Adobe Creative Suite 3 Student Discount inkjet definition oem software
The Logo Creator MEGA pak 3.6
Autodesk University History financial planning software australia?
Buy cheap PhotoShop CS 2
Download Full Version Pc Game iCorrect EditLab Pro 4.52
software oem cd line business
Autocad 2008 Discount Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Mcafee all in 1 2006
Adobe Photoshop Cs4 64 Bit locate software oem files
widows oem software,
Adobe Dreamweaver Cs3 window 2000 upgrade download
quark xpress 6 crack
Microsoft Mappoint Europe 2009 Oem software bundle oem software bundles 814.
software oem italiano
Autocad Lite Price adobe photo shop element
oem software cds;
Sell Adobe microsoft window 2000 professional oem software
cheap software downloads;
Chief Architect 10.0 Oem Software Disk oem Microsoft Office;
adobe standard encoding
Order Photoshop Cs3 "oem office 2000 software"
upgrade window 2000 to xp
Quarkxpress dvd to pocket pc 1.2.4
inkjet definition oem software
The Logo Creator MEGA pak 3.6
finance software
Reallusion Crazytalk 6 Pro Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Finance Company Software software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Oem Dvd Burners Software microsoft office 2003 oem
locate software oem files
Microsoft Office Xp Standard widows oem software,
window 2000 upgrade download When Will Windows 7 Be Released quark xpress 6 crack
oem software autoroute
Ontrack Easyrecovery Professional 6.0 software oem italiano
adobe photo shop cs 2
Learning Autodesk Maya 2008 Foundation oem software cds;
microsoft office software oem;
Where To Buy Vista cheap software downloads;
oem Microsoft Office;
Microsoft Window Update adobe standard encoding
"oem office 2000 software"
Windows 7 Free Trial upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Buy Microsoft Office On inkjet definition oem software
The Logo Creator MEGA pak 3.6
Oem Software Soft4download financial planning software australia?
Buy cheap PhotoShop CS 2
Autodesk 3d 2008 Indir iCorrect EditLab Pro 4.52
software oem cd line business
Software For Schools Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Buy Cheap Avg Anti-virus Software Discount locate software oem files
widows oem software,
Buying Autocad
window 2000 upgrade download
quark xpress 5 download
Cheap Microsoft Office 2004 Oem software bundle oem software bundles 814.
software oem italiano
Adobe Cs Design Premium adobe photo shop element
oem software buys
Microsoft Office 2007 Key microsoft window 2000 professional oem software
cheap software downloads;
Purchase Microsoft Office 2007 Online oem Microsoft Office;
adobe standard encoding
Cheap Graphics Software "oem office 2000 software"
upgrade window 2000 to xp
Buy Cheap Windows Software dvd to pocket pc 1.2.4
import oem software cds
Free Autodesk Serial Number The Logo Creator MEGA pak 3.6
financial planning software australia?
Autodesk Inventor Uk Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Adobe Image Ready software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Windows 7 Theme Download microsoft office 2003 oem
locate software oem files
Adobe Flash Student Discount widows oem software,
window 2000 upgrade download
Encore Guitars quark xpress 6 crack
oem software autoroute
Autodesk Autocad 2004 software oem italiano
adobe photo shop element
Download Internet Explorer 7 For Windows 2000 oem software cds;
microsoft office software oem;
Office Xp Upgrade cheap software downloads;
oem Microsoft Office;
Microsoft Windows Internet Explorer 7 adobe standard encoding
"oem office 2000 software"
Buy Encore 1.5 Dvd upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Adobe Design Suite inkjet definition oem software
The Logo Creator MEGA pak 3.6
Discount Computer Software financial planning software australia?
Buy cheap PhotoShop CS 2
Buy Windows Vista From iCorrect EditLab Pro 4.52
software oem cd line business
Autodesk Cabinet Software Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Adobe Photoshop Cs4 Keygen locate software oem files
uk software oem frontpage
Adobe Premiere Pro 1.5 window 2000 upgrade download
quark xpress 6 crack
Adobe Creative Suit 3 Design Premium Oem software bundle oem software bundles 814.
software oem italiano
Windows 7 Logs On To Wireless Internet adobe photo shop element
oem software buys
Buy Photoshop microsoft window 2000 professional oem software
cheap software downloads;
Purchase R12 oem Microsoft Office;
adobe standard encoding
Order Adobe Photoshop "oem office 2000 software"
upgrade window 2000 to xp
Does This Pc Have Windows 7 Or Windows 6 dvd to pocket pc 1.2.4
inkjet definition oem software
Microsoft Office Computers The Logo Creator MEGA pak 3.6
financial planning software australia? Micro. Windows Explorer 7 Buy cheap PhotoShop CS 2
"house window"
Buy Quark In software oem cd line business
adobe any cs2 from photo photo shop shop upgrade version
Autodesk 3d microsoft office 2003 oem
locate software oem files
Steinberg Cubase Sx 2.2.0.33 widows oem software,
window 2000 upgrade download
After Effects 6.0 Software quark xpress 6 crack
Oem software bundle oem software bundles 814.
When Can I By A Computer With Windows 7 software oem italiano
adobe photo shop element
Adobe Photoshop Cs V8 oem software cds;
microsoft window 2000 professional oem software
Windows 7 Tema cheap software downloads;
oem Microsoft Office;
Photoshop Cs2 Store adobe standard encoding
oem nero software Dreamweaver Software upgrade window 2000 to xp
download worm armageddon full version;
Windows Vista Student Discount inkjet definition oem software
The Logo Creator MEGA pak 3.6
Cheep Oem Software financial planning software australia?
Buy cheap After Effects 5.5 Production Bundle
Oem Version Adobe Software iCorrect EditLab Pro 4.52
software discount oem
Cheap Autodesk Inventor Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Purchase Vista Ultimate locate software oem files
widows oem software,
Oem Window Upgrade window 2000 upgrade download
quark xpress 6 crack
Microsoft Office 2007 Cd Key Oem software bundle oem software bundles 814.
software oem agreements
Adobe Creative Suite Academic adobe photo shop element
oem software buys
Cs2 Upgrade microsoft window 2000 professional oem software
cheap software downloads;
Where Can I Buy Photoshop oem Microsoft Office;
adobe standard encoding
Virtuallnk Business Icons "oem office 2000 software"
upgrade window 2000 to xp Buy Cheap Adobe Photoshop dvd to pocket pc 1.2.4
import oem software cds
Cheap Microsoft Office The Logo Creator MEGA pak 3.6
financial planning software australia?
Microsoft Exchange Server 2003 Enterprise Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Discount On Microsoft Office 2007 software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Autocad Block microsoft office 2003 oem
legal oem software
Autodesk Motion Builder 85 widows oem software,
window 2000 upgrade download
Office Trial Version quark xpress 6 crack
Oem software bundle oem software bundles 814.
Purchase Adobe Photoshop Cs3 software oem italiano
adobe photo shop element
Adope Photoshop Cs oem software cds;
microsoft window 2000 professional oem software
Microsoft Windows Xp Professional Upgrade cheap software downloads;
oem Microsoft Office;
Ms Project 2003 Server - Full Version adobe standard encoding
oem nero software
Autodesk Sales upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Cheap Oem Software Nj inkjet definition oem software
The Logo Creator MEGA pak 3.6
Adobe Photoshop Prices financial planning software australia?
Buy cheap PhotoShop CS 2
Dynamics Plug-in iCorrect EditLab Pro 4.52
software oem cd line business
Photoshop Cs Plugin Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Oem Adobe Creative Suite locate software oem files
widows oem software,
Buy Adobe Acrobate window 2000 upgrade download
quark xpress 6 crack
Oem Online Software Oem software bundle oem software bundles 814.
software oem italiano
Windows 7 Wireless Key adobe photo shop element
oem software cds;
Purchasing Windows Xp microsoft window 2000 professional oem software
cheap software downloads;
Software Oem License Now oem Microsoft Office;
adobe standard encoding
Computer Graphics Used "oem office 2000 software"
upgrade window 2000 to xp
Computer Security Software dvd to pocket pc 1.2.4
inkjet definition oem software
Business Software The Logo Creator MEGA pak 3.6
financial planning software australia?
Autodesk Maya 2010 X64 Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Windows 2000 Internet Explorer 7 software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Buy Adobe Acrobat Writer microsoft office 2003 oem
locate software oem files
Adobe Dreamweaver 8 widows oem software,
window 2000 upgrade download
Cheap Oem Software Adobe quark xpress 6 crack
oem software autoroute
Oem Software Adobe Acrobat software oem italiano
adobe photo shop element
Adobe Cs3 Design Premium 3 oem software cds;
microsoft window 2000 professional oem software
Autocad Training cheap software downloads;
oem Microsoft Office;
Cheap Adobe Dreamweaver Cs4 Oem adobe standard encoding
"oem office 2000 software"
Photoshop Cs3 Educator Discount upgrade window 2000 to xp
download worm armageddon full version;
Microsoft Office Cheapest inkjet definition oem software
The Logo Creator MEGA pak 3.6
Quark Xpress Upgrade Mac financial planning software australia?
Buy cheap PhotoShop CS 2
Freeserialnumber Autodesk Motionbuilder 75 iCorrect EditLab Pro 4.52
software oem cd line business
Computer Store Adobe Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
File Sharing Software locate software oem files
widows oem software,
Buy Adobe Creative Suite 3 Design Premium window 2000 upgrade download
quark xpress 6 crack
Buy Autocad 2000 Software Oem software bundle oem software bundles 814.
software oem italiano
Buy Oem Software Without Hardware Legal adobe photo shop element
oem software cds; Selling Adobe Oem Software On Ebay microsoft window 2000 professional oem software
cheap software?
Usa Autodesk Com oem Microsoft Office;
Adobe Standard,
Fruityloops Studio 8.0 Xxl Edition "oem office 2000 software"
"Upgrade Version"
Windows 7 Beta Burn Dvd dvd to pocket pc 1.2.4
inkjet definition oem software
Oem Full Version Of Diner Dash The Logo Creator MEGA pak 3.6
financial planning software australia?
Buy Adobe Bridge Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Altova Schemaagent 2009 software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Photoshop Cs Video Tutorials microsoft office 2003 oem
locate software oem files
Quark Xpress 5.0 Serial Number widows oem software,
window 2000 upgrade download
Mcafee Desktop Firewall 8.0.493 quark xpress 6 crack
Oem software bundle oem software bundles 814.
Oem Discount Software software oem italiano
adobe photo shop cs 2
Cheap Oem Software Coreldraw 11 oem software cds;
microsoft window 2000 professional oem software
Windows 7 Features cheap software downloads;
oem Microsoft Office;
Adobe Photoshop Cs5 Extended For Mac adobe standard encoding
"oem office 2000 software"
Oem Software Iso Download upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Adobe Photoshop Cs 3 Extended inkjet definition oem software
The Logo Creator MEGA pak 3.6
Adobe Creative Suite Master Collection financial planning software australia?
Buy cheap After Effects 5.5 Production Bundle
Freeway 4 Pro For Mac iCorrect EditLab Pro 4.52
software oem cd line business
Oem Software Online Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Software Sales Oem locate software oem files
uk software oem frontpage
Free Ebook Learning Autodesk Maya 8 Foundation window 2000 upgrade download
quark xpress 6 crack
Buy Microsoft Powerpoint Oem software bundle oem software bundles 814.
software oem italiano
Creative Suite Adobe adobe photo shop element
oem software cds;
Autocad Software Sales microsoft window 2000 professional oem software
cheap software downloads;
Coupon Adobe oem Microsoft Office;
adobe standard encoding
Order Adobe Photoshop Cs4 Extended "oem office 2000 software"
upgrade window 2000 to xp
Autodesk Showcase 2009 dvd to pocket pc 1.2.4
inkjet definition oem software
Purchase Tutorial The Logo Creator MEGA pak 3.6
financial planning software australia?
Adobe Golive Cs2 Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Price For Microsoft Office Standard software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Windows Vista Prices In microsoft office 2003 oem
locate software oem files
Photoshop Military Discount widows oem software,
window 2000 upgrade download
Dvdmaestro V2.9 quark xpress 6 crack
Oem software bundle oem software bundles 814.
Buy Cheap Indesign Version 4 software oem italiano
adobe photo shop element Buy Autodesk Impression oem software cds;
microsoft office software oem;
Adobe Cs3 Design Premium German cheap software downloads;
oem Microsoft Office;
Cheap Software Oem Apple adobe standard encoding
"oem office 2000 software"
Buy Cs4 Extended upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Adobe Cs3 Design Premium Full inkjet definition oem software
The Logo Creator MEGA pak 3.6
Quark Xpress Passport 7.02 financial planning software australia?
Buy cheap After Effects 5.5 Production Bundle
Cheap Ms Office iCorrect EditLab Pro 4.52
software discount oem
Buy Windows Xp Pro 64 Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Cheap Software Oem locate software oem files
widows oem software,
Used Windows Vista window 2000 upgrade download
quark xpress 6 crack
Office Developer Oem software bundle oem software bundles 814.
software oem italiano
Oem Software Ltd adobe photo shop element
oem software cds;
Windows Xp Shipped microsoft window 2000 professional oem software
cheap software downloads;
Autodesk 3ds oem Microsoft Office;
adobe standard encoding
Download Windows Media Player 7. "oem office 2000 software"
upgrade window 2000 to xp
Photoshop Cs 3 Tutorials dvd to pocket pc 1.2.4
inkjet definition oem software
Microsoft Office Software Downloads The Logo Creator MEGA pak 3.6
finance software
Discount Software Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
software oem cd line business
adobe any cs2 from photo photo shop shop upgrade version
Quark Xpress 6.1 Crack microsoft office 2003 oem
locate software oem files
Microsoft Office 10 widows oem software,
window 2000 upgrade download
Adobe Dreamweaver Student Discount quark xpress 6 crack
oem software autoroute
Windows Vista Tranformation 7 software oem italiano
adobe photo shop element
Purchase Microsoft Office Product oem software cds;
microsoft office software oem;
Change Xp cheap software downloads;
oem Microsoft Office;
Apostilas De Estudo Autodesk adobe standard encoding
"oem office 2000 software" Adobe Photoshop Design Premium upgrade window 2000 to xp
download worm armageddon full version;
Autocad 2d inkjet definition oem software
The Logo Creator MEGA pak 3.6
Oem Software For Hp Psc 950 financial planning software australia?
Buy cheap PhotoShop CS 2
Purchase Photoshop Cs2 iCorrect EditLab Pro 4.52
software oem cd line business
Buy Ebooks Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Cheapest Official Oem Software locate software oem files
widows oem software,
Adobe Creative Suite 3 Design Premium Free window 2000 upgrade download
quark xpress 6 crack
Windows Internet Explorer 7 Mui Pack Oem software bundle oem software bundles 814.
software oem italiano
Adobe Cs 4 adobe photo shop element
oem software cds;
Buying Adobe microsoft window 2000 professional oem software
cheap software downloads;
Windows 7 Kaufen oem Microsoft Office;
adobe standard encoding
Autocad 2000i "oem office 2000 software"
upgrade window 2000 to xp
Cheap Linux Software dvd to pocket pc 1.2.4
inkjet definition oem software
Utilisation Autodesk Data Management Server 2008 The Logo Creator MEGA pak 3.6
financial planning software australia?
Photoshop Techniques Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Cheap Oem Adobe Software software oem cd line business
adobe any cs2 from photo photo shop shop upgrade version
Adobe Creative Suite Premium microsoft office 2003 oem
locate software oem files
Quark Uygulama Xpress widows oem software,
window 2000 upgrade download
Adobe Creative Suite 4 Design Premium For Win quark xpress 6 crack
oem software autoroute
Photoshop Cs3 For Mac Buy software oem italiano
adobe photo shop element
Download Windows 7 Boot Screen oem software cds;
microsoft window 2000 professional oem software
cheap software downloads;
oem full version game
Microsoft Software adobe standard encoding
"oem office 2000 software"
Software Download Sites Autodesk Ldd upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Windows Beta 7 Download inkjet definition oem software
student discount adobe cs
Cs4 Flash financial planning software australia?
Buy cheap PhotoShop CS 2
Epson Picturemate Oem Software Cd iCorrect EditLab Pro 4.52
software discount oem
Autodesk Inventor 2009 Drawing Space Issues Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Microsoft Windows 7 locate software oem files
uk software oem frontpage
Oem Powerpoint Software window 2000 upgrade download
quark xpress 6 crack
Oem Preinstallation Kit Oem software bundle oem software bundles 814.
software oem italiano
Cheap Adobe Photoshop Elements adobe photo shop element
oem software cds;
Auto Cad Training microsoft window 2000 professional oem software
cheap software?
Photoshop Effects oem Microsoft Office;
Adobe Standard,
Iron Speed Designer V 2.0 "oem office 2000 software"
upgrade window 2000 to xp
Microsoft Windows Xp Dowload Internet Explorer 7 dvd to pocket pc 1.2.4
inkjet definition oem software
Adobe Cs3 Design Web Premium The Logo Creator MEGA pak 3.6
Filterit 4.1 2
Macromedia Dreamweaver 8 For Mac Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Adobe Education Discount software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Desktop Themes Xp microsoft office 2003 oem
locate software oem files
Corel Wordperfect Office X3 Standard widows oem software,
window 2000 upgrade download
Windows 7 For Free quark xpress 6 crack
Oem software bundle oem software bundles 814.
Low On Memory Windows Internet Explorer 7 software oem italiano
adobe photo shop cs 2
Oem Software Crystal oem software cds;
microsoft window 2000 professional oem software
Financial Management Software cheap software downloads;
oem Microsoft Office;
Autodesk Autocad By Again adobe standard encoding
"oem office 2000 software"
Photoshop Cs2 Downloads Buy upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Beta Version Windows 7 inkjet definition oem software
The Logo Creator MEGA pak 3.6
Autodesk Autocad 2008 Full Version Incl Keygen financial planning software australia?
Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
software discount oem
When Will Windows 7 Be Ready To Buy Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
locate software oem files
uk software oem frontpage
Liste Autodesk window 2000 upgrade download
quark xpress 6 crack Buy Cheap Video And Audio Editors Software Discount Oem software bundle oem software bundles 814.
software oem agreements
Adobe Acrobat V 6.0 Professional Pc adobe photo shop element
oem software cds;
Microsoft Office Professional 2007 Oem microsoft window 2000 professional oem software
cheap software?
Acrobat Adobe oem Microsoft Office;
adobe standard encoding
Windows 7 64bit Build6801 Dvd Iso "oem office 2000 software"
"Upgrade Version"
Microsoft Office Professional Edition dvd to pocket pc 1.2.4
inkjet definition oem software
Buy Adobe Photoshop 6 The Logo Creator MEGA pak 3.6
financial planning software australia?
Photoshop Patterns Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Adobe Photoshop Album Starter software oem cd line business
adobe any cs2 from photo photo shop shop upgrade version
Church Web Site Software microsoft office 2003 oem
locate software oem files
Microsoft Office Pro 2007 Oem Software widows oem software,
window 2000 upgrade download
Oem Software Quark quark xpress 6 crack
Oem software bundle oem software bundles 814.
Adobe Creative Suite 2 Cheap software oem italiano
adobe photo shop element
Order Adobe Illustrator oem software cds;
microsoft window 2000 professional oem software
Cheap Photoshop Software cheap software downloads;
oem Microsoft Office;
Oem Discount Download Software adobe standard encoding
"oem office 2000 software"
Windows Internet Explorer 7 upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Download Worm Armageddon Full Version inkjet definition oem software
The Logo Creator MEGA pak 3.6
Photoshop Cs 2 financial planning software australia?
Buy cheap PhotoShop CS 2
Buy Quarkxpress 7 iCorrect EditLab Pro 4.52
software discount oem
Microsoft Student Discount Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
microsoft office 2003 oem
Microsoft Office Educators Discount locate software oem files
widows oem software,
Adobe Photoshop Lightroom Price window 2000 upgrade download
quark xpress 6 crack
Windows Media Player Ie 7 Oem software bundle oem software bundles 814.
software oem italiano
Cakewalk Plasma 1.0 adobe photo shop element
oem software cds;
Windows Vista Express Upgrade Order microsoft window 2000 professional oem software
cheap software downloads;
Windows Intemet Explorer 7 oem Microsoft Office;
adobe standard encoding
Photo Editing "oem office 2000 software"
"Upgrade Version"
Oem Software Sales dvd to pocket pc 1.2.4
inkjet definition oem software
Buy Adobe Illustrator The Logo Creator MEGA pak 3.6
financial planning software australia?
Photoshop Cs Brush Buy cheap PhotoShop CS 2
iCorrect EditLab Pro 4.52
Genie Backup Manager Professional 8.0 software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
Microsoft Office Software Cheap microsoft office 2003 oem
locate software oem files
Graphic Cards For Autodesk Maya widows oem software,
window 2000 upgrade download
Purchase Windows Xp Cheap quark xpress 6 crack
Oem software bundle oem software bundles 814.
Buy Windows Xp Tablet software oem italiano
adobe photo shop element
Purchase Adobe Flash oem software cds;
microsoft window 2000 professional oem software
Windows 7 Beta Free Download cheap software downloads;
oem Microsoft Office;
Adobe Acrobat Pro 7 adobe standard encoding
"oem office 2000 software"
Encore Eminem Lyrics upgrade window 2000 to xp
dvd to pocket pc 1.2.4
Purchase Autocad inkjet definition oem software
The Logo Creator MEGA pak 3.6
Autodesk Serial No financial planning software australia?
Buy cheap PhotoShop CS 2
Microsoft Office Professional 2007 Cheap iCorrect EditLab Pro 4.52
software oem cd line business
Adobe cs2 photo shop total training adobe cs2 photo shop upgrade 459.
magix vs steinberg
Autodesk Autocad 2006 locate software oem files
uk software oem frontpage
Buy Acrobat 7 window 2000 upgrade download
quark xpress 6 crack
Buy Microsoft Vista Home Oem software bundle oem software bundles 814.
software oem italiano
Buy Windows Xp Home adobe photo shop element
oem software cds;
Adobe Photoshop Free Trial microsoft window 2000 professional oem software
cheap software downloads;
Buy Adobe Photoshop Cs4 Online oem Microsoft Office;
Adobe Standard,
Adobe Design Suite Premium Cs3 "oem office 2000 software"
upgrade window 2000 to xp
Oem Software Forums dvd to pocket pc 1.2.4
inkjet definition oem software
Vista Pack The Logo Creator MEGA pak 3.6
financial planning software australia?
Windows Interne 7 Explore Buy cheap PhotoShop CS 2
May 19th, 2006 at 8:37 pm
Hmm.
So, even assuming you’re correct (which I’m not sure of yet), and the transport and protocol have to cooperate to “include and exclude file descriptors from the I/O event loop”….
Who cares?
Seriously, I have never wanted this, to my knowledge, in any program I have ever written, nor have I seen it needed in any program I have ever read. Do you have an example of how this matters to mortal network application developers?
May 19th, 2006 at 8:55 pm
Hi Laurent. I think you have misunderstood the four methods of FileDescriptor which you mentioned. You say that protocol implementations are tied to these. However, if you investigate the Twisted codebase, you will not find any calls to them in protocol code:
$ grep –include ‘*.py’ -R -E ‘(start|stop)(Reading|Writing)’ twisted | grep -v ‘twisted/internet/’
twisted/conch/scripts/conch.py: def stopWriting(self):
twisted/conch/scripts/conch.py: def startWriting(self):
twisted/conch/scripts/cftp.py: def stopWriting(self):
twisted/conch/scripts/cftp.py: def startWriting(self):
twisted/conch/ssh/channel.py: self.startWriting()
twisted/conch/ssh/channel.py: self.stopWriting()
twisted/conch/ssh/channel.py: self.stopWriting()
twisted/conch/ssh/channel.py: def stopWriting(self):
twisted/conch/ssh/channel.py: def startWriting(self):
twisted/pair/tuntap.py: self.startReading()
twisted/pair/tuntap.py: self.stopReading()
twisted/web2/channel/fastcgi.py:# self.startReading()
$
We see a few definitions of methods with the same name (but they don’t actually serve the same purpose - the naming is coincidental) and a few calls to those methods. In fact, the only calls to the actual FileDescriptor methods we see are on implementations of new transports. There’s nothing wrong with this, since they are, after all, implementation details of transports in Twisted.
I’m glad you posted this, though. In looking for calls to these methods, I found two which were actually incorrect. I have since removed these in current Twisted trunk@HEAD.
I suppose the rest of your post stems from confusion over this point, since it doesn’t really make sense to me. Protocols don’t have to know anything about reading or writing, and in correctly implemented protocols (ie, those found in Twisted itself), *none* of them do. So your concerns about coupling and dependencies are unfounded. Twisted does not have the problems you describe.
May 19th, 2006 at 9:10 pm
To Allen:
Ok, let’s take a first example from FileDescriptor itself:
http://twistedmatrix.com/trac/browser/trunk/twisted/internet/abstract.py
go at line 53 to the connectionLost method. It is calling stopReading() and stopWriting(). On a close event, the channel cannot just flag its state as not connected, it must remove itself from the list of socket polled for I/O.
Another more practical example of the consequences, allways in FileDescriptor:
producerPaused = 0
at line 31 there is a class attribute obviously flagging that the producer is paused, would block, is stalled. Why? Can that state not be delegated to the producer itself? With Twisted it cannot.
Practicaly this yield monolithic implementations like:
http://www.mail-archive.com/twisted-web@twistedmatrix.com/msg00436.html
where stalling a producer is only possible by altering the state of the channel explicitely. Changing the state of the producer instance is not enough. There is a lot more funky code to write, yielding race conditions like
http://twistedmatrix.com/trac/ticket/811
The same is true for Twisted consumers.
Practically there is no way to develop on Twisted something like Medusa’s collectors, something to implement encapsulable protocols, independantly for output (producers) and input (collectors).
Practically asyncore enables to develop asynchat and support all those deeply encapsulated and pipelined text protocol.
With less code.
May 19th, 2006 at 9:27 pm
Hi Jean Paul,
Let me rephrase more correctly: Twisted developpers must call those four methods *if* they want to change the read/write state of the FileDescriptor in the I/O event loop.
The fact that they avoid and you consider a mistake to change that state in the protocol implementations is the proof that there is something broken.
You should be able to change that state in the protocol implementation, independantly from the transport implementation. With asyncore you can, because both are independant from the event loop.
An Allegra producer can stall its channel by changing its own state not having to call its channel to change its state, certainly not the list of file descriptors polled for I/O. That’s something the library takes care of, that you should understand, but which you may just not bother about.
With Twisted you cannot. Instead, protocols actually depend on transports for that critical state, they are tightly coupled.
Your findings just give more credit to the hypothesis that twisting asyncore broke it.
May 19th, 2006 at 10:28 pm
Sorry, you’re still confused.
Let me adjust your rephrasing slightly so that it is correct:
Twisted developers *must not* call those four methods even if they want to change the read/write state of the FileDescriptor in the I/O event loop.
There is a very simple reason for this: those four methods are not part of any public API; they are implementation details which may be changed at any time. The real API for controlling whether a transport will deliver bytes to a protocol is the IProducer interface with its two methods pauseProducing and resumeProducing. There is no API for controlling whether bytes will be written to the underlying socket because such an API is not necessary with Twisted: it provides no functionality which is not available in some simpler way.
Now, I think we can forget about all that, because I don’t think your objection is actually to startReading/stopReading/startWriting/stopWriting. I think your real objection is that pauseProducing and resumeProducing are methods of a transport object instead of methods of the protocol object.
This is really an objection without any substance. If you want them to be methods on a protocol, then you can define them as such with a trivial mixin, which I release to you under the MIT license, feel free to make use of it any way you please:
class TransportStateMixin:
def pauseProducing(self): self.transport.pauseProducing()
def resumeProducing(self): self.transport.resumeProducing()
Your protocols can now use self.pauseProducing() and self.resumeProducing() and remain blissfully unaware of the protocol/transport separation that actually exists. Furthermore if you ever have a transport which is pausable and resumeable via some other API (not that I have ever come across such a thing, nor do I expect such a thing will ever exist), you can simply mix in a different class.
I suspect you still haven’t seen why this separation is superior to the mechanism asyncore employs. This, despite having quoted Sam Rushing’s explanation of the efficiency concerns associated with readable() and writable(). I’ll try to explain in simpler terms.
Each time it is going to do I/O, asyncore has to visit each dispatcher and invoke its readable() and writable() methods. It then builds up lists of dispatchers (and thus file descriptors) to poll for readability or writability. This is a relatively expensive task, particularly since it might involve calling arbitrary application-level logic which may be arbitrarily slow. And since polling for I/O events is something that happens very frequently, this cost builds up and results in lower performance than would be possible if these methods did not have to be called for each time around the loop.
The Twisted model differs in that it keeps these lists around all the time. It does not have to re-create them each time it checks for I/O events. I hope it is obvious why this is superior. Now, since the lists are not recreated every time, they have to be updated instead. This can be done in a variety of ways, but the most common way is to use pauseProducing() and resumeProducing(). Each of these is invoked by the protocol whenever it chooses, just as the readable() and writable() methods of Asyncore can change its return value whenever a protocol likes.
So the Twisted way is more efficient than the Asyncore way. But you aren’t primarily complaining about performance. You’re complaining about the coupling that this creates. I posit that the coupling is precisely the same as in Asyncore.
In Asyncore, the protocol must rely on the event loop to call its readable() method and then /not call handle_read/.
In Twisted, the protocol must rely on the event loop to /not call dataReceived/ if the transport’s pauseProducing has been called.
Do you see the similarity? Furthermore, have you considered what will happen if the protocol changes its mind between the event loop calls readable() and when the event loop delivers bytes to it with handle_read()? If you think this is impossible, consider the case of a proxy protocol where two different dispatchers rely on each other and one loses its connection in the same loop iteration as the other receives some data.
I hope this clears up why Twisted’s model is strictly an improvement on Asyncore’s and why the faults you pointed ou in Twisted are actually strengths.
May 20th, 2006 at 12:03 am
To Jean Paul:
Thanks for the summary of the argument:
“In Asyncore, the protocol must rely on the event loop to call its readable() method and then /not call handle_read/.”
True. And that event loop is not about to change.
What you can change is the implementation of readable() to suite your flavor of handle_read method for transport.
The asynchat flavor decouples further, and implements readable() so that you can also delegate readability to the protocol’s collector and writeability to the producer. And asynchat it decouple twice, allowing for independant implementation of input and output protocols.
And all that without ever having to depend on calling handle_read or handle_write.
They are called.
Once.
The alternative is:
“In Twisted, the protocol must rely on the event loop to /not call dataReceived/ if the transport’s pauseProducing has been called.”
I see the inversion, not the similarity.
The pauseProducing *has* been called so that the
FileDescriptor.dataReceived
method may not be called, so that the event could not be fired.
And pauseProducing must now be *called* by everything that would like to stall producing, that is blocking. Wether transport or protocol. And in a network peer there are plenty of I/O stalling. And that’s just one aspect of protocol development. What about protocol encapsulation and I/O decoupling for pipelined applications?
The old asyncore calls readable () and writable () once in the sources and once per dispatcher at runtime. There is no need to bother about read/write events anywhere else than in the few implementations of those interfaces, like asynchat.
The Medusa version of an HTTP/1.1 server allready came with an implementation of readable () that lets you push a producer instance that implements a protocol, and let it implement the readability condition the way it wants (if it wants).
The price to pay for all that power is to compute the state of a dispatcher in each run of the loop is.
Practically, it the time spent is probably smaller than calling Twisted four interfaces through a few layers of function calls each time a transport or protocol must change its state in the list.
And it possibly scales as well if not better anyway, because under high load there are as usually many events as there are dispatchers.
On the other hand the price Twisted source pays to achieve an ellusive performance, is a complicated code base which is impractical to develop forward. Not toward the web as it was implemented.
Five years no HTTP/1.1 peer. Why?
Because you cannot implement boxable collectors and producers for Twisted peers. Not without dependencies everywhere on pauseProducing. And, somehow, through a few useless articulations, that depend on the four twisted interfaces that thighly couple to the event loop *everything* that is developped on the FileDescriptor.
You have it under your own eyes and you can better than me reduce the fundamental differences.
Can you see the light?
May 20th, 2006 at 12:26 am
> True. And that event loop is not about to change.
Neither is the transport interface in Twisted. :)
> I see the inversion, not the similarity.
It isn’t an inversion. In order to make your readable() method start returning True instead of False or False instead of True, you will have to change some state. Perhaps you set an attribute, or perhaps you append to a list, or any of a number of other things. The only difference with Twisted is you call a method instead of doing any of these other ad hoc things.
> And pauseProducing must now be *called* by everything that would like to stall producing, that is blocking. Wether transport or protocol. And in a network peer there are plenty of I/O stalling.
Yep. One uniform interface for one single task. Just like readable() is one uniform interface in Asyncore.
> What about protocol encapsulation and I/O decoupling for pipelined applications?
What about it? There are quite a few Twisted implementations of pipelined protocols. Nothing about Twisted’s model precludes this feature. It’s quite easy to implement.
> The Medusa version of an HTTP/1.1 server allready came with an implementation of readable () that lets you push a producer instance that implements a protocol, and let it implement the readability condition the way it wants (if it wants).
Twisted’s implementation of HTTP 1.0 supports arbitrary producers. So does Twisted’s implementation of FTP, POP3, IMAP4 and various other protocols. Furthermore, Twisted’s process support lets a producer stream results to a child process or to standard output.
> Practically, it the time spent is probably smaller than calling Twisted four interfaces through a few layers of function calls each time a transport or protocol must change its state in the list.
I recommend you perform some benchmarks before guessing about performance. I talked about efficiency concerns because I have done the benchmarks and I know the results. Twisted scales up better than Asyncore. This isn’t a theoretical problem.
> On the other hand the price Twisted source pays to achieve an ellusive performance, is a complicated code base which is impractical to develop forward.
I’m not sure if you meant “elusive” or “illusive” here ;) Either way, the price paid is negligable or entirely non-existent. The API is easily as convenient as Asyncore’s, and the performance benefits are real.
> Five years no HTTP/1.1 peer. Why?
Because it was never a priority for anyone. I recognize that HTTP/1.1 is important to you, but that doesn’t mean it is important to Twisted’s developers. We had an HTTP/1.0-ish implementation years ago, and it’s been good enough that HTTP/1.1 hasn’t been worth bothering with. The difficulties of implementing HTTP/1.1 aren’t just constrained to the quality of streaming support or the quality of encapsulation or the clarity of separation of concerns. It’s a fairly complicated protocol.
Now, recently someone has taken an interest in it. twisted.web2 *does* have an HTTP/1.1 implementation. It’s certainly not a finished, polished product but should demonstrate that once someone decided it was worth having, creating it was just a matter of investing a bit of developer time.
> Because you cannot implement boxable collectors and producers for Twisted peers. Not without dependencies everywhere on pauseProducing. And, somehow, through a few useless articulations, that depend on the four twisted interfaces that thighly couple to the event loop *everything* that is developped on the FileDescriptor.
Just not true. Take a look at the web2 code. None of it is coupled to FileDescriptor at all.
> You have it under your own eyes and you can better than me reduce the fundamental differences. Can you see the light?
I still think you’re confused about how Twisted works. The tight-coupling you think you see is not real. The limitations are actually strengths. And the elusive, illusive efficiency is real and important to many applications.
May 20th, 2006 at 1:02 am
hmm, let’s see:
> Yep. One uniform interface for one single task. Just like readable() is one uniform interface in Asyncore.
But that readable () is allready called once in the loop as it runs, once in the the async_loop.async_poll function (in Allegra) and *nowhere* else, ever. On the contrary, pauseProducing () is called *everywhere* and *whenever* something, somewhere needs to stall a producer.
> There are quite a few Twisted implementations of pipelined protocols. Nothing about Twisted’s model precludes this feature. It’s quite easy to implement.
Do it. Show me one. That does not call pauseProducing and that can stall output through encapsulation. Something like chunked-encoding for an HTTP/1.1 client and server. Here is one:
http://svn.berlios.de/svnroot/repos/allegra/lib/http_reactor.py
I would love somebody to trample it ;-)
> Take a look at the web2 code. None of it is coupled to FileDescriptor at all.
I did. Want some, here is some:
http://twistedmatrix.com/trac/browser/trunk/twisted/web2/stream.py?rev=16875
go in:
789 class _ProcessStreamerProtocol(protocol.ProcessProtocol):
and more specifically at line 805 of the connectionMade () method
797 def connectionMade(self):
798 p = StreamProducer(self.inputStream)
799 # if the process stopped reading from the input stream,
800 # this is not an error condition, so it oughtn’t result
801 # in a ConnectionLost() from the input stream:
802 p.stopProducing = lambda err=None:
StreamProducer.stopProducing(p, err)
803
804 d = p.beginProducing(self.transport)
805 d.addCallbacks(lambda _: self.transport.closeStdin(),
806 self._inputError)
I’m not sure to understand exactly what this is, but it does not really look like independant from self.transport and heavily rely on defered to work around something. But what? Can you explain exactly what this piece of code is doing?
Sorry to be mean, but remember I’m mean with code, not with you.
Thanks for replying.
May 20th, 2006 at 6:01 am
>But that readable () is allready called once in the loop as it runs, once in the the async_loop.async_poll function (in Allegra) and *nowhere* else, ever. On the contrary, pauseProducing () is called *everywhere* and *whenever* something, somewhere needs to stall a producer.
Anywhere you see pauseProducing in Twisted code, an Asyncore-based program would have a pile of custom logic to make sure it stops returning True from readable(). If your application wants to stop reading, that’s just what you have to do. The difference is that in Twisted, there is *one* way to spell this. In an Asyncore program, you have to re-implement it every time you want to say it.
Look at every implementation of producer_stalled in Allegra. There are at least five of these. Each has different, unique application logic. In Twisted, each of those would unnecessary: the application would just call pauseProducing. Instead of implementing a check against protocol state to decide if the producer should currently be paused or not, the protocol can simply call a method.
Take lib/smtp_client.py:108, for example. This is a terrible, terrible way to implement your SMTP client. You are smearing the logic related to recipient addresses all over the reactor and channel classes, instead of isolating it in the code which actually sends RCPT TO commands. This is a clear violation of encapsulation and tightly couples your producer to the rest of your application logic.
In Twisted, there would _be_ no producer during the RCPT TO phase. Once the DATA command had been accepted, a producer would be hooked up to the protocol’s transport and started. There would be no need for it to have any idea whatsoever about the rest of the SMTP conversation.
> Do it. Show me one. That does not call pauseProducing and that can stall output through encapsulation.
I’m not sure what you mean by “stall output through encapsulation”. Encapsulation is a thing which you are not supposed to go through. There’s no reason to want to avoid using pauseProducing (for the reasons given above and in my previous comments), however many of these pipelining protocol implementations don’t actually have to use it anyway:
http://twistedmatrix.com/trac/browser/trunk/twisted/mail/pop3.py#L253
http://twistedmatrix.com/trac/browser/trunk/twisted/mail/imap4.py#L457
http://twistedmatrix.com/trac/browser/trunk/twisted/protocols/ftp.py#L1771
http://twistedmatrix.com/trac/browser/trunk/twisted/web/http.py#L945
> I did. Want some, here is some:
That code isn’t tied to FileDescriptor at all. It will work with any transport that provides IProcessTransport. This is part of the reason protocol/transport separation is so useful. This code will work with any of a number of IProcessTransport implementations: it can even work with implementations which don’t actually talk to a process. This is extremely useful when writing unit tests, since a deterministic implementation can be used to remove the possibility of spurious, environment or load related failures from the test suite. This lets application developers unit test their *protocol* implementation separately from the transport implementation, which may have unrelated bugs, be swapped out with various different versions on different platforms, be replaced entirely by new versions of Twisted, or be provided by a third party who doesn’t contribute directly to Twisted or that particular application developer’s project.
In fact, FileDescriptor itself is an implementation detail. One can hook a protocol up to any kind of transport. Several of the reactors included in Twisted share a core set of implementation modules and re-use FileDescriptor for various means because this reduces code-size. However, not all Twisted reactors use FileDescriptor: take a look at the IOCP reactor, for example.
> but it does not really look like independant from self.transport
That’s right. It relies on the transport attribute of the protocol object, because all protocol objects have a transport object, and they are guaranteed that it will behave in a particular way. What exactly this object is may vary, and this is exactly the reason protocol/transport separation is useful. The protocol doesn’t need to know if it is talking to a TCP socket, an SSL connection, a reliable layer on top of UDP, a child process, its process’s standard output, a unix socket, a FIFO or other pipe, a test fixture, or anything else your heart desires.
> and heavily rely on defered to work around something.
It’s not working around anything. It’s using a Deferred to keep track of the bulk data transfer it has initiated. When the transfer completes, the Deferred fires. When the Deferred fires, the code in question closes the standard input of the process it is talking to. This is necessary to correctly implement a CGI gateway for the web2 server. Note how it does these things in four lines of code which aren’t duplicated anywhere else. These are the four lines necessary to send a stream to a child CGI process. Not four lines plus half a dozen more that are just wasteful code duplication, as seems common throughout Asyncore-based programs.
> Sorry to be mean, but remember I’m mean with code, not with you.
Don’t worry. I don’t think you’re being mean. I think you see some problems in Twisted and you’re trying to make them known. This can be constructive if done in the right way. And I can certainly take criticism of Twisted without being personally offended. However, I don’t think you have actually brought up any valid criticisms. Most of your posts and most of the designs I’ve seen in Allegra seem based on misunderstandings of Twisted’s relatively sophisticated solutions to some important problems in networking.
I think your enthusiasm in this problem space is great, and I think you could make a much greater positive impact on the community if you devoted some of your efforts to contributing to Twisted instead of working on Allegra.
May 20th, 2006 at 6:17 am
>Anywhere you see pauseProducing in Twisted code, an Asyncore-based program would have a pile of custom logic to make sure it stops returning True from readable().
No. Show me one such pile in Allegra.
The readable () method is implemented in a few places. And only in the framework, it will not be implemented in any application. That’s the way to write less code.
For the Async_dispatcher, Async_net and Async_chat class. The UDP_peer may deserve a better one, but TCP client and server channels don’t need anything else. Although async_limit can decorate it (along with the recv and send interface) to meter, timeout on inactivity and throttle channels. With any protocols and transports.
>I think your enthusiasm in this problem space is great,
Thanks.
>and I think you could make a much greater positive impact on the community if you devoted some of your efforts to contributing to Twisted instead of working on Allegra.
I cannot contribute sources to Twisted. I allready forked Medusa. Which was allready not as broken as Twisted in a few key aspects for network application programmers. Twisted broke asyncore and Medusa.
I’d rather continue to use and improve the original.
But I can contribute peer review. And I do.
Regards,
May 20th, 2006 at 8:58 am
> No. Show me one such pile in Allegra.
He did, the various implementations of readable(), which you discarded as “framework” code. You don’t seem to think of it as a pile, because it is in the “framework”. Twisted prefers to avoid repetition everywhere, not just in “user code”.
> Twisted broke asyncore and Medusa.
If you want this to be a productive discussion, please stop using words like “broke” and “wrong” when you cannot substantiate them. I have yet to see a single compelling argument here about a design flaw in Twisted, and you certainly haven’t managed to convince anyone qualified that I respect of your views.
By the way, not only Twisted developers have my respect. I think that the guys who wrote ACE, Zymb, Haboob/Sandstorm/SEDA, various MMO networking engines, and Sam Rushing’s current asynchronous server (sadly closed-source) are all very, very bright. None of them use Twisted. Allegra is not in the same class as any of those projects (many of which are actually highly superior to Twisted in various ways).
You have generally gestured at some areas that need improvement, but you don’t clearly understand what the improvements are.
> I cannot contribute sources to Twisted.
Sure you can. Just port over Allegra to be a Twisted application, rather than a Medusa fork; delet all your mainloop and finalization code, and port it to use Deferreds. :). If you devoted as much energy to understanding Twisted as you did to insulting it, you’d be an expert by now.
It seems as though you are having trouble understanding certain basic concepts in Twisted; however, so I can see why you might not have wanted to use it at first. However, clearly various Twisted developers are impressed by your passion, and would be willing to work through those issues with you until you did understand.
> But I can contribute peer review. And I do.
Eh… don’t do us any favors.
If you think that this peer-review is helping Twisted, you’re wrong. You’ve attracted Twisted developers here to correct your mistakes, not to improve Twisted in response to your criticism. Your reviews are based on misunderstanding the code and mis-estimating its performance considerations. Believe me, I _LOVE_ peer review. I crave it as much as you seem to — it is very hard to get people qualified to comment on Twisted to do so, as most of them are too busy writing massively multiplayer games or switching engines for telecom companies. However, I understand all of your criticisms and they are *not valid*.
In the strictest sense, “peer” review is when qualified equals give commentary. I don’t mean to be insulting when I say this, since you may be very skilled in other areas, and your writing (especially considering English does not appear to be your first language) is quite lucid and interesting: however, you have amply demonstrated that you are not a “peer” of the Twisted team when it comes to network programming and Python application architecture. You could stand to learn a lot by paying closer attention to what has been said here. The reviews JP gave alone are detailed technical analysis that would have cost tens of thousands of consulting dollars to receive.
Therefore, if you are doing this to help the Twisted community improve, please stop. If you’re not going to pay attention to the responses you’ve gotten, you’re just wasting everyone’s time (and perhaps tarnishing Twisted’s reputation in the eyes of those who can’t understand the finer technical points here and just see that “some guy who wrote a networking framework thinks Twisted is no good… maybe it isn’t”).
May 20th, 2006 at 3:50 pm
Hi Glyph,
Thanks for not flaming. Yes I’m just “some guy who wrote a networking framework” and who “thinks Twisted is no good” … as it could be. Not good as Medusa, hence not good as the one I forked from it.
I’m standing on a giant shoulder, itself inspired by an older USENET news server implemented in C with the same design for asynchronous sockets programming.
This design included an IOC defined as the readable () and writable () pair.
That interface *was* replaced by four in Twisted and the IOC was unfortunately removed. Nobody can deny that, nobody did: it is written in the sources, everybody can read this critical “implementation detail”.
So, I’m surprised when you assert that:
>He did, the various implementations of readable(), which you discarded as “framework” code. You don’t seem to think of it as a pile, because it is in the “framework”. Twisted prefers to avoid repetition everywhere, not just in “user code”.
Here I disagree. Let’s count.
Those four Twisted interfaces
stopReading, startReading, stopWriting, startWriting
are all over transports, where Twisted developped a lot. Exactly like pauseProducing and resumeProducing are all over protocols.
Jean Paul counted five modules in Twisted that do implement one of those four calls … outside of twisted.internet. He is missing a lot of the fun. And how many calls are there in each of those five modules. At least twelve. And what about dependencies, all those functions that depend on those calls?
In all Allegra’s async_loop there are only two places where readable () and writable () are called: the two pollster functions (the one for socket.select and the one for socket.poll). Two, in one module.
In all Allegra there are only three documented places where the pair is implemented:
async_core, async_net, ansync_chat
plus one in udp_peer of which I’m not quite sure about (I’m allways learning …) and two pairs of decorators for it in async_limits (soon to be documented …).
Readable () and Writable () have none: they are called in
async_loop.async_poll
directly in the main asynchronous dispatch () loop.
And you will not find in Allegra or its applications calls to something like pauseProducing () or resumeProducing (). That too is taken care of by the two implementations of readable () and writable () that implement buffered I/O for stream transport:
async_net, async_chat
either in the simplest way for netstrings protocols (stall only when buffer are full, stall output only when the queue is empty), or in the most convenient way for encapsulated Internet protocols (async_chat).
More with less code.
That’s the meter for a framework.
I’m sorry to disagree on something that hurts the Twisted projects and applications. But it does hurt. You can deny it for a while, but you cannot deny what is written: all those calls, all those dependencies, all that code.
Look at the sources of:
twisted.web2.http
and look for the part that implements chunked-encoding. Now, try to figure out a way to encapsulated further. Think about Base64 encoded MIME part in an HTTP/1.1 file upload. And that’s just one possible scenario for encapsulation. Think GZIP transfert, charset decoding, etc.
Regards,
May 20th, 2006 at 3:53 pm
Errata, replace “none” by “no dependencies”:
Readable () and Writable () have no dependencies: they are called in
async_loop.async_poll
directly in the main asynchronous dispatch () loop.
May 20th, 2006 at 5:25 pm
You seem to be very confused:
“”"Here I disagree. Let’s count.
Those four Twisted interfaces
stopReading, startReading, stopWriting, startWriting
….
Jean Paul counted five modules in Twisted that do implement one of those four calls … outside of twisted.internet. He is missing a lot of the fun. And how many calls are there in each of those five modules. At least twelve. And what about dependencies, all those functions that depend on those calls? “”"
Please check your numbers, as the ones you state here are totally wrong. You can’t have read Jean Paul’s comment very closely if this is the conclusion you manage to draw from it.
Here are the real counts:
Number of implementations of stopReading, startReading, stopWriting, startWriting outside of twisted.internet: Zero.
Number of calls to these FileDescriptor methods in protocol implementations in Twisted: Zero.
May 20th, 2006 at 6:26 pm
To Andrew:
>Number of implementations of stopReading, startReading, stopWriting, startWriting outside of twisted.internet: Zero.
And the dependencies? When some protocol call stopProducing, this method of FileDescriptor will by default looseConnection () therefore check the state of the transport and maybe lose the connection, calling two of three from those four methods.
Do *you* follow dependencies in your count?
This is what I’m tracking through a twisted pile of function calls.
Also, let’s be clear: calling stopReading () is not implementing it.
stopReading () is indeed implemented once.
As a useless articulation. You could as well, everywhere it is called, directly access the FileDescriptor’s reactor and pop the this FileDescriptor from the list to be polled for input.
That’s why it *has* to be called many times, in many places both inside and outside of twisted.internet, and that’ is why it has many obscure dependencies.
>Number of calls to these FileDescriptor methods in protocol implementations in Twisted: Zero.
I found at least one.
http://twistedmatrix.com/trac/browser/trunk/twisted/web2/channel/http.py?rev=16883
at line 316 in the stopProducing method of the HTTPParser class
314 def stopProducing(self):
315 if not self.finishedReading:
316 self.channel.stopProducing()
follow the call to self.channel.stopProducing () it will lead to the
FileDescriptor.stopProducing
which on its turn depends on stopReading () and stopWriting () through loseConnection ().
Do you see the light?
Regards,
May 21st, 2006 at 7:40 am
Laurent,
>>Number of calls to these FileDescriptor methods in protocol implementations in Twisted: Zero.
>I found at least one.
Please read more carefully! What you found is a call to IProducer.stopProducing, an interface method, not FileDescriptor.stopProducing, or potentially ITransport.loseConnection, an interface method, not FileDescriptor.loseConnection. Andrew is correct: there are zero calls.
stopProducing() is an implementation detail. pauseProducing() is implemented in various ways in Twisted (and some outside Twisted), not all of them relying on FileDescriptor.
For example, twisted/internet/_pollingfile.py:_PollableReadPipe implements it by calling ‘deactivate’, not ’stopReading’. This is using a completely different API (the Win32 pipes API, and Twisted timers) and is unrelated to select() state.
Therefore there are already multiple potential implementations which your code could be referring to when calling pauseProducing, and some of them do not necessarily depend on pauseProducing. In fact, it would be breaking encapsulation to even determine that.
This is the whole point of the IoC pattern you’re crowing about: to the extent dependency is possible in Python, Twisted protocols depend on ITransport and IConsumer, *not* FileDescriptor. FileDescriptor is a utility class involved in the implementation of most reactors, but not all of them, and is never visible to the Twisted programmer as a dependency.
Do you understand the difference between interfaces and concrete implementations yet?
May 21st, 2006 at 7:59 am
Laurent,
Since you seem to be missing the point totally here by hyper-focusing on details of code you are not reading properly, let’s try a hypothetical example instead.
readable() and writable() are methods that are called by an event loop. They are not related to the production of data, but instead one particular way which you can implement an interface to an OSes socket layer.
Let’s pretend we have another source of data: digits of π. (This is a hypothetical example, and a more realistic one would be too complex to explain in detail in a blog comment, but I assure you there are numerous applications where I have coded something roughly like this.)
Our hypothetical PiProducer produces digits of π by running a native function in a thread. After producing each digit it buffers it; after accumulating a buffer of a certain size, it delivers the buffer to the dataReceived() method of its protocol.
This data must be delivered to a foreign system, which processes the digits (to what purpose, we might never guess). Sometimes the foreign system becomes overloaded or network congestion interrupts service between the two endpoints. When this happens, the calculation must be paused (the thread must be blocked) until the outgoing buffer can be emptied.
One way to accomplish this is to simply perform the calculation, then write each byte to a blocking socket as it is calculated; I think one of the few things we agree on is that this approach has drawbacks. Another is to deliver notifications (pauseProducing, resumeProducing) to the producer of the data asynchronously, so that it does not outrun its buffer by too wide a margin.
PiProducer is neither readable nor writable, as it is not associated with a file descriptor or otherwise representative of inter-process communication. Nevertheless, it is somehow producing data, and it needs the facility to be paused and re-started. This is true of numerous resources on non-UNIX platforms which are not sockets. Even linux does not allow you to meaningfully check a regular disk file for readability; you have to implement some alternative system for it. You can call pauseProducing on this hypothetical class; you cannot call stopReading on it.
-glyph
(P.S.: You also seem incredibly over-focused on the fact that there are four methods: it could easily have been one method: for example, it might have been called “setActivityMask” and taken 2 optional keyword arguments, “reading” and “writing”: stopReading, startReading, stopWriting, startWriting would then become setActivityMask(reading=False), setActivityMask(reading=True), setActivityMask(writing=False), setActivityMask(writing=True). Or, more likely, _setActivityMask, so as not to obscure the fact that it is an implementation detail and not designed to be called from any code outside the reactor’s implementation. It’s four methods because it makes implementing the reactor easier.)
May 21st, 2006 at 8:17 am
Finally, you keep mentioning dependencies, as if readable() and writable() have none, but Twisted’s approach to this has many.
You’re using a nonstandard definition of “dependency”, as I have mentioned, you are using apparently the exact opposite of the definition that the IoC pattern uses to describe dependency: Twisted code depends on interfaces, not implementations, and therefore the dependency is always one-step deep; what happens underneath the interface is *by definition* an implementation detail.
By your definition, if pauseProducing depends on stopReading, then readable() in allegra depends on async_net_pull (and indeed, all of Async_net) - because async_net_pull sets attributes which one implementation of readable() uses. That, in turn, means async_loop depends on all of Async_net.
I do not believe you think such a dependency exists in Allegra; why do you claim it exists in Twisted, especially given that Twisted uses explicit interfaces to avoid this level of dependency but allegra has only weak conventions and the hope that nothing but sockets will ever produce data?
May 21st, 2006 at 8:42 am
As a semi-aside, it is well known from a lot of research that anything that wants to scale to lots of connections needs to do as little work per connection as possible. This is one large reason that modern high-connection Unix servers prefer poll() over select() (and often prefer even leaner interfaces); the difference actually matters in practice. Of course, many connections is only one version of ‘high load’, but it is a version that matters for a lot of Internet-facing servers.
May 22nd, 2006 at 6:45 am
To Glyph:
>Therefore there are already multiple potential implementations which your code could be referring to when calling pauseProducing, and some of them do not necessarily depend on pauseProducing. In fact, it would be breaking encapsulation to even determine that.
There are multiple implementations of pauseProducing (), I found one of them which *is* potentially calling stopReading (). What do you want me to do? Look through all that pile of indirections and find each and every way in which, somehow, Twisted sources are still coupled to the event loop?
I don’t have to do that to *prove* that it is the case.
>why do you claim it exists in Twisted
I demonstrated why in your sources. Maybe not clearly, so I’ll try again.
The Twisted FileDescriptor’s “fab four” are adding and removing file descriptors from the I/O event loop. Right? Now, the same event loop is calling the other FileDescriptor interfaces, the ones that implement transport and protocols.
And some of the implementations of those interfaces, not all but many, do call … the “fab four”. Practically, all the ones that must decide wether to include or exclude the sockets from the I/O event pollster.
Here’s is the problem:
I/O event loop -> FileDescriptor -> I/O event loop
There’s an unbroken dependency.
Implementation of what and how to *handle* read and write events must themselves implement inclusion and exclusion from the event loop. You can tolerate that in a single-purpose application.
In asyncore.py, the readable () and writable () interface is *called by* the event loop, all dependencies are broken:
I/O event loop -> dispatcher
The implementation of transport and protocols don’t have to set the state of their dispatchers, they can rely on the one evaluated once *for* the event loop before it polls I/O.
> By your definition, if pauseProducing depends on stopReading, then readable() in allegra depends on async_net_pull (and indeed, all of Async_net) - because async_net_pull sets attributes which one implementation of readable() uses. That, in turn, means async_loop depends on all of Async_net.
But async_loop.async_poll *calls* Async_net.readable () which evaluate a state set by many implementations of the dispatcher’s interface. The effect is radically different.
As for async_net_pull, it does resume collection of the buffer. Readability of the dispatcher will still be evaluated *by* the event loop, *when* it calls.
Doing the contrary is *very* problematic in a framework.
In Twisted, how do you find out in the protocol implementation what is the current state of your FileDescriptor in the event loop? Is it in or is it out, ready for input or stalling output?
How do you know in the implementation of the transport wether the producer is stalling and that you should not put the socket back in the list to poll for output? You must test everywhere. Or maintain state somewhere.
Probably that is why there is a:
producerPaused = 0
attribute set *by default* to the FileDescriptor class. To test, everywhere it will be required, wether the producer paused and flagged or not, then remove or not the socket from the I/O event loop.
That’s a problem Allegra does not suffer from. Because the
producer_stalled ()
interface is called *by* the writable () method. The only places you will ever see producer_stalled () called is in writable (), in a decorator or a boxing producer (like the Composite_producer).
The async_core transports implementations and async_chat protocol implementations “stacked” on a channel do not have to worry wether the producer is stalled or not. And the producers have not to worry wether the channel output buffer is full or not. Or if the socket is still connected. Etc …
Can you see the light?
>allegra has only weak conventions and the hope that nothing but sockets will ever produce data?
Well, if Allegra can be adopted by all the Python network programmers that use sockets *only*, I would be very glad.
Regards,
May 24th, 2006 at 7:23 am
> There are multiple implementations of pauseProducing (), I found one of them which *is* potentially calling stopReading (). What do you want me to do? Look through all that pile of indirections and find each and every way in which, somehow, Twisted sources are still coupled to the event loop?
I want you to understand that an interface is not an implementation, and things implemented in terms of IConsumer and ITransport do not necessarily depend on stopReading, a method not present in either IConsumer nor ITransport. As the interfaces are currently specified, properly implemented Twisted code could survive a full re-implementation of the reactor, removing (start|stop)(Reading|Writing) and it would work *exactly the same*. These are not interfaces used by application programmers, period, the end.
Not only is this the way things are *supposed* to be, this is the way they *are*. I frequently put Twisted code onto different (non-FileDescriptor) transports. Protocols do not ever practically need to call methods outside of their transports’ interfaces.
>Here’s is the problem:
>I/O event loop -> FileDescriptor -> I/O event loop
>There’s an unbroken dependency.
FileDescriptor calls a method on an IReactorFDSet implementor, present as self.reactor. This is a classic inversion of control, or what you are now calling a “broken dependency”. Maybe its methods were called by methods of that very same IReactorFDSet implementor, maybe not. At any rate, FileDescriptor could be totally re-implemented using readable() and writable() (causing a loss of performance) and no application code would have to change. FileDescriptor is an *implementation detail* of a clearly-specified API that does *not* include stopReading and stopWriting.
Here is a simpler example: how does an echo protocol work? Input is received from the event loop, which is passed to a handler, which sends data to the event loop. This is your same “unbroken dependency”, but it is the only possible way that it could work. Sure, you can obscure the dependency by placing your methods in the protocol implementation, forcing your application author to handle buffering themselves, but what good does that do? What application does that enable? What possible value does it have, beyond your aesthetic preference?
To recap, advantages of the Twisted way:
- not polling readable() and writable() is measurably faster and more scalable, even when using standard select()
- a stateful reactor API provides a way to use even more efficient and scalable multiplexing mechanisms like epoll
- a stateful reactor API allows interfacing with existing protocol implementations on top of existing event loops such as libevent, or GUI event loops such as gobject
- explicit interfaces for producing and consuming enable applications which use non-socket sources of data
- explicit interfaces improve testability by allowing you to provide mock implementations
- subprocesses can be treated similarly to network connections by protocol implementations
I have yet to hear a recognizable advantage of the Allegra way.
> In Twisted, how do you find out in the protocol implementation what is the current state of your FileDescriptor in the event loop? Is it in or is it out, ready for input or stalling output?
You don’t have a FileDescriptor. Forget about FileDescriptor. It is an implementation detail. You want to know the state of your transport, which probably provides ITransport, IProducer, and IConsumer.
Is it ready for input? If you want to know, call registerProducer(thingThatWantsToKnow). This will then be sent notifications (pauseProducing, resumeProducing) when the state changes.
You can’t *query* the state of the transport from a protocol, and for good reason. It is only reasonable to respond to changes in this state: if the buffer is full, it is time to stop sending data to it, if the buffer is empty, it is time to start sending data again. The state is hidden, or “encapsulated”, by the implementor.
This is the difference between synchronous polling and event-driven programming. Twisted is event-driven: you are not expected to poll the state of your transport yourself; the framework will *tell* you when it’s time to write. You do not ask, “is it time to write? is it time to write? is it time to write?”, nor does the framework ask you, “is it okay for me to produce data? can I produce data? huh? is it data-producing time? can I produce data?” That is what readable() and writable() do.
Instead, Twisted politely tells you, “Produce some data now, if you would like.”, and “I am too busy to handle more data now, please stop producing it” You may respond to those events as you choose.