summaryrefslogtreecommitdiffstats
path: root/fitsy/sshare.C
diff options
context:
space:
mode:
Diffstat (limited to 'fitsy/sshare.C')
-rw-r--r--fitsy/sshare.C149
1 files changed, 149 insertions, 0 deletions
diff --git a/fitsy/sshare.C b/fitsy/sshare.C
new file mode 100644
index 0000000..f2b94d9
--- /dev/null
+++ b/fitsy/sshare.C
@@ -0,0 +1,149 @@
+// Copyright (C) 1999-2018
+// Smithsonian Astrophysical Observatory, Cambridge, MA, USA
+// For conditions of distribution and use, see copyright notice in "copyright"
+
+#include "sshare.h"
+#include "util.h"
+
+#if (HAVE_SYS_SHM_H && !__WIN32)
+#include <sys/types.h>
+#include <sys/shm.h>
+#include <sys/ipc.h>
+
+FitsSShareID::FitsSShareID(int hdrid, int shmid, const char* filter)
+{
+ // reset
+ valid_ =0;
+
+ {
+ // find size
+ struct shmid_ds info;
+ if (shmctl(hdrid, IPC_STAT, &info)) {
+ internalError("Fitsy++ sshare shctl failed");
+ return;
+ }
+ hmapsize_ = info.shm_segsz;
+
+ // Attach the memory segment
+ if ((long)(hmapdata_ = (char*)shmat(hdrid, 0, SHM_RDONLY)) == -1) {
+ internalError("Fitsy++ sshare shmat failed");
+ return;
+ }
+ }
+
+ {
+ parse(filter);
+ if (!valid_)
+ return;
+
+ // reset
+ valid_ =0;
+
+ // find size
+ struct shmid_ds info;
+ if (shmctl(shmid, IPC_STAT, &info)) {
+ internalError("Fitsy++ sshare shctl failed");
+ return;
+ }
+ mapsize_ = info.shm_segsz;
+
+ // Attach the memory segment
+ if ((long)(mapdata_ = (char*)shmat(shmid, 0, SHM_RDONLY)) == -1) {
+ internalError("Fitsy++ sshare shmat failed");
+ return;
+ }
+ }
+
+ // so far so good
+ valid_ = 1;
+}
+
+FitsSShareID::~FitsSShareID()
+{
+ shmdt(mapdata_);
+}
+
+FitsSShareKey::FitsSShareKey(int hdr, int key, const char* filter)
+{
+ // reset
+ valid_ =0;
+
+ {
+ // get shmid
+ int shmid;
+ if ((shmid = shmget(hdr, 0, 0)) < 0) {
+ internalError("Fitsy++ sshare shmget failed");
+ return;
+ }
+
+ // find size
+ struct shmid_ds info;
+ if (shmctl(shmid, IPC_STAT, &info)) {
+ internalError("Fitsy++ sshare shctl failed");
+ return;
+ }
+ mapsize_ = info.shm_segsz;
+
+ // Attach the memory segment
+ if ((long)(mapdata_ = (char*)shmat(shmid, 0, SHM_RDONLY)) == -1) {
+ internalError("Fitsy++ sshare shmat failed");
+ return;
+ }
+ }
+
+ {
+ parse(filter);
+ if (!valid_)
+ return;
+
+ // reset
+ valid_ =0;
+
+ // get shmid
+ int shmid;
+ if ((shmid = shmget(key, 0, 0)) < 0) {
+ internalError("Fitsy++ sshare shmget failed");
+ return;
+ }
+
+ // find size
+ struct shmid_ds info;
+ if (shmctl(shmid, IPC_STAT, &info)) {
+ internalError("Fitsy++ sshare shmctl failed");
+ return;
+ }
+ mapsize_ = info.shm_segsz;
+
+ // Attach the memory segment
+ if ((long)(mapdata_ = (char*)shmat(shmid, 0, SHM_RDONLY)) == -1) {
+ internalError("Fitsy++ sshare shmat failed");
+ return;
+ }
+ }
+
+ // so far so good
+ valid_ = 1;
+}
+
+FitsSShareKey::~FitsSShareKey()
+{
+ shmdt(mapdata_);
+}
+
+#else
+
+FitsSShareID::FitsSShareID(int hdrid, int shmid, const char* filter)
+{
+ valid_ = 0;
+}
+
+FitsSShareID::~FitsSShareID() {}
+
+FitsSShareKey::FitsSShareKey(int hdr, int key, const char* filter)
+{
+ valid_ = 0;
+}
+
+FitsSShareKey::~FitsSShareKey() {}
+
+#endif