Bonjour/Bonsoir !

Je suis débutant en Perl MAIS !
- j'ai regardé sur le forum jusqu'à la page 122,
- j'ai fouillé les résultats de Google jusqu'au dernier lien (j'vous raconte pas le nombre de bières avec le robot d'indexation, vu le nombre de fois où je l'ai croisé !),
- je connais la documentation de Net::Server par cœur, et particulièrement le paragraphe de passage d'arguments personnalisés...
- j'ai fini ma réserve de café, et celle d'espoir commence à atteindre un niveau critique,
- bref, sur gentil petit développeur débutant pitié ! ^^

Le bouclier anti-atomique activé, voilà mon problème : je développe un backend (en Perl donc ^^ ) qui est chargé de récupérer un certain nombre de données en format JSON (d'une taille variant d'un à dix Ko). Le problème vient du fait que j'ai choisi (peut-être à tort ?) d'utiliser Net::Server::PreFork pour lancer des processus forkés qui écoutent et attendent les connexions depuis les devices.

J'ai conçu mon application (encore une fois, je ne sais absolument pas si je m'y prends comme un cochon (ou comme un pied si j'ai de la chance)) pour que l'objet qui va parser le JSON, celui qui va gérer la BDD ainsi que le handle de la BDD soient instanciés une seule fois puis passés par référence à toutes les instances créées. Premier problème : les accès concurrents sur un seul objet sont-ils source d'ennuis ? (Traduire : de litres d'aspirine au café, mais comme je vous le disais, ma réserve, toussa toussa...)

Le souci est donc de passer une référence sur liste contenant elle-même les références vers ces objets. Mon cerveau fumant a donc pondu ce code qui m'a paru génial pendant environ les trente premières millisecondes qui ont suivi sa rédaction :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
# Open connection to database.
my $dbh = connect_database($config_parsed);
 
# [...]
 
# Instanciating JSON parser.
my $JSON_parser = JSONParser->new;
 
# Instanciating Database Manager.
my $database_manager = DatabaseManager->new;
 
# Define the context list.
@context = (
    \$config_parsed,
    \$dbh,
    \$JSON_parser,
    \$database_manager);
 
# Start listening for connections from clients.
ConnectionsHandler->run(
    proto         => $config_parsed->{backend}->{proto},
    SSL_key_file  => $prefix . $config_parsed->{backend}->{SSL_key_file},
    SSL_cert_file => $prefix . $config_parsed->{backend}->{SSL_cert_file},
    port          => $config_parsed->{backend}->{port},
    ipv           => $config_parsed->{backend}->{ipv},
    context       => \@context);
Ce code provient du point d'entrée du script. Ensuite, pour récupérer ma liste @context, j'ai écrit (comme le demandait la documentation, mais en ayant tout de même un doute sur ma santé mentale bonne compréhension des mécanismes mis en jeu) cela :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
# Passing custom parameters to each process.
sub options
{
    my $self     = shift;
    my $template = shift;
 
    my $prop = $self->{server};
 
    # Set default options to parent Net::Server::PreFork.
    $self->SUPER::options($template);
 
    $prop->{context}     ||= \@context;
    $template->{context}   = \$prop->{context};
}
Sauf qu'évidemment, @context n'est pas accessible depuis cette portion de code (située dans un autre fichier), une variable globale ne servirait (à mon humble avis) qu'à rendre inutile tout le travail des développeurs de Net::Server, puisqu'ils ne se sont probablement pas donné la peine de concevoir ce système d'arguments personnalisés pour qu'un abruti en mette une dans son code !

Lorsque je remplace par ce que dit strictement la documentation, à savoir le \@context par [], j'ai exactement ce que je demande, à savoir une référence sur liste, mais pas ce que je veux... D'où ma question : comment passer ma référence sur liste à toutes les instances du serveur, sans passer par une variable globale, et en utilisant le système conçu pour, dont je ne comprends pas bien tous les tenants et aboutissants ?

Voilà, en espérant que quelqu'un ait un petit peu de temps pour m'expliquer où je me suis planté, merci beaucoup d'avance !

Bonne journée/soirée !