Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-04-2007, 13:46   #1
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
[c]MULTI-THREADS: multi esperti a me!

Avrei un problemino con un modulo che logga msg ed errori di un intero progetto.

Questo progetto ha parecchi threads (e io non sono esperto in 3ds) che potrebbero scrivere contemporaneamente i log quindi chiamare nello stesso istante il modulo log.

Ci sono problemi ? il S.O. ci pensa da solo o devo fare un ulteriore thread che faccia da interfaccia al loggatore ?

grassie
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 13:55   #2
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da trallallero Guarda i messaggi
Avrei un problemino con un modulo che logga msg ed errori di un intero progetto.

Questo progetto ha parecchi threads (e io non sono esperto in 3ds) che potrebbero scrivere contemporaneamente i log quindi chiamare nello stesso istante il modulo log.

Ci sono problemi ? il S.O. ci pensa da solo o devo fare un ulteriore thread che faccia da interfaccia al loggatore ?

grassie
no non puoi avere problemi... inoltre i thread non scrivono in contemporanea.
Sono appunto thread quindi uno alla volta con le loro precedenze di privilegio.
Sempre uno alla volta non possono scrivere in contemporanea indipendemente dall'OS.
okay è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 13:58   #3
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1453
Quote:
Originariamente inviato da trallallero Guarda i messaggi
Avrei un problemino con un modulo che logga msg ed errori di un intero progetto.

Questo progetto ha parecchi threads (e io non sono esperto in 3ds) che potrebbero scrivere contemporaneamente i log quindi chiamare nello stesso istante il modulo log.

Ci sono problemi ? il S.O. ci pensa da solo o devo fare un ulteriore thread che faccia da interfaccia al loggatore ?

grassie
Stai chiedendo se più thread scrivono sullo stesso file, puoi lasciarlo così oppure devi gestirlo tu?
Non vorrei sbagliarlo, ma prendilo come hint, che io sappia puoi infischiartene solo se questi thread leggono il file, mentre se scrivono devi usare meccanismi di mutex.
Vedi un po se questo può esserti d'aiuto. http://en.wikipedia.org/wiki/File_locking
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 13:59   #4
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1453
Quote:
Originariamente inviato da okay Guarda i messaggi
no non puoi avere problemi... inoltre i thread non scrivono in contemporanea.
Sono appunto thread quindi uno alla volta con le loro precedenze di privilegio.
Sempre uno alla volta non possono scrivere in contemporanea indipendemente dall'OS.
Beh non è mica detto scusa, metti che thread 1 stà scrivendo sul file, viene prelazionato da thread 2 e inizia a scrivere sullo stesso file, hai un incosistenza no?
Mica la scrittura su file è una operazione atomica?
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 14:02   #5
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da okay Guarda i messaggi
no non puoi avere problemi... inoltre i thread non scrivono in contemporanea.
Sono appunto thread quindi uno alla volta con le loro precedenze di privilegio.
Sempre uno alla volta non possono scrivere in contemporanea indipendemente dall'OS.
sicuro ? a chiedermelo e´ stato proprio quello che ha "designato" i 3ds e li sta implementando. Quindi immagno si esperto di 3ds ...

Io poi, per motivi di spazio, zippo tutti i log creati eliminando quelli vecchi ma per non appesantire il tutto chiamo in parallelo con una fork il processo zip.

Sicuro che posso star tranquillo ?
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 14:04   #6
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da beppegrillo Guarda i messaggi
Beh non è mica detto scusa, metti che thread 1 stà scrivendo sul file, viene prelazionato da thread 2 e inizia a scrivere sullo stesso file, hai un incosistenza no?
infatti mi sembra strano, mi piacerebbe testare ma non so creare i 3ds

Quote:
Originariamente inviato da beppegrillo Guarda i messaggi
Mica la scrittura su file è una operazione atomica?
speriamo di no ... sono contro il nucleare
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 14:11   #7
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
che poi il mio modulo non e´ un processo a parte ma un .o che verra´ linkato a svariati eseguibili che a loto volta creeranno svariati 3ds ...
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 15:03   #8
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Per il log non puoi realizzare una coda di messaggi da scrivere in cui tutti i thread vanno ad accodare le loro richieste così che questa venga svuotata su un thread separato?
Non avresti più problemi di concorrenza in scrittura su file, ma solo di gestione della struttura che userai per la coda.
Così facendo hai in più il vantaggio che i thread non vengono "rallentati" dal processo di scrittura su file.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 15:21   #9
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Per il log non puoi realizzare una coda di messaggi da scrivere in cui tutti i thread vanno ad accodare le loro richieste così che questa venga svuotata su un thread separato?
Non avresti più problemi di concorrenza in scrittura su file, ma solo di gestione della struttura che userai per la coda.
Così facendo hai in più il vantaggio che i thread non vengono "rallentati" dal processo di scrittura su file.
e´ quello che vorrebbe evitare il crucco qui. Non so bene perche´ (son qui da poco piu´di 1 settimana) ma penso che sia perche´ abbiamo decine di 3d aperti contemporaneamente.

Grazie comunque
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 15:34   #10
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da beppegrillo Guarda i messaggi
Stai chiedendo se più thread scrivono sullo stesso file, puoi lasciarlo così oppure devi gestirlo tu?
Non vorrei sbagliarlo, ma prendilo come hint, che io sappia puoi infischiartene solo se questi thread leggono il file, mentre se scrivono devi usare meccanismi di mutex.
Vedi un po se questo può esserti d'aiuto. http://en.wikipedia.org/wiki/File_locking
infatti ho provato a creare 5 threads (grazie ad uno stupido esempio in rete) e scrive veramente alla caxxo
grazie do un´occhiata.
Mi e´ appena venuto il crucco a dire che forse con il flag O_SYNC al file si risolve ...
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 15:49   #11
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1453
Quote:
Originariamente inviato da trallallero Guarda i messaggi
infatti ho provato a creare 5 threads (grazie ad uno stupido esempio in rete) e scrive veramente alla caxxo
grazie do un´occhiata.
Mi e´ appena venuto il crucco a dire che forse con il flag O_SYNC al file si risolve ...
O_SYNC
Write I/O operations on the file descriptor complete as defined by synchronised I/O file integrity completion.

Boh prova, sicuramente fai molto prima così, che ad esempio una cosa simile:
pthread_mutex_lock(mutex_scrittura)
fd = open(file,"rw");
write(fd,'blah',..)
close(fd)
pthread_mutex_unlock(mutex_scrittura)
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 15:52   #12
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da beppegrillo Guarda i messaggi
mentre se scrivono devi usare meccanismi di mutex.
se ho capito bene il lock rallenta il tutto perche´ ogni chiamante aspetta il turno suo. Ovvero perdita di prestazioni. Purtroppo penso che non sia la soluzione giusta in questo progetto.


Quote:
Originariamente inviato da tomminno Guarda i messaggi
Per il log non puoi realizzare una coda di messaggi da scrivere in cui tutti i thread vanno ad accodare le loro richieste così che questa venga svuotata su un thread separato?
Non avresti più problemi di concorrenza in scrittura su file, ma solo di gestione della struttura che userai per la coda.
Così facendo hai in più il vantaggio che i thread non vengono "rallentati" dal processo di scrittura su file.
si mi sa che e´ l´unica strada ... hai qualche esempio ?
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 15:53   #13
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da beppegrillo Guarda i messaggi
O_SYNC
Write I/O operations on the file descriptor complete as defined by synchronised I/O file integrity completion.

Boh prova, sicuramente fai molto prima così, che ad esempio una cosa simile:
pthread_mutex_lock(mutex_scrittura)
fd = open(file,"rw");
write(fd,'blah',..)
close(fd)
pthread_mutex_unlock(mutex_scrittura)
mizzeca! non basta la write in mutex ? ogni scrittura deve essere un´apertura chiusura ?
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 16:18   #14
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
correggetemi se sbaglio per favore:
ho messo un
Codice:
pthread_mutex_lock(&mutex);
...
fprintf(...);
...
pthread_mutex_unlock(&mutex);
e va tutto a meraviglia.

Ma e´ piu´ lento o no ?
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 16:22   #15
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1453
Quote:
Originariamente inviato da trallallero Guarda i messaggi
correggetemi se sbaglio per favore:
ho messo un
Codice:
pthread_mutex_lock(&mutex);
...
fprintf(...);
...
pthread_mutex_unlock(&mutex);
e va tutto a meraviglia.

Ma e´ piu´ lento o no ?
Beh si, puoi ad esempio scrivere su un buffer come ti ha suggerito qualcuno.
Però a stò punto devi vedere quanto ti conviene, perchè col buffer hai alcuni svantaggi :
1)nuove strutture dati
2)overhead dovuto al processo thread che deve svuotarlo nel file
3)e credo che anche quando aggiungi roba al buffer, devi usare la mutua esclusione
In poche parole, dipende un po da quanti thread hai e da quanto lavorano.
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 16:27   #16
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da beppegrillo Guarda i messaggi
Beh si, puoi ad esempio scrivere su un buffer come ti ha suggerito qualcuno.
Però a stò punto devi vedere quanto ti conviene, perchè col buffer hai alcuni svantaggi :
1)nuove strutture dati
2)overhead dovuto al processo thread che deve svuotarlo nel file
3)e credo che anche quando aggiungi roba al buffer, devi usare la mutua esclusione
In poche parole, dipende un po da quanti thread hai e da quanto lavorano.
beh, questa soluzione (mutex) e´ stata accetta dal krukken per adesso. Ha detto che ha trovato altri punti deboli nei 3ds quindi prima risolvera´ quelli poi se ne riparla.
Grazie a tutti
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 16:38   #17
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Voto per la soluzione di Tommino. Sincronizzando sull'operazione di scrittura (lock - print - lock) ognuno dei Thread che vuole inviare un messaggio di log deve attendere per il tempo necessario a scrivere i dati. Se i dati finiscono su un disco fisso l'attesa può essere rilevante.

Se usi una coda concorrente con un Thread che la svuota, ogni Thread deve attendere per il tempo necessario a copiare il messaggio o un puntatore al messaggio da una fetta di RAM ad un'altra.

Poichè idealmente la rapidità di stoccaggio dei messaggi nella coda è più elevata della velocità di scrittura degli stessi (cioè il rubinetto è molto grande e lo scarico molto piccolo) devi anche introdurre un blocco euristico sull'accodamento dei messaggi. Del genere se il totale dei messaggi passa i dieci megabyte l'accodamento viene bloccato finchè le dimensioni della coda non tornino sotto ad un certo livello di guardia.

Nota che il sistema ti consente di ottimizzare le operazioni di scrittura facendo in modo che essa avvenga non ad ogni messaggio ma, ad esempio, al raggiungimento di un numero di byte ottimale per la scrittura. Ad esempio si potrebbe pensare di scrivere i dati a blocchi di dimensioni pari ad un multiplo della dimensione di un cluster.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 16:50   #18
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Voto per la soluzione di Tommino. Sincronizzando sull'operazione di scrittura (lock - print - lock) ognuno dei Thread che vuole inviare un messaggio di log deve attendere per il tempo necessario a scrivere i dati. Se i dati finiscono su un disco fisso l'attesa può essere rilevante.

Se usi una coda concorrente con un Thread che la svuota, ogni Thread deve attendere per il tempo necessario a copiare il messaggio o un puntatore al messaggio da una fetta di RAM ad un'altra.

Poichè idealmente la rapidità di stoccaggio dei messaggi nella coda è più elevata della velocità di scrittura degli stessi (cioè il rubinetto è molto grande e lo scarico molto piccolo) devi anche introdurre un blocco euristico sull'accodamento dei messaggi. Del genere se il totale dei messaggi passa i dieci megabyte l'accodamento viene bloccato finchè le dimensioni della coda non tornino sotto ad un certo livello di guardia.

Nota che il sistema ti consente di ottimizzare le operazioni di scrittura facendo in modo che essa avvenga non ad ogni messaggio ma, ad esempio, al raggiungimento di un numero di byte ottimale per la scrittura. Ad esempio si potrebbe pensare di scrivere i dati a blocchi di dimensioni pari ad un multiplo della dimensione di un cluster.
interessante ma la scrittura a blocchi non puo´ andare perche´ ho creato un sistema con una lista circolare che memorizza n nomi di files e cancella sempre l´ultimo piu´ vecchio e zippa quelli che chiude. Quindi ne crea uno quando raggiunge una tot size, ma a blocchi significherebbe avere dei messaggi spezzati ... non so se puo´andare.
E poi per avere sempre i log aggiornati faccio una fflush ad ogni scrittura. Lo so che rallenta ma se crasha vogliamo sapere perche´.
La coda pero´ mi piace come idea ...
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
La capsula SpaceX Dragon CRS-33 ha acces...
La NASA è sempre più vicin...
Crisi delle memorie: ASUS torna al passa...
Le console next-generation potrebbero es...
Gemini cresce ancora: la quota di mercat...
Samsung sfida TSMC: la capacità produtti...
Iliad alza il prezzo della fibra ottica ...
Il prossimo low cost di POCO sarà il più...
The Elder Scrolls VI: ecco le ultime sul...
Ecco i saldi di fine anno Amazon, 34 off...
iPhone Fold: scorte limitate al lancio m...
OpenAI porterà la pubblicità in ChatGPT ...
TSMC aumenterà ancora i prezzi: nel 2026...
Marvel pubblica anche il secondo teaser ...
Nuovo accordo tra xAI e il Pentagono: l'...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:56.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v