{"id":937,"date":"2020-07-06T22:23:23","date_gmt":"2020-07-06T20:23:23","guid":{"rendered":"https:\/\/moijari.com\/?p=937"},"modified":"2020-07-08T23:21:54","modified_gmt":"2020-07-08T21:21:54","slug":"fort-sisaisten-satunnaistapahtumien-lisaaminen-uudistunut","status":"publish","type":"post","link":"https:\/\/moijari.com\/?p=937","title":{"rendered":"FORT sis\u00e4isten satunnaistapahtumien lis\u00e4\u00e4minen uudistunut"},"content":{"rendered":"\n<p> T\u00e4ss\u00e4 postissa esitelty tapa helpottaa fort koodin lukemista ja ohjelmasi omien tapahtumien lis\u00e4\u00e4mist\u00e4. T\u00e4m\u00e4 lyhent\u00e4\u00e4 koodia runsaasti ja helpottanee sen ymm\u00e4rt\u00e4mist\u00e4. Jos lis\u00e4\u00e4t tapahtumia omaan ohjelmaasi, tee makroista ja internal_events -muuttujasta uudet versiot ilman internal sanaa. Ennen satunnaistapahtumat lis\u00e4ttiin seuraavalla lohkojen alkuun ja loppuun lis\u00e4tt\u00e4v\u00e4ll\u00e4 koodilla: T\u00e4ss\u00e4 l\u00e4hetet\u00e4\u00e4n satunnaistapahtumia, joiden source on 10 ja 11.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void hash_init(HashCtx *hash)\n{\n#ifdef FORT_INTERNAL_EVENTS\n  unsigned long micros;\n  if(fort_internal_events) {\n    fort_add_random_event_time(&amp;time_pool,\n        10, fort_event_mode);\n    fort_add_random_event_timer_start(&amp;micros);\n  }\n#endif\n  HashInit(hash);\n#ifdef FORT_INTERNAL_EVENTS\n  if(fort_internal_events)\n    fort_add_random_event_timer_do(&amp;init_pool,\n        11, fort_event_mode, &amp;micros);\n#endif\n}\n<\/code><\/pre>\n\n\n\n<p>Uudessa versiossa tehd\u00e4\u00e4n seuraavat uudet #define m\u00e4\u00e4ritykset: FORT_INTERNAL_EVENTS_START on lohkon alkuun lis\u00e4tt\u00e4v\u00e4 makro ja FORT_INTERNAL_EVENTS_END on lohkon loppuun lis\u00e4tt\u00e4v\u00e4 makro. N\u00e4m\u00e4 periaatteessa sis\u00e4lt\u00e4v\u00e4t nuo edelliset satunnaistapahtumien koodilohkot, mutta ne kirjoitetaan vain kerran makron m\u00e4\u00e4ritykseen, ei en\u00e4\u00e4 uudestaan joka k\u00e4ytt\u00f6kerralla. N\u00e4m\u00e4 uudet makrot sis\u00e4lt\u00e4v\u00e4t my\u00f6s pool ja pool2 m\u00e4\u00e4rittelyt, eli int-muuttujat joissa talletetaan seuraavan tapahtuman puskurinumero. Static tyyppisin\u00e4 n\u00e4m\u00e4 tuntuvat toimivan niinkuin halutaan, eli ett\u00e4 jokaisella lohkolla on omat muuttujansa, jopa sis\u00e4kk\u00e4isill\u00e4, ja ett\u00e4 kenttien arvot s\u00e4ilyv\u00e4t funktion ajokerrasta seuraavaan. Pool muuttujaa k\u00e4ytet\u00e4\u00e4n aikatapahtumiin ja pool2 muuttujaa k\u00e4ytet\u00e4\u00e4n kestotapahtumiin. Tosin ennen aikatapahtumille oli vain yksi pool-muuttuja, nyt niit\u00e4 on oma jokaiselle FORT_INTERNAL_EVENTS lohkolle.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifdef FORT_INTERNAL_EVENTS\n#define FORT_INTERNAL_EVENTS_START(source) \\\n  unsigned long micros; \\\n  static int pool=0, pool2=0; \\\n  if(fort_internal_events) { \\\n    fort_add_random_event_time(&amp;pool, source, \\\n        fort_event_mode); \\\n    fort_add_random_event_timer_start(&amp;micros); \\\n  }\n#else\n#define FORT_INTERNAL_EVENTS_START(source)\n#endif\n\n#ifdef FORT_INTERNAL_EVENTS\n#define FORT_INTERNAL_EVENTS_END(source) \\\n  if(fort_internal_events) \\\n    fort_add_random_event_timer_do(&amp;pool2, \\\n        source, fort_event_mode, &amp;micros);\n#else\n#define FORT_INTERNAL_EVENTS_END(source)\n#endif<\/code><\/pre>\n\n\n\n<p>N\u00e4iden makrojen avulla koodista tulee luettavampaa ja en\u00e4\u00e4 ei koodata erillisi\u00e4 _pool-loppuisia muuttujia. Seuraavassa edellinen hash_init kirjoitettuna n\u00e4ill\u00e4 uusilla makroilla: Sulkeissa kerrottu arvo on source kent\u00e4n arvo. Huomaa ett\u00e4 makrorivien lopussa ei ole puolipistett\u00e4 (;). <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void hash_init(HashCtx *hash)\n{\n  FORT_INTERNAL_EVENTS_START(10)\n\n  HashInit(hash);\n\n  FORT_INTERNAL_EVENTS_END(11)\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>T\u00e4ss\u00e4 viel\u00e4 esimerkki pidemm\u00e4st\u00e4 rutiinista:<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>void fort_random_data(int len, unsigned char *buf)\n{\n  int c;\n  unsigned long tenths;\n  HashCtx hash;\n  unsigned char buffer&#91;HashLen];\n\n  FORT_INTERNAL_EVENTS_START(22)\n\n  tenths=gettenths();\n\n  if( (fort_reseed_always==1) ||\n      (fort_next_reseed==0) ||\n      (fort_next_reseed&lt;=tenths &amp;&amp;\n       fort_pools&#91;0].length >=\n           FORT_MIN_POOL_SIZE) ) {\n\n    \/\/ next tenth of a second\n    fort_next_reseed = tenths + 1;                                                                                                                                                                                                                                                      \n    fort_reseed_count++;\n\n    hash_init(&amp;hash);\n    c=0;\n\n    while(c &lt; 32 &amp;&amp;\n        (fort_reseed_count % (1&lt;&lt;c))==0) {\n\n      FORT_INTERNAL_EVENTS_START(23)\n\n#ifdef RESSU\n      if(fort_fill_pool_when_reseeding==1 &amp;&amp;\n         fort_pools&#91;c].length &lt;\n              FORT_MIN_POOL_SIZE) {\n        unsigned char tmp32&#91;32];\n        int len=FORT_MIN_POOL_SIZE -\n            fort_pools&#91;c].length;\n        int n;\n\n        while(len>0) {\n\n          FORT_INTERNAL_EVENTS_START(24)\n\n          n=(len&lt;sizeof(tmp32)) ? len :\n              sizeof(tmp32);\n          ressu_genbuffer(n, tmp32);\n\n          int pooltemp=c;\n          fort_add_random_event(&amp;pooltemp, 29,\n              fort_event_mode, n, tmp32);\n          len-=n;\n\n          FORT_INTERNAL_EVENTS_END(25)\n        } \/\/ while(len>0)\n      } \/\/ if(fort_fill...\n#endif\n      hash_final(buffer, &amp;fort_pools&#91;c].pool);\n      hash_update(&amp;hash, buffer, sizeof(buffer));\n      fort_pools&#91;c].length = 0;\n      HashInit(&amp;fort_pools&#91;c].pool);\n      \/\/ save earlier pool to new one\n      hash_update(&amp;fort_pools&#91;c].pool,\n          buffer, sizeof(buffer));                                                                                                                                                                                                                   \n      c++;\n\n      FORT_INTERNAL_EVENTS_END(26)\n    } \/\/ while(c &lt; 32...\n    hash_update(&amp;hash, (unsigned char *)&amp;cvar,\n        sizeof(cvar));\n    hash_final(buffer, &amp;hash);\n    fort_reseed(sizeof(buffer), buffer);\n    \/\/ Forget hash context\n    memset(&amp;hash, 0, sizeof(hash));\n    \/* Forget reseed key *\/\n    memset(buffer, 0, sizeof(buffer));\n    inccvar();\n  } \/\/ if( (fort_reseed...\n  fort_pseudo_random_data(len, buf);\n\n  FORT_INTERNAL_EVENTS_END(27)\n}<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4ss\u00e4 postissa esitelty tapa helpottaa fort koodin lukemista ja ohjelmasi omien tapahtumien lis\u00e4\u00e4mist\u00e4. T\u00e4m\u00e4 lyhent\u00e4\u00e4 koodia runsaasti ja helpottanee sen ymm\u00e4rt\u00e4mist\u00e4. Jos lis\u00e4\u00e4t tapahtumia omaan ohjelmaasi, tee makroista ja internal_events -muuttujasta uudet versiot ilman internal sanaa. Ennen satunnaistapahtumat lis\u00e4ttiin seuraavalla lohkojen alkuun ja loppuun lis\u00e4tt\u00e4v\u00e4ll\u00e4 koodilla: T\u00e4ss\u00e4 l\u00e4hetet\u00e4\u00e4n satunnaistapahtumia, joiden source on 10 ja 11.&hellip; <a class=\"more-link\" href=\"https:\/\/moijari.com\/?p=937\">Continue reading <span class=\"screen-reader-text\">FORT sis\u00e4isten satunnaistapahtumien lis\u00e4\u00e4minen uudistunut<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[11],"tags":[],"_links":{"self":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/937"}],"collection":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=937"}],"version-history":[{"count":17,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/937\/revisions"}],"predecessor-version":[{"id":958,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/937\/revisions\/958"}],"wp:attachment":[{"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=937"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=937"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=937"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}