Recent Changes - Search:

Accueil

OpenSSL

SyncML

Apache Portable Runtime

Libxml2

Net-snmp

CUrl

Boost

Perl

ZLib

Samba

VPN

Serveurs de messagerie

edit

APR/APR-bucket-brigade

Les buckets sont un concept essentiel pour la maitrise de l'écriture de modules Apache.

L'implémentation est fournie avec les libaires Apache Portable Runtime.


Les buckets sont des containers de données (Strings, Sockets, Fichiers, etc) organisés dans une liste doublement chaînée appelée Brigade Bucket Brigades: Data Management for Apache 2.0. Le principe est de ne plus solliciter l'OS par de nombreux Malloc et Free consommateurs en ressources mais de s'appuyer sur une couche d'abstraction gérant les ressources sous-jacentes pour le mieux. Par exemple le split d'une chaine de caractères en deux buckets n'a aucune incidence sur la chaine de caractères elle même, mais ne modifie que les références des buckets vers celle-ci en modifiant les pointeurs de début et les longueurs de chacun.

Les Brigades étant gérées dans un pool Apache, profitent de l'assurance d'être correctement nettoyées à la fin de l'instanciation du Module. Par principe, la bridage est toujours crée par l'appellant et nettoyé par lui même, la procédure appelée n'ayant pas de visibilité sur la durée de vie des données ne doit jamais les désallouer.

Les brigades sont forts pratiques pour le traitement de chaines, voici un exemple trivial faisant la découpe par bloc de trois caractères de deux chaines.

void Show(apr_bucket *e){
        const char* buf ;
        size_t bytes ;
        apr_bucket_read(e, &buf, &bytes, APR_BLOCK_READ);
        printf("%s\n",buf);

}

int main(int argc, char* argv[])
{
        apr_bucket_brigade *bb;
        apr_bucket_alloc_t *ba
        apr_pool_t *p;


        apr_initialize();
        apr_pool_create(&p, NULL);


        ba = apr_bucket_alloc_create(p);
        bb = apr_brigade_create(p, ba);
        APR_BRIGADE_INSERT_TAIL(bb,apr_bucket_transient_create("0123456789", 10, ba));
        APR_BRIGADE_INSERT_TAIL(bb,apr_bucket_transient_create("ABCDEFGHIJ", 10, ba));


        for ( b = APR_BRIGADE_FIRST(bb); b != APR_BRIGADE_SENTINEL(bb); b = APR_BUCKET_NEXT(b) ) {
                Show(b);
                apr_bucket_split(b,3) ;
        };



        apr_brigade_destroy(bb);
        apr_bucket_alloc_destroy(ba);
        apr_pool_destroy(p);
        return 0;
}
 

Edit - History - Print - Recent Changes - Search
Page last modified on October 24, 2007, at 08:10 PM