12#error This is a C++ include file and cannot be used from plain C
22#include <sys/socket.h>
30#define ngcdcsMSTAT_IDLE 0
31#define ngcdcsMSTAT_PENDING 1
32#define ngcdcsMSTAT_ACTIVE 2
33#define ngcdcsMSTAT_VERIFYING 4
34#define ngcdcsMSTAT_MERGING 8
35#define ngcdcsMSTAT_INVALIDATING 16
36#define ngcdcsMSTAT_COMPL_SUCCESS 128
37#define ngcdcsMSTAT_COMPL_FAILURE 256
38#define ngcdcsMSTAT_COMPL_ABORTED 512
43#define ngcdcsMERGE_ACTIVE(status) ((status > ngcdcsMSTAT_IDLE) && \
44 (status < ngcdcsMSTAT_COMPL_SUCCESS))
50#define ngcdcsMRGSHM_MAXCON 4
137 strcpy(statStr_,
"idle");
154 memset(&semOpLock_[0], 0,
sizeof(
struct sembuf));
155 memset(&semOpLock_[1], 0,
sizeof(
struct sembuf));
156 semOpLock_[1].sem_op = 1;
157 semOpLock_[1].sem_flg = SEM_UNDO;
164 memset(&semOpUnlock_[0], 0,
sizeof(
struct sembuf));
165 semOpUnlock_[0].sem_op = -1;
166 semOpUnlock_[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
176 evar = getenv(
"HOSTNAME");
177 if (evar != NULL)
str2str(thisHost_, evar,
sizeof(thisHost_) - 1);
178 else strcpy(thisHost_,
"localhost");
183 evar = getenv(
"HOME");
184 if (evar != NULL) key_ = ftok(evar, (
'n' + id_) & 0xff);
187 evar = getenv(
"INS_ROOT");
188 if (evar != NULL) key_ = ftok(evar, (
'n' + id_) & 0xff);
192 evar = getenv(
"INTROOT");
193 if (evar != NULL) key_ = ftok(evar, (
'n' + id_) & 0xff);
197 strcpy(
ErrMsg(),
"unable to retrieve IPC-key");
217 shmId_ = shmget(key_, 0, 0666);
220 sprintf(
ErrMsg(),
"error creating shared memory - %s",
229 shmctl(shmId_, IPC_RMID, 0);
237 tmp = semget(key_, 0, 0666);
246 semctl(tmp, 0, IPC_RMID, ctl);
253 0666|IPC_CREAT|IPC_EXCL);
265 sprintf(
ErrMsg(),
"error creating shared memory - %s",
272 sprintf(
ErrMsg(),
"error creating shared memory - %s",
291 strcpy(
ErrMsg(),
"resources not available");
299 m = shmat(shmId_, 0, 0);
302 sprintf(
ErrMsg(),
"error attaching to shared memory - %s",
309 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
330 shm_->pid = getpid();
337 semId_ = semget(key_, 1, 0666|IPC_CREAT|IPC_EXCL);
340 sprintf(
ErrMsg(),
"error creating semaphore - %s",
346 shmdt(shm_); shm_ = NULL;
347 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
355 if (semctl(semId_, 0, SETVAL, ctl) == -1)
357 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
367 shmdt(shm_); shm_ = NULL;
368 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
385 shmdt(shm_); shm_ = NULL;
386 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
389 shm_->semId = semId_;
399 semId_ = semget(key_, 0, 0666);
402 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
414 if (semId_ != shm_->semId)
416 strcpy(
ErrMsg(),
"semaphore mismatch");
434 shmdt(shm_); shm_ = NULL;
445 shmdt(shm_); shm_ = NULL;
452 shm_->pid = getpid();
464 if ((shmId_ != -1) && (shm_ != NULL))
490 if (evtSocket_[i] >= 0)
492 shutdown(evtSocket_[i], SHUT_WR);
508 if (shm_->evt[i].port == port_) shm_->evt[i].port = 0;
517 shmdt(shm_); shm_ = NULL;
528 int Id() {
return (id_);}
531 key_t
Key() {
return (key_);}
564 shm_->status = status;
593 strcpy(statStr_, shm_->statusName);
601 void Msg(
const char *msg) {
605 strcpy(shm_->msg, msg);
617 strcpy(msg_, shm_->msg);
629 str2str(shm_->expId,
id,
sizeof(shm_->expId) - 1);
630 strcpy(shm_->newDataFileName, name);
643 strcpy(msg_, shm_->newDataFileName);
734 strcpy(
ErrMsg(),
"shared memory interface not initialized");
747 if (shm_->evt[i].port <= 0)
749 if (evtSocket_[i] >= 0)
757 shm_->evt[i].port = port;
768 strcpy(
ErrMsg(),
"no free event connection");
796 sprintf(
ErrMsg(),
"unable to resolve server port number");
833 if ((shm_->evt[i].port <= 0) && (evtSocket_[i] >= 0))
837 if ((shm_->evt[i].port > 0) && (evtSocket_[i] < 0))
846 sprintf(srv,
"%s,%d", thisHost_, shm_->evt[i].port);
848 if (sock < 0) shm_->evt[i].port = 0;
849 else evtSocket_[i] = sock;
861 sprintf(msg,
"!mrgexit: %d\n", id_ + 1);
868 sprintf(msg,
"!mrgstat: %d %d %s\n", id_ + 1, shm_->status,
876 sprintf(msg,
"!mrgfile: %d %s %s\n", id_ + 1, shm_->expId,
877 shm_->newDataFileName);
884 sprintf(msg,
"!mrgvx: %d %.0f\n", id_ + 1, shm_->vsize);
891 sprintf(msg,
"!mrgtx: %d %.0f\n", id_ + 1, shm_->tsize);
904 msgLen = (int)strlen(msg);
912 if (evtSocket_[i] >= 0)
915 if (
ngcbTcpWrite(evtSocket_[i], &msgLen,
sizeof(
int), erms) != 0)
922 else if (
ngcbTcpWrite(evtSocket_[i], msg, msgLen, erms) != 0)
949 strcpy(s,
"verifying");
952 strcpy(s,
"merging");
955 strcpy(s,
"invalidating");
958 strcpy(s,
"success");
961 strcpy(s,
"aborted");
964 strcpy(s,
"failure");
967 strcpy(s,
"unknown");
979 if ((shmId_ != -1) && (shm_ != NULL))
984 shmdt(shm_); shm_ = NULL;
985 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
1019 struct sembuf semOpLock_[2];
1022 struct sembuf semOpUnlock_[1];
1051 else if (semId_ >= 0)
1053 if (semop(semId_, semOpLock_, 2) != 0)
1057 while (semop(semId_, semOpLock_, 2) != 0)
1061 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
1076 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
1094 strcpy(
ErrMsg(),
"invalid semaphore");
1101 if (locked_ && (semId_ >= 0))
1103 if (semop(semId_, semOpUnlock_, 1) == 0)
1128 semctl(semId_, 0, IPC_RMID, ctl);
void BroadcastEvt(int evt=0)
Broadcast event.
Definition ngcdcsMRGSHM.hpp:814
void VSize(double s)
Write vsize attribute.
Definition ngcdcsMRGSHM.hpp:675
int Pid()
Return process id.
Definition ngcdcsMRGSHM.hpp:544
int Initialized()
Get intitialization flag.
Definition ngcdcsMRGSHM.hpp:522
void TSize(double s)
Write tsize attribute.
Definition ngcdcsMRGSHM.hpp:702
virtual ~ngcdcsMRGSHM()
Destructor.
Definition ngcdcsMRGSHM.hpp:463
void Pid(int pid)
Write process id.
Definition ngcdcsMRGSHM.hpp:534
int Id()
Return assigned merger id.
Definition ngcdcsMRGSHM.hpp:528
const char * StatusName()
Return status string.
Definition ngcdcsMRGSHM.hpp:588
key_t Key()
Return IPC-key.
Definition ngcdcsMRGSHM.hpp:531
void Status(int status)
Write status and issue event.
Definition ngcdcsMRGSHM.hpp:560
int OpenEvt()
Definition ngcdcsMRGSHM.hpp:777
int Status()
Return status.
Definition ngcdcsMRGSHM.hpp:572
ngcdcsMRGSHM(int id, int server, int creat=1)
Constructor.
Definition ngcdcsMRGSHM.hpp:126
char * ErrMsg()
Return error message.
Definition ngcdcsMRGSHM.hpp:525
const char * FileEvent()
Return file event.
Definition ngcdcsMRGSHM.hpp:637
void Stat2Str(int stat, char *s)
Convert status value to status string.
Definition ngcdcsMRGSHM.hpp:936
int AttachEvt(int port)
Attach to events.
Definition ngcdcsMRGSHM.hpp:729
void Remove()
Remove shared memory.
Definition ngcdcsMRGSHM.hpp:973
double TSize()
Return tsize attribute.
Definition ngcdcsMRGSHM.hpp:713
void FileEvent(const char *id, const char *name)
Issue file event.
Definition ngcdcsMRGSHM.hpp:625
void Abort()
Write abort flag.
Definition ngcdcsMRGSHM.hpp:651
int Aborted()
Return abort flag.
Definition ngcdcsMRGSHM.hpp:661
double VSize()
Return vsize attribute.
Definition ngcdcsMRGSHM.hpp:686
void Msg(const char *msg)
Write message.
Definition ngcdcsMRGSHM.hpp:601
const char * Msg()
Return message.
Definition ngcdcsMRGSHM.hpp:611
int ngcbTcpConnect(const char *service, char *erms)
Definition ngcbTcp.c:185
int ngcbSocketPort(int fd)
Definition ngcbSocket.c:201
int ngcbTcpClose(int fd)
Definition ngcbTcp.c:401
int ngcbTcpWrite(int fd, const void *buffer, size_t size, char *erms)
Definition ngcbTcp.c:459
int ngcbTcpService(const char *service, char *erms)
Definition ngcbTcp.c:38
#define str2str(s1, s2, n)
Definition ngcb.h:73
#define ngcbSUCCESS
Definition ngcb.h:137
#define ngcbFAILURE
Definition ngcb.h:139
#define ngcdcsMSTAT_MERGING
Definition ngcdcsMRGSHM.hpp:34
#define ngcdcsMSTAT_COMPL_FAILURE
Definition ngcdcsMRGSHM.hpp:37
#define ngcdcsMSTAT_VERIFYING
Definition ngcdcsMRGSHM.hpp:33
#define ngcdcsMSTAT_COMPL_ABORTED
Definition ngcdcsMRGSHM.hpp:38
#define ngcdcsMSTAT_ACTIVE
Definition ngcdcsMRGSHM.hpp:32
#define ngcdcsMSTAT_INVALIDATING
Definition ngcdcsMRGSHM.hpp:35
#define ngcdcsMRGSHM_MAXCON
Definition ngcdcsMRGSHM.hpp:50
#define ngcdcsMSTAT_IDLE
Definition ngcdcsMRGSHM.hpp:30
#define ngcdcsMSTAT_COMPL_SUCCESS
Definition ngcdcsMRGSHM.hpp:36
Definition ngcdcsMRGSHM.hpp:55
int port
Port number.
Definition ngcdcsMRGSHM.hpp:57
ngcdcs_mrgevt_t()
Constructor.
Definition ngcdcsMRGSHM.hpp:60
Definition ngcdcsMRGSHM.hpp:66
char newDataFileName[256]
New data file.
Definition ngcdcsMRGSHM.hpp:95
double vsize
Expected size after verification run (bytes)
Definition ngcdcsMRGSHM.hpp:89
int reserved1
Reserved for 64-bit alignment.
Definition ngcdcsMRGSHM.hpp:83
int abort
Abort request.
Definition ngcdcsMRGSHM.hpp:86
char msg[256]
Status message.
Definition ngcdcsMRGSHM.hpp:98
ngcdcs_mrgshm_t()
Constructor.
Definition ngcdcsMRGSHM.hpp:104
int pid
Process ID.
Definition ngcdcsMRGSHM.hpp:74
int semId
Semaphore id.
Definition ngcdcsMRGSHM.hpp:68
char statusName[32]
Status string.
Definition ngcdcsMRGSHM.hpp:80
char expId[64]
Exposure id.
Definition ngcdcsMRGSHM.hpp:71
double tsize
Transferred size (bytes)
Definition ngcdcsMRGSHM.hpp:92
ngcdcs_mrgevt_t evt[ngcdcsMRGSHM_MAXCON]
Event connections.
Definition ngcdcsMRGSHM.hpp:101
int status
Status.
Definition ngcdcsMRGSHM.hpp:77
int val
Definition ngcb.h:64