ngc 1.4.0
 
Loading...
Searching...
No Matches
ngcdcsMRGSHM.hpp
Go to the documentation of this file.
1
7#ifndef ngcdcsMRGSHM_H
8#define ngcdcsMRGSHM_H
9
10
11#ifndef __cplusplus
12#error This is a C++ include file and cannot be used from plain C
13#endif
14#include <stdio.h>
15#include <stdlib.h>
16#include <fcntl.h>
17#include <unistd.h>
18#include <errno.h>
19#include <sys/types.h>
20#include <sys/shm.h>
21#include <sys/sem.h>
22#include <sys/socket.h>
23
24#include <ngc/core/ngcb.h>
25#include <ngc/core/ngcbSocket.h>
26
27/*
28 * Merger states
29 */
30#define ngcdcsMSTAT_IDLE 0 //< idle
31#define ngcdcsMSTAT_PENDING 1 //< pending
32#define ngcdcsMSTAT_ACTIVE 2 //< active
33#define ngcdcsMSTAT_VERIFYING 4 //< verifying
34#define ngcdcsMSTAT_MERGING 8 //< merging
35#define ngcdcsMSTAT_INVALIDATING 16 //< invalidating
36#define ngcdcsMSTAT_COMPL_SUCCESS 128 //< successful completion
37#define ngcdcsMSTAT_COMPL_FAILURE 256 //< failure
38#define ngcdcsMSTAT_COMPL_ABORTED 512 //< merging has been aborted
39
43#define ngcdcsMERGE_ACTIVE(status) ((status > ngcdcsMSTAT_IDLE) && \
44 (status < ngcdcsMSTAT_COMPL_SUCCESS))
45
46
50#define ngcdcsMRGSHM_MAXCON 4
51
57 int port;
58
61};
62
68 int semId;
69
71 char expId[64];
72
74 int pid;
75
77 int status;
78
80 char statusName[32];
81
84
86 int abort;
87
89 double vsize;
90
92 double tsize;
93
95 char newDataFileName[256];
96
98 char msg[256];
99
102
105 semId = -1;
106 expId[0] = '\0';
107 pid = 0;
109 strcpy(statusName, "idle");
110 reserved1 = 0x0;
111 abort = 0;
112 vsize = 0.0;
113 tsize = 0.0;
114 newDataFileName[0] = '\0';
115 msg[0] = '\0';
116 }
117};
118
123{
124public:
126 ngcdcsMRGSHM(int id, int server, int creat = 1) {
127 char *evar;
128 int newShm = 0;
129 void *m;
130 int i;
131
132 /*
133 * Initialize member data
134 */
135 initialized_ = 0;
136 server_ = server;
137 strcpy(statStr_, "idle");
138 if (id < 0) id_ = 0;
139 else id_ = id;
140 erms_[0] = '\0';
141 msg_[0] = '\0';
142 shmId_ = -1;
143 shm_ = NULL;
144 semId_ = -1;
145 key_ = -1;
146 port_ = 0;
147 locked_ = 0;
148
149 /*
150 * Semaphore lock operation:
151 * - wait until value is zero
152 * - increment value by one (undo)
153 */
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;
158
159 /*
160 * Semaphore unlock operation:
161 * - check if value is one - if not return error
162 * - decrement value by one (undo)
163 */
164 memset(&semOpUnlock_[0], 0, sizeof(struct sembuf));
165 semOpUnlock_[0].sem_op = -1;
166 semOpUnlock_[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
167
168 /*
169 * Reset event connection file descriptors
170 */
171 for (i=0;i<ngcdcsMRGSHM_MAXCON;i++) evtSocket_[i] = -1;
172
173 /*
174 * Get this host name
175 */
176 evar = getenv("HOSTNAME");
177 if (evar != NULL) str2str(thisHost_, evar, sizeof(thisHost_) - 1);
178 else strcpy(thisHost_, "localhost");
179
180 /*
181 * Get IPC-key
182 */
183 evar = getenv("HOME");
184 if (evar != NULL) key_ = ftok(evar, ('n' + id_) & 0xff);
185 if (key_ == -1)
186 {
187 evar = getenv("INS_ROOT");
188 if (evar != NULL) key_ = ftok(evar, ('n' + id_) & 0xff);
189 }
190 if (key_ == -1)
191 {
192 evar = getenv("INTROOT");
193 if (evar != NULL) key_ = ftok(evar, ('n' + id_) & 0xff);
194 }
195 if (key_ == -1)
196 {
197 strcpy(ErrMsg(), "unable to retrieve IPC-key");
198 return;
199 }
200
201 /*
202 * Try to access the shared memory
203 */
204 shmId_ = shmget(key_, sizeof(ngcdcs_mrgshm_t), 0666);
205 if (shmId_ == -1)
206 {
207 if (creat)
208 {
209 int tmp;
210
211 if (errno == EINVAL)
212 {
213 /*
214 * The shared memory size may have changed. We remove the
215 * exising region and re-create.
216 */
217 shmId_ = shmget(key_, 0, 0666);
218 if (shmId_ == -1)
219 {
220 sprintf(ErrMsg(), "error creating shared memory - %s",
221 strerror(errno));
222 return;
223 }
224 else
225 {
226 /*
227 * Remove the shared memory
228 */
229 shmctl(shmId_, IPC_RMID, 0);
230 shmId_ = -1;
231 }
232 }
233
234 /*
235 * Ensure that the protection semaphore does not yet exist
236 */
237 tmp = semget(key_, 0, 0666);
238 if (tmp >= 0)
239 {
240 ngcbSEMIPC_CTL ctl;
241
242 /*
243 * Remove the semaphore
244 */
245 ctl.val = 0;
246 semctl(tmp, 0, IPC_RMID, ctl);
247 }
248
249 /*
250 * Create a new shared memory region
251 */
252 shmId_ = shmget(key_, sizeof(ngcdcs_mrgshm_t),
253 0666|IPC_CREAT|IPC_EXCL);
254 if (shmId_ == -1)
255 {
256 if (errno == EEXIST)
257 {
258 /*
259 * We may have had a race condition here. So we try once
260 * again to access it.
261 */
262 shmId_ = shmget(key_, sizeof(ngcdcs_mrgshm_t), 0666);
263 if (shmId_ == -1)
264 {
265 sprintf(ErrMsg(), "error creating shared memory - %s",
266 strerror(errno));
267 return;
268 }
269 }
270 else
271 {
272 sprintf(ErrMsg(), "error creating shared memory - %s",
273 strerror(errno));
274 return;
275 }
276 }
277 else
278 {
279 /*
280 * We actually are the creator
281 */
282 newShm = 1;
283 }
284 }
285 else
286 {
287 /*
288 * Resources are not available and we have no permission
289 * to create them
290 */
291 strcpy(ErrMsg(), "resources not available");
292 return;
293 }
294 }
295
296 /*
297 * Attach to the shared memory
298 */
299 m = shmat(shmId_, 0, 0);
300 if (m == (void *)-1)
301 {
302 sprintf(ErrMsg(), "error attaching to shared memory - %s",
303 strerror(errno));
304 if (newShm)
305 {
306 /*
307 * Delete the shared memory again
308 */
309 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
310 }
311 return;
312 }
313 else
314 {
315 shm_ = static_cast<ngcdcs_mrgshm_t *>(m);
316 }
317
318 if (newShm)
319 {
320 ngcbSEMIPC_CTL ctl;
321 ngcdcs_mrgshm_t initStat;
322
323 /*
324 * Initialize the shared memory. This will explicitly mark
325 * the protection semaphore as invalid.
326 */
327 memcpy(shm_, &initStat, sizeof(ngcdcs_mrgshm_t));
328 if (server_)
329 {
330 shm_->pid = getpid();
331 shm_->abort = 0;
332 }
333
334 /*
335 * Create protection semaphore
336 */
337 semId_ = semget(key_, 1, 0666|IPC_CREAT|IPC_EXCL);
338 if (semId_ == -1)
339 {
340 sprintf(ErrMsg(), "error creating semaphore - %s",
341 strerror(errno));
342
343 /*
344 * Delete the shared memory
345 */
346 shmdt(shm_); shm_ = NULL;
347 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
348 return;
349 }
350
351 /*
352 * Initialize the semaphore
353 */
354 ctl.val = 0;
355 if (semctl(semId_, 0, SETVAL, ctl) == -1)
356 {
357 sprintf(ErrMsg(), "semaphore error - %s", strerror(errno));
358
359 /*
360 * Delete the semaphore again
361 */
362 SemRemove_();
363
364 /*
365 * Delete the shared memory
366 */
367 shmdt(shm_); shm_ = NULL;
368 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
369 return;
370 }
371
372 /*
373 * Assign the semaphore
374 */
375 if (Lock_() != ngcbSUCCESS)
376 {
377 /*
378 * Delete the semaphore again
379 */
380 SemRemove_();
381
382 /*
383 * Delete the shared memory
384 */
385 shmdt(shm_); shm_ = NULL;
386 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
387 return;
388 }
389 shm_->semId = semId_;
390 Unlock_();
391 }
392 else
393 {
394 for (i=0;i<3;i++)
395 {
396 /*
397 * Get semaphore
398 */
399 semId_ = semget(key_, 0, 0666);
400 if (semId_ == -1)
401 {
402 sprintf(ErrMsg(), "semaphore error - %s", strerror(errno));
403 sleep(1); continue;
404 }
405
406 /*
407 * Verify semaphore - we cannot lock here due to a race condition
408 * with the creators semctl. This should not matter because we
409 * only continue when the semaphore ids match (i.e. any faulty
410 * read would be equal to "not yet created") and only a non-faulty
411 * matching read indicates that the semaphore is both created and
412 * initialized.
413 */
414 if (semId_ != shm_->semId)
415 {
416 strcpy(ErrMsg(), "semaphore mismatch");
417 semId_ = -1;
418 sleep(1); continue;
419 }
420 else
421 {
422 /*
423 * We have a valid semaphore
424 */
425 break;
426 }
427 }
428
429 if (semId_ < 0)
430 {
431 /*
432 * We could not access the shared resources
433 */
434 shmdt(shm_); shm_ = NULL;
435 return;
436 }
437
438 if (server_)
439 {
440 /*
441 * Now we can lock
442 */
443 if (Lock_() != ngcbSUCCESS)
444 {
445 shmdt(shm_); shm_ = NULL;
446 return;
447 }
448
449 /*
450 * Set process id and reset abort-flag
451 */
452 shm_->pid = getpid();
453 shm_->abort = 0;
454
455 Unlock_();
456 }
457 }
458
459 initialized_ = 1;
460 }
461
463 virtual ~ngcdcsMRGSHM(){
464 if ((shmId_ != -1) && (shm_ != NULL))
465 {
466 int i;
467
468 if (server_)
469 {
470 /*
471 * Reset abort-flag and process id
472 */
473 if (Lock_() == ngcbSUCCESS)
474 {
475 shm_->pid = 0;
476 shm_->abort = 0;
477 Unlock_();
478 }
479
480 /*
481 * Broadcast exit event
482 */
483 BroadcastEvt(0);
484
485 /*
486 * Shutdown event connections
487 */
488 for (i=0;i<ngcdcsMRGSHM_MAXCON;i++)
489 {
490 if (evtSocket_[i] >= 0)
491 {
492 shutdown(evtSocket_[i], SHUT_WR);
493 ngcbTcpClose(evtSocket_[i]);
494 evtSocket_[i] = -1;
495 }
496 }
497 }
498
499 if (port_ > 0)
500 {
501 /*
502 * Invalidate port
503 */
504 if (Lock_() == ngcbSUCCESS)
505 {
506 for (i=0;i<ngcdcsMRGSHM_MAXCON;i++)
507 {
508 if (shm_->evt[i].port == port_) shm_->evt[i].port = 0;
509 }
510 Unlock_();
511 }
512 }
513
514 /*
515 * Detach from shared memory
516 */
517 shmdt(shm_); shm_ = NULL;
518 }
519 }
520
522 int Initialized() {return (initialized_);}
523
525 char *ErrMsg() {return (erms_);}
526
528 int Id() {return (id_);}
529
531 key_t Key() {return (key_);}
532
534 void Pid(int pid) {
535 if (!Initialized()) return;
536 else if (Lock_() == ngcbSUCCESS)
537 {
538 shm_->pid = pid;
539 Unlock_();
540 }
541 }
542
544 int Pid() {
545 int pid = 0;
546
547 if (Initialized())
548 {
549 if (Lock_() == ngcbSUCCESS)
550 {
551 pid = shm_->pid;
552 Unlock_();
553 }
554 }
555
556 return (pid);
557 }
558
560 void Status(int status) {
561 if (!Initialized()) return;
562 else if (Lock_() == ngcbSUCCESS)
563 {
564 shm_->status = status;
565 Stat2Str(status, shm_->statusName);
566 Unlock_();
567 BroadcastEvt(1);
568 }
569 }
570
572 int Status() {
573 int s = ngcdcsMSTAT_IDLE;
574
575 if (Initialized())
576 {
577 if (Lock_() == ngcbSUCCESS)
578 {
579 s = shm_->status;
580 Unlock_();
581 }
582 }
583
584 return (s);
585 }
586
588 const char *StatusName() {
589 if (Initialized())
590 {
591 if (Lock_() == ngcbSUCCESS)
592 {
593 strcpy(statStr_, shm_->statusName);
594 Unlock_();
595 }
596 }
597 return (statStr_);
598 }
599
601 void Msg(const char *msg) {
602 if (!Initialized() || (msg == NULL)) return;
603 else if (Lock_() == ngcbSUCCESS)
604 {
605 strcpy(shm_->msg, msg);
606 Unlock_();
607 }
608 }
609
611 const char *Msg() {
612 msg_[0] = '\0';
613 if (Initialized())
614 {
615 if (Lock_() == ngcbSUCCESS)
616 {
617 strcpy(msg_, shm_->msg);
618 Unlock_();
619 }
620 }
621 return (msg_);
622 }
623
625 void FileEvent(const char *id, const char *name) {
626 if (!Initialized() || (name == NULL)) return;
627 else if (Lock_() == ngcbSUCCESS)
628 {
629 str2str(shm_->expId, id, sizeof(shm_->expId) - 1);
630 strcpy(shm_->newDataFileName, name);
631 Unlock_();
632 BroadcastEvt(2);
633 }
634 }
635
637 const char *FileEvent() {
638 msg_[0] = '\0';
639 if (Initialized())
640 {
641 if (Lock_() == ngcbSUCCESS)
642 {
643 strcpy(msg_, shm_->newDataFileName);
644 Unlock_();
645 }
646 }
647 return (msg_);
648 }
649
651 void Abort() {
652 if (!Initialized()) return;
653 else if (Lock_() == ngcbSUCCESS)
654 {
655 shm_->abort = 1;
656 Unlock_();
657 }
658 }
659
661 int Aborted() {
662 int flag = 0;
663 if (Initialized())
664 {
665 if (Lock_() == ngcbSUCCESS)
666 {
667 flag = shm_->abort;
668 Unlock_();
669 }
670 }
671 return (flag);
672 }
673
675 void VSize(double s) {
676 if (!Initialized()) return;
677 else if (Lock_() == ngcbSUCCESS)
678 {
679 shm_->vsize = s;
680 Unlock_();
681 BroadcastEvt(3);
682 }
683 }
684
686 double VSize() {
687 double s = 0.0;
688
689 if (Initialized())
690 {
691 if (Lock_() == ngcbSUCCESS)
692 {
693 s = shm_->vsize;
694 Unlock_();
695 }
696 }
697
698 return (s);
699 }
700
702 void TSize(double s) {
703 if (!Initialized()) return;
704 else if (Lock_() == ngcbSUCCESS)
705 {
706 shm_->tsize = s;
707 Unlock_();
708 BroadcastEvt(4);
709 }
710 }
711
713 double TSize() {
714 double s = 0.0;
715
716 if (Initialized())
717 {
718 if (Lock_() == ngcbSUCCESS)
719 {
720 s = shm_->tsize;
721 Unlock_();
722 }
723 }
724
725 return (s);
726 }
727
729 int AttachEvt(int port) {
730 int i;
731
732 if (!Initialized())
733 {
734 strcpy(ErrMsg(), "shared memory interface not initialized");
735 return (-1);
736 }
737
738 /*
739 * Search free event connection
740 */
741 if (Lock_() != ngcbSUCCESS)
742 {
743 return (-1);
744 }
745 for (i=0;i<ngcdcsMRGSHM_MAXCON;i++)
746 {
747 if (shm_->evt[i].port <= 0)
748 {
749 if (evtSocket_[i] >= 0)
750 {
751 ngcbTcpClose(evtSocket_[i]); evtSocket_[i] = -1;
752 }
753
754 /*
755 * Set port number
756 */
757 shm_->evt[i].port = port;
758 break;
759 }
760 }
761 Unlock_();
762
763 if (i == ngcdcsMRGSHM_MAXCON)
764 {
765 /*
766 * No free connection
767 */
768 strcpy(ErrMsg(), "no free event connection");
769 return (-1);
770 }
771
772 port_ = port;
773 return (0);
774 }
775
776 // Open event
777 int OpenEvt() {
778 int srvPort = 0;
779 int srvSocket;
780
781 /*
782 * Open a server socket - let the system choose a free port
783 */
784 srvSocket = ngcbTcpService(NULL, ErrMsg());
785 if (srvSocket < 0)
786 {
787 return (-1);;
788 }
789
790 /*
791 * Get actual port number
792 */
793 srvPort = ngcbSocketPort(srvSocket);
794 if (srvPort <= 0)
795 {
796 sprintf(ErrMsg(), "unable to resolve server port number");
797 ngcbTcpClose(srvSocket);
798 return (-1);
799 }
800
801 /*
802 * Register port number
803 */
804 if (AttachEvt(srvPort) < 0)
805 {
806 ngcbTcpClose(srvSocket);
807 return (-1);
808 }
809
810 return (srvSocket);
811 }
812
814 void BroadcastEvt(int evt = 0) {
815 if (Initialized() && server_)
816 {
817 int i;
818 char msg[512];
819 int msgLen;
820
821 msg[0] = '\0';
822
823 if (Lock_() != ngcbSUCCESS)
824 {
825 return;
826 }
827
828 /*
829 * Check if we have to establish a new event connection
830 */
831 for (i=0;i<ngcdcsMRGSHM_MAXCON;i++)
832 {
833 if ((shm_->evt[i].port <= 0) && (evtSocket_[i] >= 0))
834 {
835 ngcbTcpClose(evtSocket_[i]); evtSocket_[i] = -1;
836 }
837 if ((shm_->evt[i].port > 0) && (evtSocket_[i] < 0))
838 {
839 int sock;
840 char srv[256];
841 char erms[256];
842
843 /*
844 * Open connection
845 */
846 sprintf(srv, "%s,%d", thisHost_, shm_->evt[i].port);
847 sock = ngcbTcpConnect(srv, erms);
848 if (sock < 0) shm_->evt[i].port = 0;
849 else evtSocket_[i] = sock;
850 }
851 }
852
853 /*
854 * Compose event message
855 */
856 if (evt == 0)
857 {
858 /*
859 * Exit event
860 */
861 sprintf(msg, "!mrgexit: %d\n", id_ + 1);
862 }
863 else if (evt == 1)
864 {
865 /*
866 * Status event
867 */
868 sprintf(msg, "!mrgstat: %d %d %s\n", id_ + 1, shm_->status,
869 shm_->statusName);
870 }
871 else if (evt == 2)
872 {
873 /*
874 * File event
875 */
876 sprintf(msg, "!mrgfile: %d %s %s\n", id_ + 1, shm_->expId,
877 shm_->newDataFileName);
878 }
879 else if (evt == 3)
880 {
881 /*
882 * Size event (expected after verification)
883 */
884 sprintf(msg, "!mrgvx: %d %.0f\n", id_ + 1, shm_->vsize);
885 }
886 else if (evt == 4)
887 {
888 /*
889 * Size event (current)
890 */
891 sprintf(msg, "!mrgtx: %d %.0f\n", id_ + 1, shm_->tsize);
892 }
893 else
894 {
895 /*
896 * Unknown event - we do not broadcast this
897 */
898 Unlock_();
899 return;
900 }
901
902 Unlock_();
903
904 msgLen = (int)strlen(msg);
905 if (msgLen > 0)
906 {
907 /*
908 * Now send the event message to all established connections
909 */
910 for (i=0;i<ngcdcsMRGSHM_MAXCON;i++)
911 {
912 if (evtSocket_[i] >= 0)
913 {
914 char erms[256];
915 if (ngcbTcpWrite(evtSocket_[i], &msgLen, sizeof(int), erms) != 0)
916 {
917 /*
918 * Shutdown event connection
919 */
920 ngcbTcpClose(evtSocket_[i]); evtSocket_[i] = -1;
921 }
922 else if (ngcbTcpWrite(evtSocket_[i], msg, msgLen, erms) != 0)
923 {
924 /*
925 * Shutdown event connection
926 */
927 ngcbTcpClose(evtSocket_[i]); evtSocket_[i] = -1;
928 }
929 }
930 }
931 }
932 }
933 }
934
936 void Stat2Str(int stat, char *s) {
937 /*
938 * Convert status to string
939 */
940 switch (stat)
941 {
942 case ngcdcsMSTAT_IDLE:
943 strcpy(s, "idle");
944 break;
946 strcpy(s, "active");
947 break;
949 strcpy(s, "verifying");
950 break;
952 strcpy(s, "merging");
953 break;
955 strcpy(s, "invalidating");
956 break;
958 strcpy(s, "success");
959 break;
961 strcpy(s, "aborted");
962 break;
964 strcpy(s, "failure");
965 break;
966 default:
967 strcpy(s, "unknown");
968 break;
969 }
970 }
971
973 void Remove() {
974 /*
975 * Remove semaphore
976 */
977 SemRemove_();
978
979 if ((shmId_ != -1) && (shm_ != NULL))
980 {
981 /*
982 * Delete the shared memory
983 */
984 shmdt(shm_); shm_ = NULL;
985 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
986 }
987
988 /*
989 * Interface can no longer be used
990 */
991 initialized_ = 0;
992 }
993
994protected:
995
996private:
998 int initialized_;
999
1001 key_t key_;
1002
1004 char thisHost_[64];
1005
1007 char erms_[256];
1008
1010 int shmId_;
1011
1013 ngcdcs_mrgshm_t *shm_;
1014
1016 int semId_;
1017
1019 struct sembuf semOpLock_[2];
1020
1022 struct sembuf semOpUnlock_[1];
1023
1025 int evtSocket_[ngcdcsMRGSHM_MAXCON];
1026
1028 int server_;
1029
1031 int id_;
1032
1034 char msg_[512];
1035
1037 char statStr_[32];
1038
1040 int port_;
1041
1043 int locked_;
1044
1046 int Lock_() {
1047 if (locked_)
1048 {
1049 return (ngcbSUCCESS);
1050 }
1051 else if (semId_ >= 0)
1052 {
1053 if (semop(semId_, semOpLock_, 2) != 0)
1054 {
1055 if (errno == EINTR)
1056 {
1057 while (semop(semId_, semOpLock_, 2) != 0)
1058 {
1059 if (errno != EINTR)
1060 {
1061 sprintf(ErrMsg(), "cannot lock semaphore - %s", strerror(errno));
1062 if (errno == EIDRM)
1063 {
1064 /*
1065 * Semaphore has been removed...
1066 */
1067 semId_ = -1;
1068 initialized_ = 0;
1069 }
1070 return (ngcbFAILURE);
1071 }
1072 }
1073 }
1074 else
1075 {
1076 sprintf(ErrMsg(), "cannot lock semaphore - %s", strerror(errno));
1077 if (errno == EIDRM)
1078 {
1079 /*
1080 * Semaphore has been removed...
1081 */
1082 semId_ = -1;
1083 initialized_ = 0;
1084 }
1085 return (ngcbFAILURE);
1086 }
1087 }
1088
1089 locked_ = 1;
1090 return (ngcbSUCCESS);
1091 }
1092 else
1093 {
1094 strcpy(ErrMsg(), "invalid semaphore");
1095 return (ngcbFAILURE);
1096 }
1097 }
1098
1100 void Unlock_() {
1101 if (locked_ && (semId_ >= 0))
1102 {
1103 if (semop(semId_, semOpUnlock_, 1) == 0)
1104 {
1105 locked_ = 0;
1106 }
1107 else
1108 {
1109 if (errno == EIDRM)
1110 {
1111 /*
1112 * Semaphore has been removed...
1113 */
1114 locked_ = 0;
1115 semId_ = -1;
1116 initialized_ = 0;
1117 }
1118 }
1119 }
1120 }
1121
1123 void SemRemove_() {
1124 if (semId_ >= 0)
1125 {
1126 ngcbSEMIPC_CTL ctl;
1127 ctl.val = 0;
1128 semctl(semId_, 0, IPC_RMID, ctl);
1129 semId_ = -1;
1130 }
1131 }
1132
1133};
1134
1135#endif
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
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
Definition ngcb.h:63
int val
Definition ngcb.h:64