[{"data":1,"prerenderedAt":30},["ShallowReactive",2],{"note-chains-plugins-in-series-in-one-worker-ca":3},{"slug":4,"order":5,"title":6,"summary":7,"measured":8,"topic":9,"toc":10,"html":29},"chains-plugins-in-series-in-one-worker",40,"\"Cadenes: plugins en sèrie en un sol worker i el membre que falla, en quarantena\"","Una cadena fa córrer en ordre els plugins d'un canal dins d'un sol procés worker, de manera que es desperten una vegada per cicle i no una cadascun; quan un membre falla, només aquest queda en quarantena i la resta de la cadena continua.","plugin-hostd amb omx-clap-host, octubre del 2026.","host",[11,14,17,20,23,26],{"id":12,"title":13},"per-que","Per què",{"id":15,"title":16},"els-verbs","Els verbs",{"id":18,"title":19},"quins-membres-poden-compartir-una-cadena","Quins membres poden compartir una cadena",{"id":21,"title":22},"que-se-li-diu-al-worker","Què se li diu al worker",{"id":24,"title":25},"una-fallada","Una fallada",{"id":27,"title":28},"cadenes-lv2-amb-require-pins","Cadenes LV2 amb require_pins","\u003Ch2 id=\"per-que\">Per què\u003C\u002Fh2>\n\u003Cp>omx-clap-host dona a cada plugin el seu propi client JACK i cada client és un node del graf amb el seu propi despertar a\ncada cicle. La major part del temps d'un cicle se'n va en aquests despertars, no pas en els plugins (vegeu\n\u003Ca href=\"\u002Fca\u002Fnotes\u002Fone-jack-client-for-a-chain\">Un sol client JACK per a una cadena\u003C\u002Fa>). Un canal amb quatre plugins en sèrie\ndesperta quatre nodes. omx-clap-host pot fer córrer una cadena de plugins en un sol client i cridar-los en ordre dins d'una\nsola crida de procés; cal dir-li quines instàncies formen una cadena i en quin ordre i el dimoni les ha de posar en un sol\nworker.\u003C\u002Fp>\n\u003Cp>Una cadena comparteix un procés, de manera que la fallada d'un membre s'enduria els altres. plugin-hostd existeix per aïllar\nfallades: el membre que ha fallat surt de la cadena i la resta continua.\u003C\u002Fp>\n\u003Ch2 id=\"els-verbs\">Els verbs\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>chain &lt;chain&gt; &lt;instance&gt; [&lt;instance&gt; ...]                resp 0\nchain_clear &lt;chain&gt;                                      resp 0\nchain_get &lt;chain&gt;                                        resp 0 &lt;worker&gt; &lt;declared&gt; &lt;running&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>chain\u003C\u002Fcode> declara els membres en ordre; han de ser instàncies creades amb \u003Ccode>add\u003C\u002Fcode>. La cadena té un sol worker, de lloc\n\u003Ccode>chain:&lt;chain&gt;\u003C\u002Fcode>. Cada membre deixa el worker on era: se'n desa l'estat, el seu \u003Ccode>remove\u003C\u002Fcode> va a aquell worker i el worker nou\nel reprodueix com en un reinici: l'addició, l'estat, el registre de verbs i les connexions, en aquest ordre. Tornar a\ndeclarar una cadena li dona l'ordre nou; un membre que hi queda fora torna a un worker propi. \u003Ccode>chain_clear\u003C\u002Fcode> dona a cada\nmembre un worker propi i oblida la cadena.\u003C\u002Fp>\n\u003Cp>\u003Ccode>chain_get\u003C\u002Fcode> llegeix una cadena: el seu worker, els membres en l'ordre declarat i els que el worker fa córrer ara. Un membre\nen quarantena és a la llista declarada i no a la que corre. És la comprovació del controlador que una addició, un moviment\no una retirada han arribat.\u003C\u002Fp>\n\u003Cp>Una cadena que es torna a declarar mentre el seu worker està en marxa conserva aquell worker i els membres que s'hi queden\nno es reinicien. Un membre que en surt va a un worker propi; un membre nou deixa el seu worker antic i s'afegeix al que\ncorre amb la seva addició, només el seu estat, els seus verbs i les seves connexions; i al worker se li envia l'ordre nou.\nUn moviment, un ordre nou sense cap membre que entri ni surti, envia l'ordre i res més. La cadena només es torna a formar de\nzero quan el seu worker no està en marxa, quan un membre se n'ha separat o s'hi torna a afegir o quan un membre LV2 que\ns'hi afegeix necessita un paquet amb què no es va construir el món del worker en marxa.\u003C\u002Fp>\n\u003Ch2 id=\"quins-membres-poden-compartir-una-cadena\">Quins membres poden compartir una cadena\u003C\u002Fh2>\n\u003Cp>\u003Ccode>clap\u003C\u002Fcode> i \u003Ccode>lv2-clap\u003C\u002Fcode> són dues files d'un mateix programa, omx-clap-host i totes dues fan córrer cadenes en un sol client;\nper tant un membre CLAP i un membre LV2 (a través de l'adaptador LV2) formen una sola cadena. Els membres de dos programes\n(LV2 a mod-host amb CLAP) es refusen amb \u003Ccode>CHAIN_MIXED_FORMAT\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Un refús no canvia res:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>codi\u003C\u002Fth>\n\u003Cth>quan\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>CHAIN_UNKNOWN_INSTANCE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>un membre que cap \u003Ccode>add\u003C\u002Fcode> no ha creat\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>CHAIN_DUPLICATE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>la mateixa instància dues vegades a la llista\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>CHAIN_INSTANCE_BUSY\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>un membre que ja és en una altra cadena\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>CHAIN_MIXED_FORMAT\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>membres que un mateix programa worker no fa córrer junts\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>PLACEMENT_INVALID\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>un membre el plugin del qual no pot compartir worker mentre \u003Ccode>require_pins\u003C\u002Fcode> està activat\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>NO_SUCH_CHAIN\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>chain_clear\u003C\u002Fcode> d'una cadena que cap \u003Ccode>chain\u003C\u002Fcode> no ha declarat\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Una cadena d'un sol membre és vàlida: un plugin aïllat és una cadena com qualsevol altra.\u003C\u002Fp>\n\u003Ch2 id=\"que-se-li-diu-al-worker\">Què se li diu al worker\u003C\u002Fh2>\n\u003Cp>A un worker que fa córrer cadenes en un sol client se li envia la mateixa línia \u003Ccode>chain\u003C\u002Fcode> després de les addicions de la\nreproducció. Un worker que no ho fa (mod-host) té els membres en un sol procés i les connexions en donen l'ordre. El\nbypass, els paràmetres i tots els verbs d'instància continuen anomenant una instància pel seu número; el dimoni els\nencamina al worker de la cadena.\u003C\u002Fp>\n\u003Ch2 id=\"una-fallada\">Una fallada\u003C\u002Fh2>\n\u003Cp>Per al supervisor, el worker d'una cadena és un grup de workers compartit i atribueix una mort de la mateixa manera:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Quan la mort assenyala un culpable (el verb en curs o un sospitós recent), el culpable queda en quarantena\n(\u003Ccode>instance_quarantined &lt;instance&gt; &lt;worker&gt;\u003C\u002Fcode>) i passa a un worker propi. El worker de la cadena es reinicia amb els altres\nmembres en el seu ordre i \u003Ccode>chain_formed &lt;chain&gt; &lt;worker&gt; &lt;instance&gt;,...\u003C\u002Fcode> diu l'ordre que corre ara.\u003C\u002Fli>\n\u003Cli>Quan no n'assenyala cap, els membres se separen, cadascun en un worker propi. El membre que torna a morir tot sol és el\nculpable: queda en quarantena i els altres tornen a la cadena en el seu ordre.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Un membre en quarantena conserva el seu lloc en l'ordre declarat. \u003Ccode>quarantine_clear\u003C\u002Fcode> el torna a posar i el worker de la\ncadena es torna a formar amb tots els membres que no són en quarantena. \u003Ccode>remove\u003C\u002Fcode> d'un membre el treu de la cadena; una\ncadena a la qual es treu l'últim membre s'oblida.\u003C\u002Fp>\n\u003Ch2 id=\"cadenes-lv2-amb-require-pins\">Cadenes LV2 amb require_pins\u003C\u002Fh2>\n\u003Cp>Una empremta LV2 només és vàlida en un món reduït al paquet del mateix plugin. Per això el worker d'una cadena rep un món\nreduït a la unió dels paquets dels seus membres, de manera que l'empremta de cada membre hi continua sent vàlida. Un membre\nel paquet del qual no es troba deixa el món sense construir en lloc d'eixamplar-lo i \u003Ccode>chain\u003C\u002Fcode> refusa la cadena amb\n\u003Ccode>PLACEMENT_INVALID\u003C\u002Fcode> abans que res no es mogui.\u003C\u002Fp>\n\u003Cp>Un món reduït al paquet d'un sol membre és la fallada que cal evitar: en un banc de proves de vuit plugins LV2 encadenats\na través de l'adaptador, un membre amb un \u003Ccode>LV2_PATH\u003C\u002Fcode> d'un sol paquet responia \u003Ccode>resp -101\u003C\u002Fcode> (cap plugin amb aquell uri). Una\nprova forma una cadena de dos membres LV2, comprova que l'\u003Ccode>LV2_PATH\u003C\u002Fcode> del worker té exactament els dos paquets i un sabotatge\nque redueix el món al primer paquet l'ha de fer sortir vermella.\u003C\u002Fp>\n",1793954996381]