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