230 strcpy(
ErrMsg(),
"invalid name");
233 else if ((strlen(s) < 1) || (strlen(s) >= (
sizeof(
name) - 1)))
235 strcpy(
ErrMsg(),
"invalid name");
238 else if (s[0] ==
'.')
243 else if (s[0] ==
':')
253 if (strlen(
name) == 0)
255 strcpy(
ErrMsg(),
"invalid name");
276 if (Register_() != 0)
297 shmdt(shm_); shm_ = NULL;
305 shmdt(evt_); evt_ = NULL;
316 if (clientId_ >= 0) DetachEvt_();
318 if (EvtTryLock_() == 0)
327 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
338 if (strlen(
name) > 0)
341 snprintf(fileName,
sizeof(fileName),
"/tmp/ngcshmio_%u_%s",
348 struct sembuf semOp[4];
353 memset(&semOp[0], 0,
sizeof(
struct sembuf));
354 semOp[0].sem_num = 1;
355 semOp[0].sem_op = -1;
356 semOp[0].sem_flg = SEM_UNDO;
357 if (semop(semEvt_, semOp, 1) != 0)
359 if (errno == EIDRM) semEvt_ = -1;
374 int Fd() {
return (fd_);}
384 int val = semctl(semEvt_, 1, GETVAL, ctl);
387 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
406 if ((evtId_ != -1) && (evt_ != NULL))
411 shmdt(evt_); evt_ = NULL;
412 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
418 if (strlen(
name) > 0)
421 snprintf(fileName,
sizeof(fileName),
"/tmp/ngcshmio_%u_%s", getuid(),
440 if (semctl(semId, 0, SETVAL, ctl) == -1)
442 sprintf(
ErrMsg(),
"semaphore init failed - %s", strerror(errno));
448 if (semctl(semId, 1, SETVAL, ctl) == -1)
450 sprintf(
ErrMsg(),
"semaphore init failed - %s", strerror(errno));
460 if (semop(semId, semOpWrLock_, 3) != 0)
464 while (semop(semId, semOpWrLock_, 3) != 0)
468 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
475 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
488 if (semop(semId, semOpWrTryLock_, 3) != 0)
500 if (semop(semId, semOpWrUnlock_, 1) != 0)
502 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
515 if (semop(semId, semOpRdWait_, 1) != 0)
519 while (semop(semId, semOpRdWait_, 1) != 0)
534 return (semctl(semId, 1, GETVAL, ctl));
541 if ((fd_ >= 0) && !extPipeErr_)
544 if (write(fd_, &ack,
sizeof(
int)) !=
sizeof(
int)) extPipeErr_ = 1;
562 strcpy(
ErrMsg(),
"invalid shared memory id");
569 m = shmat(shmId, 0, SHM_RDONLY);
572 sprintf(
ErrMsg(),
"cannot lock shared memory - %s", strerror(errno));
582 if (RdLock_(io->
semId, noWait) != 0)
584 sprintf(
ErrMsg(),
"cannot lock shared memory - %s", strerror(errno));
596 semOpRdLock_[1].sem_flg = 0;
597 semOpRdUnlock_[0].sem_flg = IPC_NOWAIT;
606 strcpy(
ErrMsg(),
"invalid shared memory id");
613 m = shmat(shmId, 0, SHM_RDONLY);
616 sprintf(
ErrMsg(),
"cannot lock shared memory - %s", strerror(errno));
626 RdUnlock_(io->
semId);
645 strcpy(
ErrMsg(),
"invalid shared memory id");
652 shm_ = shmat(shmId, 0, SHM_RDONLY);
653 if (shm_ != (
void *)-1)
660 if (RdLock_(io->
semId, noWait) != 0)
663 sprintf(
ErrMsg(),
"cannot lock buffer - %s", strerror(errno));
664 shmdt(shm_); shm_ = NULL;
687 sprintf(
ErrMsg(),
"cannot attach to shared memory - %s",
708 RdUnlock_(io->
semId);
713 shmdt(shm_); shm_ = NULL;
718 unsigned int EvtCnt() {
return (evtCnt_);}
722 unsigned int n = evtCnt_ + 1;
729 struct sembuf semOp[1];
734 if ((fd_ < 0) || extPipeErr_)
736 strcpy(
ErrMsg(),
"event interface not initialized");
742 else if (semEvt_ < 0)
747 strcpy(
ErrMsg(),
"event interface not initialized");
750 else if (clientId_ >= 0)
757 else if (EvtLock_() != 0)
766 memset(&semOp[0], 0,
sizeof(
struct sembuf));
767 semOp[0].sem_op = -2;
768 semOp[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
772 semOp[0].sem_num =
static_cast<unsigned short>(2 + i);
773 if (semop(semEvt_, semOp, 1) == 0)
787 if (StartThread_() != 0)
796 else if (errno == EIDRM)
807 strcpy(
ErrMsg(),
"too many clients");
816 if ((fd_ >= 0) && !extPipeErr_)
819 int res = WaitPipe_(noWait);
832 if (read(fd_, &shmId,
sizeof(
int)) !=
sizeof(
int))
835 strcpy(
ErrMsg(),
"error reading event header");
841 shm_ = shmat(shmId, 0, SHM_RDONLY);
842 if (shm_ != (
void *)-1)
850 shmdt(shm_); shm_ = NULL;
855 sprintf(
ErrMsg(),
"shared memory error - %s", strerror(errno));
863 if (write(fd_, &ack,
sizeof(
int)) !=
sizeof(
int))
866 strcpy(
ErrMsg(),
"error sending event acknowledge");
874 strcpy(
ErrMsg(),
"event dispatcher is not running");
882 shmId = Wait_(noWait);
904 if ((fd_ >= 0) && !extPipeErr_)
908 int res = WaitPipe_(1);
911 strcpy(
ErrMsg(),
"error reading event header");
924 if (read(fd_, &shmId,
sizeof(
int)) !=
sizeof(
int))
927 strcpy(
ErrMsg(),
"error reading event header");
933 shm_ = shmat(shmId, 0, SHM_RDONLY);
934 if (shm_ != (
void *)-1)
952 sprintf(
ErrMsg(),
"cannot attach to shared memory - %s",
964 if (write(fd_, &ack,
sizeof(
int)) !=
sizeof(
int))
967 strcpy(
ErrMsg(),
"error sending event acknowledge");
976 strcpy(
ErrMsg(),
"event dispatcher is not running");
984 shmId = Wait_(noWait);
1017 if ((fd_ >= 0) && !extPipeErr_)
1021 int res = WaitPipe_(1);
1024 strcpy(
ErrMsg(),
"error reading event header");
1036 if (read(fd_, &shmId,
sizeof(
int)) !=
sizeof(
int))
1039 strcpy(
ErrMsg(),
"error reading event header");
1045 shm_ = shmat(shmId, 0, SHM_RDONLY);
1046 if (shm_ != (
void *)-1)
1054 evtCnt_ = io->
event;
1055 shmdt(shm_); shm_ = NULL;
1060 sprintf(
ErrMsg(),
"cannot attach to shared memory - %s",
1072 if (write(fd_, &ack,
sizeof(
int)) !=
sizeof(
int))
1075 strcpy(
ErrMsg(),
"error sending event acknowledge");
1084 strcpy(
ErrMsg(),
"event dispatcher is not running");
1092 shmId = Wait_(noWait);
1105 shmdt(shm_); shm_ = NULL;
1148 struct sembuf semOp[2];
1154 if (++evtCnt_ == 0) evtCnt_ = 1;
1159 if (EvtLock_() != 0)
1163 evt_->shmId = shmId;
1164 evt_->event = evtCnt_;
1170 memset(&semOp[0], 0,
sizeof(
struct sembuf));
1171 memset(&semOp[1], 0,
sizeof(
struct sembuf));
1172 semOp[0].sem_op = 0;
1173 semOp[0].sem_flg = IPC_NOWAIT;
1174 semOp[1].sem_op = 1;
1175 semOp[1].sem_flg = 0;
1182 semOp[0].sem_num =
static_cast<unsigned short>(2 + i);
1183 semOp[1].sem_num =
static_cast<unsigned short>(2 + i);
1184 if (semop(semEvt_, &semOp[0], 2) != 0)
1186 if (errno == EAGAIN)
1193 else if (errno == EIDRM)
1200 sprintf(
ErrMsg(),
"semaphore error - %s\n", strerror(errno));
1210 struct sembuf semOp[2];
1214 strcpy(
ErrMsg(),
"event interface not initialized");
1217 else if (clientId_ < 0)
1219 strcpy(
ErrMsg(),
"not attached to events");
1223 if (EvtLock_() == 0)
1236 memset(&semOp[0], 0,
sizeof(
struct sembuf));
1237 memset(&semOp[1], 0,
sizeof(
struct sembuf));
1238 semOp[0].sem_op = 0;
1239 semOp[0].sem_flg = IPC_NOWAIT;
1240 semOp[0].sem_num =
static_cast<unsigned short>(2 + clientId_);
1241 semOp[1].sem_op = 1;
1242 semOp[1].sem_flg = 0;
1243 semOp[1].sem_num =
static_cast<unsigned short>(2 + clientId_);
1248 if (semop(semEvt_, &semOp[0], 2) != 0)
1250 if (errno == EAGAIN)
1257 else if (errno == EIDRM)
1264 sprintf(
ErrMsg(),
"semaphore error - %s\n", strerror(errno));
1273 if (EvtLock_() == 0)
1284 if (intPipe_ && (fd_ >= 0))
1286 if (read(fd_, &shmId,
sizeof(
int)) !=
sizeof(
int))
1288 strcpy(
ErrMsg(),
"error receiving immage event from pipe");
1297 if (intPipe_ && (fd_ >= 0))
1300 if (write(fd_, &ack,
sizeof(
int)) !=
sizeof(
int))
1302 strcpy(
ErrMsg(),
"error sending event acknowledge to pipe");
1343 if (write(fd, &shmId,
sizeof(
int)) !=
sizeof(
int))
1351 if (read(fd, &ack,
sizeof(
int)) !=
sizeof(
int))
1401 struct sembuf semOpWrLock_[3];
1404 struct sembuf semOpWrTryLock_[3];
1407 struct sembuf semOpWrUnlock_[1];
1410 struct sembuf semOpRdWait_[1];
1413 struct sembuf semOpRdLock_[2];
1416 struct sembuf semOpRdUnlock_[1];
1419 struct sembuf semOpEvtLock_[2];
1422 struct sembuf semOpEvtTryLock_[2];
1425 struct sembuf semOpEvtUnlock_[1];
1440 unsigned int evtCnt_;
1478 std::atomic_bool cancelled_;
1493 intPipe_ = 0; pipe_ = -1; pipeOpen_ = 0; thr_ = 0;
1494 extPipe_ = 0; extPipeErr_ = 0; pid_ = 0;
1502 thrId_ = pthread_self();
1511 memset(&semOpWrLock_[0], 0,
sizeof(
struct sembuf));
1512 memset(&semOpWrLock_[1], 0,
sizeof(
struct sembuf));
1513 memset(&semOpWrLock_[2], 0,
sizeof(
struct sembuf));
1514 semOpWrLock_[0].sem_num = 1;
1515 semOpWrLock_[0].sem_op = 0;
1516 semOpWrLock_[0].sem_flg = 0;
1517 semOpWrLock_[1].sem_num = 0;
1518 semOpWrLock_[1].sem_op = 0;
1519 semOpWrLock_[1].sem_flg = 0;
1520 semOpWrLock_[2].sem_num = 0;
1521 semOpWrLock_[2].sem_op = 1;
1522 semOpWrLock_[2].sem_flg = SEM_UNDO;
1527 memset(&semOpWrTryLock_[0], 0,
sizeof(
struct sembuf));
1528 memset(&semOpWrTryLock_[1], 0,
sizeof(
struct sembuf));
1529 memset(&semOpWrTryLock_[2], 0,
sizeof(
struct sembuf));
1530 semOpWrTryLock_[0].sem_num = 1;
1531 semOpWrTryLock_[0].sem_op = 0;
1532 semOpWrTryLock_[0].sem_flg = IPC_NOWAIT;
1533 semOpWrTryLock_[1].sem_num = 0;
1534 semOpWrTryLock_[1].sem_op = 0;
1535 semOpWrTryLock_[1].sem_flg = IPC_NOWAIT;
1536 semOpWrTryLock_[2].sem_num = 0;
1537 semOpWrTryLock_[2].sem_op = 1;
1538 semOpWrTryLock_[2].sem_flg = SEM_UNDO;
1545 memset(&semOpWrUnlock_[0], 0,
sizeof(
struct sembuf));
1546 semOpWrUnlock_[0].sem_num = 0;
1547 semOpWrUnlock_[0].sem_op = -1;
1548 semOpWrUnlock_[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
1554 memset(&semOpRdWait_[0], 0,
sizeof(
struct sembuf));
1555 semOpRdWait_[0].sem_num = 1;
1562 memset(&semOpRdLock_[0], 0,
sizeof(
struct sembuf));
1563 memset(&semOpRdLock_[1], 0,
sizeof(
struct sembuf));
1564 semOpRdLock_[0].sem_num = 0;
1565 semOpRdLock_[0].sem_op = 0;
1566 semOpRdLock_[0].sem_flg = 0;
1567 semOpRdLock_[1].sem_num = 1;
1568 semOpRdLock_[1].sem_op = 1;
1569 semOpRdLock_[1].sem_flg = SEM_UNDO;
1576 memset(&semOpRdUnlock_[0], 0,
sizeof(
struct sembuf));
1577 semOpRdUnlock_[0].sem_num = 1;
1578 semOpRdUnlock_[0].sem_op = -1;
1579 semOpRdUnlock_[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
1585 memset(&semOpEvtLock_[0], 0,
sizeof(
struct sembuf));
1586 memset(&semOpEvtLock_[1], 0,
sizeof(
struct sembuf));
1587 semOpEvtLock_[1].sem_num = 0;
1588 semOpEvtLock_[1].sem_op = 1;
1589 semOpEvtLock_[1].sem_flg = SEM_UNDO;
1595 memset(&semOpEvtTryLock_[0], 0,
sizeof(
struct sembuf));
1596 memset(&semOpEvtTryLock_[1], 0,
sizeof(
struct sembuf));
1597 semOpEvtTryLock_[0].sem_num = 0;
1598 semOpEvtTryLock_[0].sem_op = 0;
1599 semOpEvtTryLock_[0].sem_flg = IPC_NOWAIT;
1600 semOpEvtTryLock_[1].sem_num = 0;
1601 semOpEvtTryLock_[1].sem_op = 1;
1602 semOpEvtTryLock_[1].sem_flg = SEM_UNDO;
1608 memset(&semOpEvtUnlock_[0], 0,
sizeof(
struct sembuf));
1609 semOpEvtUnlock_[0].sem_num = 0;
1610 semOpEvtUnlock_[0].sem_op = -1;
1611 semOpEvtUnlock_[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
1618 key_t key = (key_t)-1;
1625 shmdt(evt_); evt_ = NULL;
1631 if (strlen(
name) > 0)
1635 snprintf(fileName,
sizeof(fileName),
"/tmp/ngcshmio_%u_%s", getuid(),
1637 fd = open(fileName, O_RDWR|O_CREAT|O_TRUNC, 0644);
1641 key = ftok(fileName, 0x1f);
1646 char *evar = getenv(
"INS_ROOT");
1647 if (evar != NULL) key = ftok(evar, 0x1f);
1650 evar = getenv(
"INTROOT");
1651 if (evar != NULL) key = ftok(evar, 0x1f);
1655 evar = getenv(
"HOME");
1656 if (evar != NULL) key = ftok(evar, 0x1f);
1660 if (key == (key_t)-1)
1662 strcpy(
ErrMsg(),
"unable to retrieve IPC-key");
1669 evtId_ = shmget(key,
sizeof(ngcb_shmevt_t), 0666);
1674 if (errno == EINVAL)
1680 evtId_ = shmget(key, 0, 0666);
1683 sprintf(
ErrMsg(),
"error creating shared memory - %s",
1691 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
1697 tmp = semget(key, 0, 0666);
1706 semctl(tmp, 0, IPC_RMID, ctl);
1712 evtId_ = shmget(key,
sizeof(ngcb_shmevt_t), 0666|IPC_CREAT|IPC_EXCL);
1715 if (errno == EEXIST)
1721 evtId_ = shmget(key,
sizeof(ngcb_shmevt_t), 0666);
1724 if ((errno == ENOENT) && (regCnt_ > 0))
1730 return(Register_());
1732 sprintf(
ErrMsg(),
"error creating shared memory - %s",
1739 sprintf(
ErrMsg(),
"error creating shared memory - %s",
1756 m = shmat(evtId_, 0, 0);
1757 if (m == (
void *)-1)
1766 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
1769 if ((e == EINVAL) && (regCnt_ > 0))
1775 return (Register_());
1779 sprintf(
ErrMsg(),
"cannot attach to shared memory - %s", strerror(e));
1785 evt_ =
static_cast<ngcb_shmevt_t *
>(m);
1791 ngcb_shmevt_t initStat;
1799 memcpy(evt_, &initStat,
sizeof(ngcb_shmevt_t));
1810 sprintf(
ErrMsg(),
"error creating semaphore - %s", strerror(errno));
1815 shmdt(evt_); evt_ = NULL;
1816 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
1823 ctl.
array = semArray;
1824 if (semctl(semEvt_, 0, SETALL, ctl) == -1)
1828 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(e));
1848 shmdt(evt_); evt_ = NULL;
1849 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
1851 if ((e == EIDRM) && (regCnt_ > 0))
1857 return (Register_());
1868 if (EvtLock_() != 0)
1878 shmdt(evt_); evt_ = NULL;
1879 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
1886 return (Register_());
1893 evt_->semId = semEvt_;
1902 semEvt_ = semget(key, 0, 0666);
1905 if ((errno == ENOENT) && (regCnt_ > 0))
1911 shmdt(evt_); evt_ = NULL;
1913 return (Register_());
1920 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
1931 if (semEvt_ != evt_->semId)
1939 shmdt(evt_); evt_ = NULL;
1941 return (Register_());
1945 strcpy(
ErrMsg(),
"semaphore mismatch");
1953 evtCnt_ = evt_->event;
1961 struct sembuf semOp[4];
1963 memset(&semOp[0], 0,
sizeof(
struct sembuf));
1964 memset(&semOp[1], 0,
sizeof(
struct sembuf));
1965 memset(&semOp[2], 0,
sizeof(
struct sembuf));
1966 memset(&semOp[3], 0,
sizeof(
struct sembuf));
1968 semOp[1].sem_num = 0;
1969 semOp[1].sem_op = 1;
1970 semOp[1].sem_flg = SEM_UNDO;
1972 semOp[2].sem_num = 1;
1973 semOp[2].sem_op = 1;
1974 semOp[2].sem_flg = SEM_UNDO;
1976 semOp[3].sem_num = 0;
1977 semOp[3].sem_op = -1;
1978 semOp[3].sem_flg = SEM_UNDO;
1979 if (semop(semEvt_, semOp, 4) != 0)
1983 shmdt(evt_); evt_ = NULL;
1984 if (e == EIDRM) semEvt_ = -1;
1996 shmctl(evtId_, IPC_RMID, 0); evtId_ = -1;
2005 return (Register_());
2009 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(e));
2020 if (!extPipe_ && (semEvt_ >= 0) && (clientId_ >= 0))
2024 semctl(semEvt_, 2 + clientId_, SETVAL, ctl);
2032 if (semop(semEvt_, semOpEvtLock_, 2) != 0)
2036 while (semop(semEvt_, semOpEvtLock_, 2) != 0)
2040 if (errno == EIDRM) semEvt_ = -1;
2041 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
2048 if (errno == EIDRM) semEvt_ = -1;
2049 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
2056 strcpy(
ErrMsg(),
"invalid semaphore");
2067 if (semop(semEvt_, semOpEvtTryLock_, 2) == 0)
2073 if (errno == EIDRM) semEvt_ = -1;
2074 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
2079 strcpy(
ErrMsg(),
"invalid semaphore");
2087 if (semop(semEvt_, semOpEvtUnlock_, 1) != 0)
2089 if (errno == EIDRM) semEvt_ = -1;
2095 void SemEvtRemove_() {
2100 semctl(semEvt_, 0, IPC_RMID, ctl); semEvt_ = -1;
2105 int RdLock_(
int semId,
int noWait = 0) {
2108 if (noWait) semOpRdLock_[0].sem_flg = IPC_NOWAIT;
2109 else semOpRdLock_[0].sem_flg = 0;
2111 if (semop(semId, semOpRdLock_, 2) != 0)
2115 while (semop(semId, semOpRdLock_, 2) != 0)
2117 if (errno != EINTR)
return (-1);
2131 int RdUnlock_(
int semId) {
2134 if (semop(semId, semOpRdUnlock_, 1) != 0)
2143 int Wait_(
int noWait) {
2144 struct sembuf semOp[3];
2150 strcpy(
ErrMsg(),
"event interface not initialized");
2153 else if (clientId_ < 0)
2155 strcpy(
ErrMsg(),
"not attached to events");
2164 memset(&semOp[0], 0,
sizeof(
struct sembuf));
2165 memset(&semOp[1], 0,
sizeof(
struct sembuf));
2166 memset(&semOp[2], 0,
sizeof(
struct sembuf));
2167 semOp[0].sem_num =
static_cast<unsigned short>(2 + clientId_);
2168 semOp[0].sem_op = -1;
2169 semOp[2].sem_num = 0;
2170 semOp[2].sem_op = 1;
2171 semOp[2].sem_flg = SEM_UNDO;
2174 semOp[0].sem_flg = IPC_NOWAIT;
2175 semOp[1].sem_flg = IPC_NOWAIT;
2177 if (semop(semEvt_, semOp, 3) != 0)
2179 if (errno == EAGAIN)
2184 else if (errno == EINTR)
2188 else if (errno == EIDRM)
2196 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
2203 if (((evt_->event == evtCnt_) || (evt_->event == 0)) || cancelled_)
2208 evtCnt_ = evt_->event;
2234 shmId = evt_->shmId;
2235 evtCnt_ = evt_->event;
2254 if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) == -1)
2256 sprintf(
ErrMsg(),
"error opening event pipe - %s", strerror(errno));
2263 sprintf(arg,
"%d", fd[1]);
2270 sprintf(
ErrMsg(),
"error opening event pipe - %s", strerror(errno));
2271 close(fd[0]); close(fd[1]);
2284 execlp(
"ngcbShmEvt",
"ngcbShmEvt",
name, arg, (
char *)NULL);
2301 fdFlags = fcntl(fd[0], F_GETFD);
2302 if (fdFlags >= 0) fcntl(fd[0], F_SETFD, fdFlags | FD_CLOEXEC);
2307 if (read(fd[0], &ack,
sizeof(
int)) !=
sizeof(
int))
2309 strcpy(
ErrMsg(),
"unable to launch event dispatcher");
2310 close(fd[0]); waitpid(pid_, NULL, 0); pid_ = 0;
2321 if (read(fd[0], &size,
sizeof(
int)) !=
sizeof(
int))
2323 strcpy(
ErrMsg(),
"event dispatcher connection broken");
2324 close(fd[0]); waitpid(pid_, NULL, 0); pid_ = 0;
2330 if (read(fd[0],
ErrMsg(), size) != size)
2332 strcpy(
ErrMsg(),
"event dispatcher connection broken");
2337 strcpy(
ErrMsg(),
"unable to launch event dispatcher");
2339 close(fd[0]); waitpid(pid_, NULL, 0); pid_ = 0;
2350 pipeOpen_ = 0; close(fd_); fd_ = -1;
2354 kill(pid_, SIGTERM); waitpid(pid_, NULL, 0); pid_ = 0;
2360 pthread_join(thrId_, NULL);
2366 close(pipe_); pipe_ = -1;
2371 int WaitPipe_(
int noWait=0) {
2375 if ((fd_ < 0) || extPipeErr_)
2377 strcpy(
ErrMsg(),
"event dispatcher not running");
2382 fds.events = POLLIN;
2386 res = poll(&fds, 1, 0);
2390 res = poll(&fds, 1, -1);
2415 int StartThread_() {
2419 pthread_attr_t attr;
2424 if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) == -1)
2426 sprintf(
ErrMsg(),
"error opening event pipe - %s", strerror(errno));
2433 fdFlags = fcntl(fd[0], F_GETFD);
2434 if (fdFlags >= 0) fcntl(fd[0], F_SETFD, fdFlags | FD_CLOEXEC);
2435 fdFlags = fcntl(fd[1], F_GETFD);
2436 if (fdFlags >= 0) fcntl(fd[1], F_SETFD, fdFlags | FD_CLOEXEC);
2441 pthread_attr_init(&attr);
2442 pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
2443 pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
2444 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
2445 pthread_attr_setstacksize(&attr, 1024 * 1024);
2450 pipe_ = fd[1]; pipeOpen_ = 1;
2451 if (pthread_create(&thrId_, &attr, ngcbShmThread,
this) != 0)
2453 sprintf(
ErrMsg(),
"thread creation failed - %s", strerror(errno));
2454 close(fd[0]); close(fd[1]); pipe_ = -1; pipeOpen_ = -1;
2465 strcpy(
ErrMsg(),
"event dispatcher thread not installed");