int thread_pool_limits(thread_pool_t* pool,
Β int lowater, int hiwater, int maximum, int increment, unsigned flags);ΠΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ²
QNX Π²Π²ΠΎΠ΄ΠΈΡ ΡΠ΅Ρ Π½ΠΈΠΊΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΡΠΊΠ²ΠΎΠ·Ρ Π²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ. [41]ΠΠ΄Π΅Ρ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠ² ΡΠ΅ΡΡΡΡΠΎΠ² ΡΡΠΎΠ»Ρ ΠΆΠ΅ ΠΏΡΠΎΡΡΠ°, ΡΠΊΠΎΠ»Ρ ΠΈ ΠΎΡΡΡΠΎΡΠΌΠ½Π°:
β’Β ΠΡΡ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎΡΡΡΠΎΠ΅Π½Π° Π½Π° ΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠΉ Π² ΡΠ΅ΠΎΡΠΈΠΈ (ΠΈ ΡΠ΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΠ‘) ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ - ΠΊΠΎΠΌΠΌΡΡΠ°ΡΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. Π―Π΄ΡΠΎ (ΡΠΎΡΠ½Π΅Π΅ Β«ΠΌΠΈΠΊΡΠΎΡΠ΄ΡΠΎΒ») ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΠΏΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π΅ Π²ΡΡΡΡΠΏΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΡΡΠ°ΡΠΎΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ. ΠΡΠΈ ΡΡΠΎΠΌ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π²ΡΡΡΡΠΏΠ°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ ΡΡΠ»ΡΠ³Ρ (ΡΠ΅ΡΡΡΡ), ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ ΡΡΡ ΡΡΠ»ΡΠ³Ρ (ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ ΡΠ΅ΡΡΡΡ).
β’Β ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² API (Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ Π²ΡΠ΅ Β«ΠΏΡΠΈΠ²ΡΡΠ½ΡΠ΅Β» POSIX-Π²ΡΠ·ΠΎΠ²Ρ:
open()read()write()seek()close()fs-dosopen()β’Β Π Π°Π· ΡΡΠ° ΡΡ Π΅ΠΌΠ° ΡΡΠΎΠ»Ρ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½Π°, Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½Π° ΠΈ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΏΡΠΈΡΠΎΠ΄Ρ ΡΠ΅ΡΡΡΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅, ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ QNX ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π° ΠΌΠ΅ΡΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ POSIX-Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ ΠΏΡΡΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ Π·Π°Π³Π»ΡΡΠΊΠΈ. ΠΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ ΠΈ ΡΠ»ΡΠΆΠΈΡ Π±Π°Π·ΠΎΠ²ΡΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² ΡΡΠ»ΡΠ³, Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΡ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π² ΡΠ°ΠΊΠΎΠΉ ΡΠ΅Ρ Π½ΠΈΠΊΠ΅ Β«ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°ΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°Β».
β’Β ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΡΠ΅ΡΡΡΡΠ° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ ΡΠ²ΠΎΠ΅ ΠΈΠΌΡ (ΡΠΎΡΠ½Π΅Π΅ ΠΈΠΌΡ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ Π΅Ρ ΡΠ΅ΡΡΡΡΠ°) Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΈΠΌΠ΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ QNX (ΠΎΠ±ΡΡΠ½ΠΎ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅
/devβ’Β ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ, ΠΏΠΈΡΡΡΠ΅ΠΌΡ ΡΠ²ΠΎΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΡΡΠ»ΡΠ³ΠΈ, ΡΠ΅ΡΡΡΡΠ°, ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈΠ»ΠΈ ΠΏΡΠ΅Π²Π΄ΠΎΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ Π½Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ Π·Π°Π³Π»ΡΡΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½Ρ Π·Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠΈΠ΅ Π΅Π³ΠΎ Π²ΡΠ·ΠΎΠ²Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
open()read()close()write()seek()Π Π½Π°ΡΠΈ ΡΠ΅Π»ΠΈ Π½Π΅ Π²Ρ ΠΎΠ΄ΠΈΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠ² ΡΠ΅ΡΡΡΡΠΎΠ² (ΡΡΠΎΠΌΡ ΠΏΠΎΡΠ²ΡΡΠ΅Π½ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°ΡΡΠ΅Π΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π² ΡΠΎΡΡΠ°Π²Π΅ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ QNX ΠΎΠ±ΡΠ΅ΠΌΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ 80 ΡΡΡΠ°Π½ΠΈΡ [42]). ΠΠΎΡΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΠΈ ΡΠ°Π½Π΅Π΅ Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΡΠ»ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π½Π°ΡΠ½Π΅ΠΌ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°. ΠΡΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΡΠ΅ΡΡΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ Π½Π°ΠΌΠΈ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ² Π² QNX ( ΡΠ°ΠΉΠ» prior.cc):
#include <errno.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
// ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π·Π°ΠΏΡΠΎΡΠ° ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° read(),
// Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΉ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ
static int prior_read(resmgr_context_t *ctp, io_read_t *msg,
Β RESMGR_OCB_T *ocb) {
Β static bool odd = true;
Β int status = iofunc_read_verify(ctp, msg, ocb, NULL);
Β if (status != EOK) return status;
Β if (msg->i.xtype & _IO_XTYPE_MASK != _ID_XTYPE_NONE)
Β return ENOSYS;
Β if (odd) {
Β struct sched_param param;
Β sched_getparam(0, &param);
Β static char rbuf[4];
Β sprintf(rbuf, "%d\n", param.sched_curpriority);
Β MsgReply(ctp->rcvid, strlen(rbuf) + 1, rbuf, strlen(rbuf) + 1);
Β } else MsgReply(ctp->rcvid, EOK, NULL, 0);
Β odd = !odd;
Β return _RESMGR_NOREPLY;
}
// Π³Π»Π°Π²Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΠΏΡΡΠΊΠ° ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°
main(int argc, char **argv) {
Β resmgr_attr_t resmgr_attr;
Β dispatch_t *dpp;
Β dispatch_context_t *ctp;
Β int id;
Β // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ
Β if ((dpp = dispatch_create()) == NULL)
Β perror("allocate dispatch"), exit(EXIT_FAILURE);
Β // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°
Β memset(&resmgr_attr, 0, sizeof resmgr_attr);
Β resmgr_attr.nparts_max = 1;
Β resmgr_attr.msg_max_size = 2048;
Β // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π±Π»ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²
Β static resmgr_connect_funcs_t connect_funcs;
Β static resmgr_io_funcs_t io_funcs;
Β iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs,
Β _RESMGR_IO_NFUNCS, &io_funcs);
Β // Π·Π΄Π΅ΡΡ Π½Π°ΠΌΠΈ Π΄ΠΎΠΏΠΈΡΠ°Π½ Π²ΡΠ΅Π³ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ - ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ read,
Β // Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ!
Β io_funcs.read = prior_read;
Β // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠ½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ