231 strcpy(
ErrMsg(),
"invalid name");
234 else if ((strlen(s) < 1) || (strlen(s) >= (
sizeof(
name) - 1)))
236 strcpy(
ErrMsg(),
"invalid name");
239 else if (s[0] ==
'.')
244 else if (s[0] ==
':')
254 if (strlen(
name) == 0)
256 strcpy(
ErrMsg(),
"invalid name");
277 if (Register_() != 0)
298 shmdt(shm_); shm_ = NULL;
306 shmdt(evt_); evt_ = NULL;
317 if (clientId_ >= 0) DetachEvt_();
319 if (EvtTryLock_() == 0)
328 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
339 if (strlen(
name) > 0)
342 snprintf(fileName,
sizeof(fileName),
"/tmp/ngcshmio_%u_%s",
349 struct sembuf semOp[4];
354 memset(&semOp[0], 0,
sizeof(
struct sembuf));
355 semOp[0].sem_num = 1;
356 semOp[0].sem_op = -1;
357 semOp[0].sem_flg = SEM_UNDO;
358 if (semop(semEvt_, semOp, 1) != 0)
360 if (errno == EIDRM) semEvt_ = -1;
375 int Fd() {
return (fd_);}
385 int val = semctl(semEvt_, 1, GETVAL, ctl);
388 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
407 if ((evtId_ != -1) && (evt_ != NULL))
412 shmdt(evt_); evt_ = NULL;
413 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
419 if (strlen(
name) > 0)
422 snprintf(fileName,
sizeof(fileName),
"/tmp/ngcshmio_%u_%s", getuid(),
441 if (semctl(semId, 0, SETVAL, ctl) == -1)
443 sprintf(
ErrMsg(),
"semaphore init failed - %s", strerror(errno));
449 if (semctl(semId, 1, SETVAL, ctl) == -1)
451 sprintf(
ErrMsg(),
"semaphore init failed - %s", strerror(errno));
461 if (semop(semId, semOpWrLock_, 3) != 0)
465 while (semop(semId, semOpWrLock_, 3) != 0)
469 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
476 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
489 if (semop(semId, semOpWrTryLock_, 3) != 0)
501 if (semop(semId, semOpWrUnlock_, 1) != 0)
503 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
516 if (semop(semId, semOpRdWait_, 1) != 0)
520 while (semop(semId, semOpRdWait_, 1) != 0)
535 return (semctl(semId, 1, GETVAL, ctl));
542 if ((fd_ >= 0) && !extPipeErr_)
545 if (write(fd_, &ack,
sizeof(
int)) !=
sizeof(
int)) extPipeErr_ = 1;
563 strcpy(
ErrMsg(),
"invalid shared memory id");
570 m = shmat(shmId, 0, SHM_RDONLY);
573 sprintf(
ErrMsg(),
"cannot lock shared memory - %s", strerror(errno));
583 if (RdLock_(io->
semId, noWait) != 0)
585 sprintf(
ErrMsg(),
"cannot lock shared memory - %s", strerror(errno));
597 semOpRdLock_[1].sem_flg = 0;
598 semOpRdUnlock_[0].sem_flg = IPC_NOWAIT;
607 strcpy(
ErrMsg(),
"invalid shared memory id");
614 m = shmat(shmId, 0, SHM_RDONLY);
617 sprintf(
ErrMsg(),
"cannot lock shared memory - %s", strerror(errno));
627 RdUnlock_(io->
semId);
646 strcpy(
ErrMsg(),
"invalid shared memory id");
653 shm_ = shmat(shmId, 0, SHM_RDONLY);
654 if (shm_ != (
void *)-1)
661 if (RdLock_(io->
semId, noWait) != 0)
664 sprintf(
ErrMsg(),
"cannot lock buffer - %s", strerror(errno));
665 shmdt(shm_); shm_ = NULL;
688 sprintf(
ErrMsg(),
"cannot attach to shared memory - %s",
709 RdUnlock_(io->
semId);
714 shmdt(shm_); shm_ = NULL;
719 unsigned int EvtCnt() {
return (evtCnt_);}
723 unsigned int n = evtCnt_ + 1;
730 struct sembuf semOp[1];
735 if ((fd_ < 0) || extPipeErr_)
737 strcpy(
ErrMsg(),
"event interface not initialized");
743 else if (semEvt_ < 0)
748 strcpy(
ErrMsg(),
"event interface not initialized");
751 else if (clientId_ >= 0)
758 else if (EvtLock_() != 0)
767 memset(&semOp[0], 0,
sizeof(
struct sembuf));
768 semOp[0].sem_op = -2;
769 semOp[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
773 semOp[0].sem_num =
static_cast<unsigned short>(2 + i);
774 if (semop(semEvt_, semOp, 1) == 0)
788 if (StartThread_() != 0)
797 else if (errno == EIDRM)
808 strcpy(
ErrMsg(),
"too many clients");
817 if ((fd_ >= 0) && !extPipeErr_)
820 int res = WaitPipe_(noWait);
833 if (read(fd_, &shmId,
sizeof(
int)) !=
sizeof(
int))
836 strcpy(
ErrMsg(),
"error reading event header");
842 shm_ = shmat(shmId, 0, SHM_RDONLY);
843 if (shm_ != (
void *)-1)
851 shmdt(shm_); shm_ = NULL;
856 sprintf(
ErrMsg(),
"shared memory error - %s", strerror(errno));
864 if (write(fd_, &ack,
sizeof(
int)) !=
sizeof(
int))
867 strcpy(
ErrMsg(),
"error sending event acknowledge");
875 strcpy(
ErrMsg(),
"event dispatcher is not running");
883 shmId = Wait_(noWait);
905 if ((fd_ >= 0) && !extPipeErr_)
909 int res = WaitPipe_(1);
912 strcpy(
ErrMsg(),
"error reading event header");
925 if (read(fd_, &shmId,
sizeof(
int)) !=
sizeof(
int))
928 strcpy(
ErrMsg(),
"error reading event header");
934 shm_ = shmat(shmId, 0, SHM_RDONLY);
935 if (shm_ != (
void *)-1)
953 sprintf(
ErrMsg(),
"cannot attach to shared memory - %s",
965 if (write(fd_, &ack,
sizeof(
int)) !=
sizeof(
int))
968 strcpy(
ErrMsg(),
"error sending event acknowledge");
977 strcpy(
ErrMsg(),
"event dispatcher is not running");
985 shmId = Wait_(noWait);
1018 if ((fd_ >= 0) && !extPipeErr_)
1022 int res = WaitPipe_(1);
1025 strcpy(
ErrMsg(),
"error reading event header");
1037 if (read(fd_, &shmId,
sizeof(
int)) !=
sizeof(
int))
1040 strcpy(
ErrMsg(),
"error reading event header");
1046 shm_ = shmat(shmId, 0, SHM_RDONLY);
1047 if (shm_ != (
void *)-1)
1055 evtCnt_ = io->
event;
1056 shmdt(shm_); shm_ = NULL;
1061 sprintf(
ErrMsg(),
"cannot attach to shared memory - %s",
1073 if (write(fd_, &ack,
sizeof(
int)) !=
sizeof(
int))
1076 strcpy(
ErrMsg(),
"error sending event acknowledge");
1085 strcpy(
ErrMsg(),
"event dispatcher is not running");
1093 shmId = Wait_(noWait);
1106 shmdt(shm_); shm_ = NULL;
1149 struct sembuf semOp[2];
1155 if (++evtCnt_ == 0) evtCnt_ = 1;
1160 if (EvtLock_() != 0)
1164 evt_->shmId = shmId;
1165 evt_->event = evtCnt_;
1171 memset(&semOp[0], 0,
sizeof(
struct sembuf));
1172 memset(&semOp[1], 0,
sizeof(
struct sembuf));
1173 semOp[0].sem_op = 0;
1174 semOp[0].sem_flg = IPC_NOWAIT;
1175 semOp[1].sem_op = 1;
1176 semOp[1].sem_flg = 0;
1183 semOp[0].sem_num =
static_cast<unsigned short>(2 + i);
1184 semOp[1].sem_num =
static_cast<unsigned short>(2 + i);
1185 if (semop(semEvt_, &semOp[0], 2) != 0)
1187 if (errno == EAGAIN)
1194 else if (errno == EIDRM)
1201 sprintf(
ErrMsg(),
"semaphore error - %s\n", strerror(errno));
1211 struct sembuf semOp[2];
1215 strcpy(
ErrMsg(),
"event interface not initialized");
1218 else if (clientId_ < 0)
1220 strcpy(
ErrMsg(),
"not attached to events");
1224 if (EvtLock_() == 0)
1237 memset(&semOp[0], 0,
sizeof(
struct sembuf));
1238 memset(&semOp[1], 0,
sizeof(
struct sembuf));
1239 semOp[0].sem_op = 0;
1240 semOp[0].sem_flg = IPC_NOWAIT;
1241 semOp[0].sem_num =
static_cast<unsigned short>(2 + clientId_);
1242 semOp[1].sem_op = 1;
1243 semOp[1].sem_flg = 0;
1244 semOp[1].sem_num =
static_cast<unsigned short>(2 + clientId_);
1249 if (semop(semEvt_, &semOp[0], 2) != 0)
1251 if (errno == EAGAIN)
1258 else if (errno == EIDRM)
1265 sprintf(
ErrMsg(),
"semaphore error - %s\n", strerror(errno));
1274 if (EvtLock_() == 0)
1285 if (intPipe_ && (fd_ >= 0))
1287 if (read(fd_, &shmId,
sizeof(
int)) !=
sizeof(
int))
1289 strcpy(
ErrMsg(),
"error receiving immage event from pipe");
1298 if (intPipe_ && (fd_ >= 0))
1301 if (write(fd_, &ack,
sizeof(
int)) !=
sizeof(
int))
1303 strcpy(
ErrMsg(),
"error sending event acknowledge to pipe");
1344 if (write(fd, &shmId,
sizeof(
int)) !=
sizeof(
int))
1352 if (read(fd, &ack,
sizeof(
int)) !=
sizeof(
int))
1402 struct sembuf semOpWrLock_[3];
1405 struct sembuf semOpWrTryLock_[3];
1408 struct sembuf semOpWrUnlock_[1];
1411 struct sembuf semOpRdWait_[1];
1414 struct sembuf semOpRdLock_[2];
1417 struct sembuf semOpRdUnlock_[1];
1420 struct sembuf semOpEvtLock_[2];
1423 struct sembuf semOpEvtTryLock_[2];
1426 struct sembuf semOpEvtUnlock_[1];
1441 unsigned int evtCnt_;
1479 std::atomic_bool cancelled_;
1494 intPipe_ = 0; pipe_ = -1; pipeOpen_ = 0; thr_ = 0;
1495 extPipe_ = 0; extPipeErr_ = 0; pid_ = 0;
1503 thrId_ = pthread_self();
1512 memset(&semOpWrLock_[0], 0,
sizeof(
struct sembuf));
1513 memset(&semOpWrLock_[1], 0,
sizeof(
struct sembuf));
1514 memset(&semOpWrLock_[2], 0,
sizeof(
struct sembuf));
1515 semOpWrLock_[0].sem_num = 1;
1516 semOpWrLock_[0].sem_op = 0;
1517 semOpWrLock_[0].sem_flg = 0;
1518 semOpWrLock_[1].sem_num = 0;
1519 semOpWrLock_[1].sem_op = 0;
1520 semOpWrLock_[1].sem_flg = 0;
1521 semOpWrLock_[2].sem_num = 0;
1522 semOpWrLock_[2].sem_op = 1;
1523 semOpWrLock_[2].sem_flg = SEM_UNDO;
1528 memset(&semOpWrTryLock_[0], 0,
sizeof(
struct sembuf));
1529 memset(&semOpWrTryLock_[1], 0,
sizeof(
struct sembuf));
1530 memset(&semOpWrTryLock_[2], 0,
sizeof(
struct sembuf));
1531 semOpWrTryLock_[0].sem_num = 1;
1532 semOpWrTryLock_[0].sem_op = 0;
1533 semOpWrTryLock_[0].sem_flg = IPC_NOWAIT;
1534 semOpWrTryLock_[1].sem_num = 0;
1535 semOpWrTryLock_[1].sem_op = 0;
1536 semOpWrTryLock_[1].sem_flg = IPC_NOWAIT;
1537 semOpWrTryLock_[2].sem_num = 0;
1538 semOpWrTryLock_[2].sem_op = 1;
1539 semOpWrTryLock_[2].sem_flg = SEM_UNDO;
1546 memset(&semOpWrUnlock_[0], 0,
sizeof(
struct sembuf));
1547 semOpWrUnlock_[0].sem_num = 0;
1548 semOpWrUnlock_[0].sem_op = -1;
1549 semOpWrUnlock_[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
1555 memset(&semOpRdWait_[0], 0,
sizeof(
struct sembuf));
1556 semOpRdWait_[0].sem_num = 1;
1563 memset(&semOpRdLock_[0], 0,
sizeof(
struct sembuf));
1564 memset(&semOpRdLock_[1], 0,
sizeof(
struct sembuf));
1565 semOpRdLock_[0].sem_num = 0;
1566 semOpRdLock_[0].sem_op = 0;
1567 semOpRdLock_[0].sem_flg = 0;
1568 semOpRdLock_[1].sem_num = 1;
1569 semOpRdLock_[1].sem_op = 1;
1570 semOpRdLock_[1].sem_flg = SEM_UNDO;
1577 memset(&semOpRdUnlock_[0], 0,
sizeof(
struct sembuf));
1578 semOpRdUnlock_[0].sem_num = 1;
1579 semOpRdUnlock_[0].sem_op = -1;
1580 semOpRdUnlock_[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
1586 memset(&semOpEvtLock_[0], 0,
sizeof(
struct sembuf));
1587 memset(&semOpEvtLock_[1], 0,
sizeof(
struct sembuf));
1588 semOpEvtLock_[1].sem_num = 0;
1589 semOpEvtLock_[1].sem_op = 1;
1590 semOpEvtLock_[1].sem_flg = SEM_UNDO;
1596 memset(&semOpEvtTryLock_[0], 0,
sizeof(
struct sembuf));
1597 memset(&semOpEvtTryLock_[1], 0,
sizeof(
struct sembuf));
1598 semOpEvtTryLock_[0].sem_num = 0;
1599 semOpEvtTryLock_[0].sem_op = 0;
1600 semOpEvtTryLock_[0].sem_flg = IPC_NOWAIT;
1601 semOpEvtTryLock_[1].sem_num = 0;
1602 semOpEvtTryLock_[1].sem_op = 1;
1603 semOpEvtTryLock_[1].sem_flg = SEM_UNDO;
1609 memset(&semOpEvtUnlock_[0], 0,
sizeof(
struct sembuf));
1610 semOpEvtUnlock_[0].sem_num = 0;
1611 semOpEvtUnlock_[0].sem_op = -1;
1612 semOpEvtUnlock_[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
1619 key_t key = (key_t)-1;
1626 shmdt(evt_); evt_ = NULL;
1632 if (strlen(
name) > 0)
1636 snprintf(fileName,
sizeof(fileName),
"/tmp/ngcshmio_%u_%s", getuid(),
1638 fd = open(fileName, O_RDWR|O_CREAT|O_TRUNC, 0644);
1642 key = ftok(fileName, 0x1f);
1647 char *evar = getenv(
"INS_ROOT");
1648 if (evar != NULL) key = ftok(evar, 0x1f);
1651 evar = getenv(
"INTROOT");
1652 if (evar != NULL) key = ftok(evar, 0x1f);
1656 evar = getenv(
"HOME");
1657 if (evar != NULL) key = ftok(evar, 0x1f);
1661 if (key == (key_t)-1)
1663 strcpy(
ErrMsg(),
"unable to retrieve IPC-key");
1670 evtId_ = shmget(key,
sizeof(ngcb_shmevt_t), 0666);
1675 if (errno == EINVAL)
1681 evtId_ = shmget(key, 0, 0666);
1684 sprintf(
ErrMsg(),
"error creating shared memory - %s",
1692 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
1698 tmp = semget(key, 0, 0666);
1707 semctl(tmp, 0, IPC_RMID, ctl);
1713 evtId_ = shmget(key,
sizeof(ngcb_shmevt_t), 0666|IPC_CREAT|IPC_EXCL);
1716 if (errno == EEXIST)
1722 evtId_ = shmget(key,
sizeof(ngcb_shmevt_t), 0666);
1725 if ((errno == ENOENT) && (regCnt_ > 0))
1731 return(Register_());
1733 sprintf(
ErrMsg(),
"error creating shared memory - %s",
1740 sprintf(
ErrMsg(),
"error creating shared memory - %s",
1757 m = shmat(evtId_, 0, 0);
1758 if (m == (
void *)-1)
1767 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
1770 if ((e == EINVAL) && (regCnt_ > 0))
1776 return (Register_());
1780 sprintf(
ErrMsg(),
"cannot attach to shared memory - %s", strerror(e));
1786 evt_ =
static_cast<ngcb_shmevt_t *
>(m);
1792 ngcb_shmevt_t initStat;
1800 memcpy(evt_, &initStat,
sizeof(ngcb_shmevt_t));
1811 sprintf(
ErrMsg(),
"error creating semaphore - %s", strerror(errno));
1816 shmdt(evt_); evt_ = NULL;
1817 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
1824 ctl.
array = semArray;
1825 if (semctl(semEvt_, 0, SETALL, ctl) == -1)
1829 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(e));
1849 shmdt(evt_); evt_ = NULL;
1850 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
1852 if ((e == EIDRM) && (regCnt_ > 0))
1858 return (Register_());
1869 if (EvtLock_() != 0)
1879 shmdt(evt_); evt_ = NULL;
1880 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
1887 return (Register_());
1894 evt_->semId = semEvt_;
1903 semEvt_ = semget(key, 0, 0666);
1906 if ((errno == ENOENT) && (regCnt_ > 0))
1912 shmdt(evt_); evt_ = NULL;
1914 return (Register_());
1921 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
1932 if (semEvt_ != evt_->semId)
1940 shmdt(evt_); evt_ = NULL;
1942 return (Register_());
1946 strcpy(
ErrMsg(),
"semaphore mismatch");
1954 evtCnt_ = evt_->event;
1962 struct sembuf semOp[4];
1964 memset(&semOp[0], 0,
sizeof(
struct sembuf));
1965 memset(&semOp[1], 0,
sizeof(
struct sembuf));
1966 memset(&semOp[2], 0,
sizeof(
struct sembuf));
1967 memset(&semOp[3], 0,
sizeof(
struct sembuf));
1969 semOp[1].sem_num = 0;
1970 semOp[1].sem_op = 1;
1971 semOp[1].sem_flg = SEM_UNDO;
1973 semOp[2].sem_num = 1;
1974 semOp[2].sem_op = 1;
1975 semOp[2].sem_flg = SEM_UNDO;
1977 semOp[3].sem_num = 0;
1978 semOp[3].sem_op = -1;
1979 semOp[3].sem_flg = SEM_UNDO;
1980 if (semop(semEvt_, semOp, 4) != 0)
1984 shmdt(evt_); evt_ = NULL;
1985 if (e == EIDRM) semEvt_ = -1;
1997 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
2006 return (Register_());
2010 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(e));
2021 if (!extPipe_ && (semEvt_ >= 0) && (clientId_ >= 0))
2025 semctl(semEvt_, 2 + clientId_, SETVAL, ctl);
2033 if (semop(semEvt_, semOpEvtLock_, 2) != 0)
2037 while (semop(semEvt_, semOpEvtLock_, 2) != 0)
2041 if (errno == EIDRM) semEvt_ = -1;
2042 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
2049 if (errno == EIDRM) semEvt_ = -1;
2050 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
2057 strcpy(
ErrMsg(),
"invalid semaphore");
2068 if (semop(semEvt_, semOpEvtTryLock_, 2) == 0)
2074 if (errno == EIDRM) semEvt_ = -1;
2075 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
2080 strcpy(
ErrMsg(),
"invalid semaphore");
2088 if (semop(semEvt_, semOpEvtUnlock_, 1) != 0)
2090 if (errno == EIDRM) semEvt_ = -1;
2096 void SemEvtRemove_() {
2101 semctl(semEvt_, 0, IPC_RMID, ctl); semEvt_ = -1;
2106 int RdLock_(
int semId,
int noWait = 0) {
2109 if (noWait) semOpRdLock_[0].sem_flg = IPC_NOWAIT;
2110 else semOpRdLock_[0].sem_flg = 0;
2112 if (semop(semId, semOpRdLock_, 2) != 0)
2116 while (semop(semId, semOpRdLock_, 2) != 0)
2118 if (errno != EINTR)
return (-1);
2132 int RdUnlock_(
int semId) {
2135 if (semop(semId, semOpRdUnlock_, 1) != 0)
2144 int Wait_(
int noWait) {
2145 struct sembuf semOp[3];
2151 strcpy(
ErrMsg(),
"event interface not initialized");
2154 else if (clientId_ < 0)
2156 strcpy(
ErrMsg(),
"not attached to events");
2165 memset(&semOp[0], 0,
sizeof(
struct sembuf));
2166 memset(&semOp[1], 0,
sizeof(
struct sembuf));
2167 memset(&semOp[2], 0,
sizeof(
struct sembuf));
2168 semOp[0].sem_num =
static_cast<unsigned short>(2 + clientId_);
2169 semOp[0].sem_op = -1;
2170 semOp[2].sem_num = 0;
2171 semOp[2].sem_op = 1;
2172 semOp[2].sem_flg = SEM_UNDO;
2175 semOp[0].sem_flg = IPC_NOWAIT;
2176 semOp[1].sem_flg = IPC_NOWAIT;
2178 if (semop(semEvt_, semOp, 3) != 0)
2180 if (errno == EAGAIN)
2185 else if (errno == EINTR)
2189 else if (errno == EIDRM)
2197 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
2204 if (((evt_->event == evtCnt_) || (evt_->event == 0)) || cancelled_)
2209 evtCnt_ = evt_->event;
2235 shmId = evt_->shmId;
2236 evtCnt_ = evt_->event;
2255 if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) == -1)
2257 sprintf(
ErrMsg(),
"error opening event pipe - %s", strerror(errno));
2264 sprintf(arg,
"%d", fd[1]);
2271 sprintf(
ErrMsg(),
"error opening event pipe - %s", strerror(errno));
2272 close(fd[0]); close(fd[1]);
2285 execlp(
"ngcbShmEvt",
"ngcbShmEvt",
name, arg, (
char *)NULL);
2302 fdFlags = fcntl(fd[0], F_GETFD);
2303 if (fdFlags >= 0) fcntl(fd[0], F_SETFD, fdFlags | FD_CLOEXEC);
2308 if (read(fd[0], &ack,
sizeof(
int)) !=
sizeof(
int))
2310 strcpy(
ErrMsg(),
"unable to launch event dispatcher");
2311 close(fd[0]); waitpid(pid_, NULL, 0); pid_ = 0;
2322 if (read(fd[0], &size,
sizeof(
int)) !=
sizeof(
int))
2324 strcpy(
ErrMsg(),
"event dispatcher connection broken");
2325 close(fd[0]); waitpid(pid_, NULL, 0); pid_ = 0;
2331 if (read(fd[0],
ErrMsg(), size) != size)
2333 strcpy(
ErrMsg(),
"event dispatcher connection broken");
2338 strcpy(
ErrMsg(),
"unable to launch event dispatcher");
2340 close(fd[0]); waitpid(pid_, NULL, 0); pid_ = 0;
2351 pipeOpen_ = 0; close(fd_); fd_ = -1;
2355 kill(pid_, SIGTERM); waitpid(pid_, NULL, 0); pid_ = 0;
2361 pthread_join(thrId_, NULL);
2367 close(pipe_); pipe_ = -1;
2372 int WaitPipe_(
int noWait=0) {
2376 if ((fd_ < 0) || extPipeErr_)
2378 strcpy(
ErrMsg(),
"event dispatcher not running");
2383 fds.events = POLLIN;
2387 res = poll(&fds, 1, 0);
2391 res = poll(&fds, 1, -1);
2416 int StartThread_() {
2420 pthread_attr_t attr;
2425 if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) == -1)
2427 sprintf(
ErrMsg(),
"error opening event pipe - %s", strerror(errno));
2434 fdFlags = fcntl(fd[0], F_GETFD);
2435 if (fdFlags >= 0) fcntl(fd[0], F_SETFD, fdFlags | FD_CLOEXEC);
2436 fdFlags = fcntl(fd[1], F_GETFD);
2437 if (fdFlags >= 0) fcntl(fd[1], F_SETFD, fdFlags | FD_CLOEXEC);
2442 pthread_attr_init(&attr);
2443 pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
2444 pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
2445 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
2446 pthread_attr_setstacksize(&attr, 1024 * 1024);
2451 pipe_ = fd[1]; pipeOpen_ = 1;
2452 if (pthread_create(&thrId_, &attr, ngcbShmThread,
this) != 0)
2454 sprintf(
ErrMsg(),
"thread creation failed - %s", strerror(errno));
2455 close(fd[0]); close(fd[1]); pipe_ = -1; pipeOpen_ = -1;
2466 strcpy(
ErrMsg(),
"event dispatcher thread not installed");