13#error This is a C++ include file and cannot be used from plain C
23#include <sys/socket.h>
31#define ngcdcsMSTAT_IDLE 0
32#define ngcdcsMSTAT_PENDING 1
33#define ngcdcsMSTAT_ACTIVE 2
34#define ngcdcsMSTAT_VERIFYING 4
35#define ngcdcsMSTAT_MERGING 8
36#define ngcdcsMSTAT_INVALIDATING 16
37#define ngcdcsMSTAT_COMPL_SUCCESS 128
38#define ngcdcsMSTAT_COMPL_FAILURE 256
39#define ngcdcsMSTAT_COMPL_ABORTED 512
44#define ngcdcsMERGE_ACTIVE(status) ((status > ngcdcsMSTAT_IDLE) && \
45 (status < ngcdcsMSTAT_COMPL_SUCCESS))
51#define ngcdcsMRGSHM_MAXCON 4
138 strcpy(statStr_,
"idle");
155 memset(&semOpLock_[0], 0,
sizeof(
struct sembuf));
156 memset(&semOpLock_[1], 0,
sizeof(
struct sembuf));
157 semOpLock_[1].sem_op = 1;
158 semOpLock_[1].sem_flg = SEM_UNDO;
165 memset(&semOpUnlock_[0], 0,
sizeof(
struct sembuf));
166 semOpUnlock_[0].sem_op = -1;
167 semOpUnlock_[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
177 evar = getenv(
"HOSTNAME");
178 if (evar != NULL)
str2str(thisHost_, evar,
sizeof(thisHost_) - 1);
179 else strcpy(thisHost_,
"localhost");
184 evar = getenv(
"HOME");
185 if (evar != NULL) key_ = ftok(evar, (
'n' + id_) & 0xff);
188 evar = getenv(
"INS_ROOT");
189 if (evar != NULL) key_ = ftok(evar, (
'n' + id_) & 0xff);
193 evar = getenv(
"INTROOT");
194 if (evar != NULL) key_ = ftok(evar, (
'n' + id_) & 0xff);
198 strcpy(
ErrMsg(),
"unable to retrieve IPC-key");
218 shmId_ = shmget(key_, 0, 0666);
221 sprintf(
ErrMsg(),
"error creating shared memory - %s",
230 shmctl(shmId_, IPC_RMID, 0);
238 tmp = semget(key_, 0, 0666);
247 semctl(tmp, 0, IPC_RMID, ctl);
254 0666|IPC_CREAT|IPC_EXCL);
266 sprintf(
ErrMsg(),
"error creating shared memory - %s",
273 sprintf(
ErrMsg(),
"error creating shared memory - %s",
292 strcpy(
ErrMsg(),
"resources not available");
300 m = shmat(shmId_, 0, 0);
303 sprintf(
ErrMsg(),
"error attaching to shared memory - %s",
310 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
331 shm_->pid = getpid();
338 semId_ = semget(key_, 1, 0666|IPC_CREAT|IPC_EXCL);
341 sprintf(
ErrMsg(),
"error creating semaphore - %s",
347 shmdt(shm_); shm_ = NULL;
348 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
356 if (semctl(semId_, 0, SETVAL, ctl) == -1)
358 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
368 shmdt(shm_); shm_ = NULL;
369 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
386 shmdt(shm_); shm_ = NULL;
387 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
390 shm_->semId = semId_;
400 semId_ = semget(key_, 0, 0666);
403 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
415 if (semId_ != shm_->semId)
417 strcpy(
ErrMsg(),
"semaphore mismatch");
435 shmdt(shm_); shm_ = NULL;
446 shmdt(shm_); shm_ = NULL;
453 shm_->pid = getpid();
465 if ((shmId_ != -1) && (shm_ != NULL))
491 if (evtSocket_[i] >= 0)
493 shutdown(evtSocket_[i], SHUT_WR);
509 if (shm_->evt[i].port == port_) shm_->evt[i].port = 0;
518 shmdt(shm_); shm_ = NULL;
529 int Id() {
return (id_);}
532 key_t
Key() {
return (key_);}
565 shm_->status = status;
594 strcpy(statStr_, shm_->statusName);
602 void Msg(
const char *msg) {
606 strcpy(shm_->msg, msg);
618 strcpy(msg_, shm_->msg);
630 str2str(shm_->expId,
id,
sizeof(shm_->expId) - 1);
631 strcpy(shm_->newDataFileName, name);
644 strcpy(msg_, shm_->newDataFileName);
735 strcpy(
ErrMsg(),
"shared memory interface not initialized");
748 if (shm_->evt[i].port <= 0)
750 if (evtSocket_[i] >= 0)
758 shm_->evt[i].port = port;
769 strcpy(
ErrMsg(),
"no free event connection");
797 sprintf(
ErrMsg(),
"unable to resolve server port number");
834 if ((shm_->evt[i].port <= 0) && (evtSocket_[i] >= 0))
838 if ((shm_->evt[i].port > 0) && (evtSocket_[i] < 0))
847 sprintf(srv,
"%s,%d", thisHost_, shm_->evt[i].port);
849 if (sock < 0) shm_->evt[i].port = 0;
850 else evtSocket_[i] = sock;
862 sprintf(msg,
"!mrgexit: %d\n", id_ + 1);
869 sprintf(msg,
"!mrgstat: %d %d %s\n", id_ + 1, shm_->status,
877 sprintf(msg,
"!mrgfile: %d %s %s\n", id_ + 1, shm_->expId,
878 shm_->newDataFileName);
885 sprintf(msg,
"!mrgvx: %d %.0f\n", id_ + 1, shm_->vsize);
892 sprintf(msg,
"!mrgtx: %d %.0f\n", id_ + 1, shm_->tsize);
905 msgLen = (int)strlen(msg);
913 if (evtSocket_[i] >= 0)
916 if (
ngcbTcpWrite(evtSocket_[i], &msgLen,
sizeof(
int), erms) != 0)
923 else if (
ngcbTcpWrite(evtSocket_[i], msg, msgLen, erms) != 0)
950 strcpy(s,
"verifying");
953 strcpy(s,
"merging");
956 strcpy(s,
"invalidating");
959 strcpy(s,
"success");
962 strcpy(s,
"aborted");
965 strcpy(s,
"failure");
968 strcpy(s,
"unknown");
980 if ((shmId_ != -1) && (shm_ != NULL))
985 shmdt(shm_); shm_ = NULL;
986 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
1020 struct sembuf semOpLock_[2];
1023 struct sembuf semOpUnlock_[1];
1052 else if (semId_ >= 0)
1054 if (semop(semId_, semOpLock_, 2) != 0)
1058 while (semop(semId_, semOpLock_, 2) != 0)
1062 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
1077 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
1095 strcpy(
ErrMsg(),
"invalid semaphore");
1102 if (locked_ && (semId_ >= 0))
1104 if (semop(semId_, semOpUnlock_, 1) == 0)
1129 semctl(semId_, 0, IPC_RMID, ctl);
void BroadcastEvt(int evt=0)
Broadcast event.
Definition ngcdcsMRGSHM.hpp:815
void VSize(double s)
Write vsize attribute.
Definition ngcdcsMRGSHM.hpp:676
int Pid()
Return process id.
Definition ngcdcsMRGSHM.hpp:545
int Initialized()
Get intitialization flag.
Definition ngcdcsMRGSHM.hpp:523
void TSize(double s)
Write tsize attribute.
Definition ngcdcsMRGSHM.hpp:703
virtual ~ngcdcsMRGSHM()
Destructor.
Definition ngcdcsMRGSHM.hpp:464
void Pid(int pid)
Write process id.
Definition ngcdcsMRGSHM.hpp:535
int Id()
Return assigned merger id.
Definition ngcdcsMRGSHM.hpp:529
const char * StatusName()
Return status string.
Definition ngcdcsMRGSHM.hpp:589
key_t Key()
Return IPC-key.
Definition ngcdcsMRGSHM.hpp:532
void Status(int status)
Write status and issue event.
Definition ngcdcsMRGSHM.hpp:561
int OpenEvt()
Definition ngcdcsMRGSHM.hpp:778
int Status()
Return status.
Definition ngcdcsMRGSHM.hpp:573
ngcdcsMRGSHM(int id, int server, int creat=1)
Constructor.
Definition ngcdcsMRGSHM.hpp:127
char * ErrMsg()
Return error message.
Definition ngcdcsMRGSHM.hpp:526
const char * FileEvent()
Return file event.
Definition ngcdcsMRGSHM.hpp:638
void Stat2Str(int stat, char *s)
Convert status value to status string.
Definition ngcdcsMRGSHM.hpp:937
int AttachEvt(int port)
Attach to events.
Definition ngcdcsMRGSHM.hpp:730
void Remove()
Remove shared memory.
Definition ngcdcsMRGSHM.hpp:974
double TSize()
Return tsize attribute.
Definition ngcdcsMRGSHM.hpp:714
void FileEvent(const char *id, const char *name)
Issue file event.
Definition ngcdcsMRGSHM.hpp:626
void Abort()
Write abort flag.
Definition ngcdcsMRGSHM.hpp:652
int Aborted()
Return abort flag.
Definition ngcdcsMRGSHM.hpp:662
double VSize()
Return vsize attribute.
Definition ngcdcsMRGSHM.hpp:687
void Msg(const char *msg)
Write message.
Definition ngcdcsMRGSHM.hpp:602
const char * Msg()
Return message.
Definition ngcdcsMRGSHM.hpp:612
int ngcbTcpConnect(const char *service, char *erms)
Definition ngcbTcp.c:186
int ngcbSocketPort(int fd)
Definition ngcbSocket.c:202
int ngcbTcpClose(int fd)
Definition ngcbTcp.c:402
int ngcbTcpWrite(int fd, const void *buffer, size_t size, char *erms)
Definition ngcbTcp.c:460
int ngcbTcpService(const char *service, char *erms)
Definition ngcbTcp.c:39
#define str2str(s1, s2, n)
Definition ngcb.h:74
#define ngcbSUCCESS
Definition ngcb.h:138
#define ngcbFAILURE
Definition ngcb.h:140
#define ngcdcsMSTAT_MERGING
Definition ngcdcsMRGSHM.hpp:35
#define ngcdcsMSTAT_COMPL_FAILURE
Definition ngcdcsMRGSHM.hpp:38
#define ngcdcsMSTAT_VERIFYING
Definition ngcdcsMRGSHM.hpp:34
#define ngcdcsMSTAT_COMPL_ABORTED
Definition ngcdcsMRGSHM.hpp:39
#define ngcdcsMSTAT_ACTIVE
Definition ngcdcsMRGSHM.hpp:33
#define ngcdcsMSTAT_INVALIDATING
Definition ngcdcsMRGSHM.hpp:36
#define ngcdcsMRGSHM_MAXCON
Definition ngcdcsMRGSHM.hpp:51
#define ngcdcsMSTAT_IDLE
Definition ngcdcsMRGSHM.hpp:31
#define ngcdcsMSTAT_COMPL_SUCCESS
Definition ngcdcsMRGSHM.hpp:37
Definition ngcdcsMRGSHM.hpp:56
int port
Port number.
Definition ngcdcsMRGSHM.hpp:58
ngcdcs_mrgevt_t()
Constructor.
Definition ngcdcsMRGSHM.hpp:61
Definition ngcdcsMRGSHM.hpp:67
char newDataFileName[256]
New data file.
Definition ngcdcsMRGSHM.hpp:96
double vsize
Expected size after verification run (bytes)
Definition ngcdcsMRGSHM.hpp:90
int reserved1
Reserved for 64-bit alignment.
Definition ngcdcsMRGSHM.hpp:84
int abort
Abort request.
Definition ngcdcsMRGSHM.hpp:87
char msg[256]
Status message.
Definition ngcdcsMRGSHM.hpp:99
ngcdcs_mrgshm_t()
Constructor.
Definition ngcdcsMRGSHM.hpp:105
int pid
Process ID.
Definition ngcdcsMRGSHM.hpp:75
int semId
Semaphore id.
Definition ngcdcsMRGSHM.hpp:69
char statusName[32]
Status string.
Definition ngcdcsMRGSHM.hpp:81
char expId[64]
Exposure id.
Definition ngcdcsMRGSHM.hpp:72
double tsize
Transferred size (bytes)
Definition ngcdcsMRGSHM.hpp:93
ngcdcs_mrgevt_t evt[ngcdcsMRGSHM_MAXCON]
Event connections.
Definition ngcdcsMRGSHM.hpp:102
int status
Status.
Definition ngcdcsMRGSHM.hpp:78
int val
Definition ngcb.h:65