0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 #ifndef SYS_SYSVQ_H__
0038 #define SYS_SYSVQ_H__
0039
0040
0041 #include <pthread.h>
0042 #include <unistd.h>
0043 #include <sys/ipc.h>
0044 #include <sys/signal.h>
0045 #include <time.h>
0046 #include <sys_primitives.h>
0047 #include <atmi.h>
0048 #include <nstopwatch.h>
0049 #include <nstd_shm.h>
0050
0051
0052
0053
0054 #define NDRX_SVQ_EV_NONE 0
0055 #define NDRX_SVQ_EV_TOUT 1
0056 #define NDRX_SVQ_EV_DATA 2
0057 #define NDRX_SVQ_EV_FD 3
0058
0059 #define NDRX_SVQ_SIG SIGUSR2
0060
0061
0062 #define NDRX_SVQ_MAP_ISUSED NDRX_LH_FLAG_ISUSED
0063
0064 #define NDRX_SVQ_MAP_WASUSED NDRX_LH_FLAG_WASUSED
0065 #define NDRX_SVQ_MAP_EXPIRED 0x0004
0066 #define NDRX_SVQ_MAP_SCHEDRM 0x0008
0067 #define NDRX_SVQ_MAP_RQADDR 0x0010
0068 #define NDRX_SVQ_MAP_HAVESVC 0x0020
0069
0070
0071 #define NDRX_SVQ_MONF_SYNCFD 0x00000001
0072
0073
0074 #define NDRX_SVQ_INDEX(MEM, IDX) ((ndrx_svq_map_t*)(((char*)MEM)+(int)(sizeof(ndrx_svq_map_t)*IDX)))
0075 #define NDRX_SVQ_STATIDX(MEM, IDX) ((ndrx_svq_status_t*)(((char*)MEM)+(int)(sizeof(ndrx_svq_status_t)*IDX)))
0076
0077
0078 #define NDRX_SVQ_TOUT_MATCH(X, Y) (X->stamp_seq == Y->stamp_seq && \
0079 0==memcmp( &(X->stamp_time), &(Y->stamp_time), \
0080 sizeof(X->stamp_time)))
0081
0082 #define NDRX_SVQ_MON_TOUT 1
0083 #define NDRX_SVQ_MON_ADDFD 2
0084 #define NDRX_SVQ_MON_RMFD 3
0085 #define NDRX_SVQ_MON_TERM 4
0086
0087
0088
0089
0090 #define NDRX_SVQ_INLEN(X) (X-sizeof(long))
0091 #define NDRX_SVQ_OUTLEN(X) (X+sizeof(long))
0092
0093
0094
0095
0096
0097
0098
0099 typedef struct ndrx_svq_map ndrx_svq_map_t;
0100 struct ndrx_svq_map
0101 {
0102 char qstr[NDRX_MAX_Q_SIZE+1];
0103 int qid;
0104 short flags;
0105
0106 ndrx_stopwatch_t ctime;
0107 #ifdef EX_ALIGNMENT_FORCE
0108 long padding1;
0109 #endif
0110 };
0111
0112
0113
0114
0115
0116 typedef struct
0117 {
0118 int qid;
0119 short flags;
0120 char qstr[NDRX_MAX_Q_SIZE+1];
0121 ndrx_stopwatch_t ctime;
0122 } ndrx_svq_status_t;
0123
0124
0125
0126
0127 struct mq_attr
0128 {
0129 long mq_flags;
0130 long mq_maxmsg;
0131 long mq_msgsize;
0132 long mq_curmsgs;
0133 };
0134
0135 typedef struct ndrx_svq_ev ndrx_svq_ev_t;
0136
0137
0138
0139 struct ndrx_svq_ev
0140 {
0141 int ev;
0142
0143 ndrx_stopwatch_t stamp_time;
0144 unsigned long stamp_seq;
0145
0146 int fd;
0147 uint32_t revents;
0148
0149 size_t datalen;
0150 char *data;
0151
0152 ndrx_svq_ev_t *next, *prev;
0153 };
0154
0155
0156
0157
0158 struct ndrx_svq_info
0159 {
0160 char qstr[NDRX_MAX_Q_SIZE+1];
0161 int qid;
0162
0163 mode_t mode;
0164 struct mq_attr attr;
0165
0166 #ifdef EX_USE_SYSVQ
0167
0168
0169
0170
0171 NDRX_SPIN_LOCKDECL (rcvlock);
0172 NDRX_SPIN_LOCKDECL (rcvlockb4);
0173 ndrx_svq_ev_t *eventq;
0174 pthread_mutex_t barrier;
0175 pthread_mutex_t qlock;
0176
0177
0178
0179
0180
0181
0182 NDRX_SPIN_LOCKDECL (stamplock);
0183 ndrx_stopwatch_t stamp_time;
0184 volatile unsigned long stamp_seq;
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194 pthread_t thread;
0195 #endif
0196
0197 char *self;
0198 EX_hash_handle hh;
0199
0200 };
0201 typedef struct ndrx_svq_info * mqd_t;
0202
0203
0204
0205
0206
0207 typedef struct
0208 {
0209 int cmd;
0210 struct timespec abs_timeout;
0211 int flags;
0212
0213
0214 ndrx_stopwatch_t stamp_time;
0215 unsigned long stamp_seq;
0216
0217 int fd;
0218 uint32_t events;
0219 mqd_t mqd;
0220
0221
0222 pthread_mutex_t *del_lock;
0223 pthread_cond_t *del_cond;
0224
0225 } ndrx_svq_mon_cmd_t;
0226
0227
0228
0229
0230
0231 extern NDRX_API int ndrx_svq_close(mqd_t mqd);
0232 extern NDRX_API int ndrx_svq_getattr(mqd_t, struct mq_attr * attr);
0233 extern NDRX_API int ndrx_svq_notify(mqd_t, const struct sigevent *);
0234 extern NDRX_API mqd_t ndrx_svq_open(const char *pathname, int oflag, mode_t mode,
0235 struct mq_attr *attr);
0236 extern NDRX_API ssize_t ndrx_svq_receive(mqd_t, char *, size_t, unsigned int *);
0237 extern NDRX_API int ndrx_svq_send(mqd_t, const char *, size_t, unsigned int);
0238 extern NDRX_API int ndrx_svq_setattr(mqd_t, const struct mq_attr *attr, struct mq_attr *oattr);
0239 extern NDRX_API int ndrx_svq_unlink(const char *name);
0240
0241 extern NDRX_API int ndrx_svq_timedsend(mqd_t mqd, const char *ptr, size_t len, unsigned int prio,
0242 const struct timespec *__abs_timeout);
0243
0244 extern NDRX_API ssize_t ndrx_svq_timedreceive(mqd_t mqd, char *ptr, size_t maxlen, unsigned int *priop,
0245 const struct timespec * __abs_timeout);
0246
0247 extern NDRX_API void ndrx_svq_set_lock_timeout(int secs);
0248 extern NDRX_API int ndrx_svq_mqd_put_event(mqd_t mqd, ndrx_svq_ev_t **ev);
0249 extern NDRX_API void ndrx_svq_delref_add(mqd_t qd);
0250 extern NDRX_API int ndrx_svq_event_sndrcv(mqd_t mqd, char *ptr, ssize_t *maxlen,
0251 struct timespec *abs_timeout, ndrx_svq_ev_t **ev, int is_send, int syncfd);
0252 extern NDRX_API void ndrx_svq_event_exit(int detatch);
0253
0254 extern NDRX_API void ndrx_svq_fork_prepare(void);
0255 extern NDRX_API void ndrx_svqadmin_fork_prepare(void);
0256
0257
0258
0259
0260
0261
0262 extern NDRX_API int ndrx_svq_fd_nrof(void);
0263 extern NDRX_API void ndrx_svq_mqd_hash_del(mqd_t mqd);
0264 extern NDRX_API int ndrx_svq_mqd_close(mqd_t mqd);
0265 extern NDRX_API int ndrx_svq_mqd_hash_add(mqd_t mqd, ndrx_stopwatch_t *stamp_time,
0266 unsigned long stamp_seq, struct timespec *abs_timeout);
0267
0268
0269
0270 extern NDRX_API int ndrx_svq_moncmd_term(void);
0271
0272 extern NDRX_API int ndrx_svq_moncmd_addfd(mqd_t mqd, int fdm, uint32_t events);
0273 extern NDRX_API int ndrx_svq_moncmd_rmfd(int fd);
0274 extern NDRX_API mqd_t ndrx_svq_mainq_get(void);
0275
0276 extern NDRX_API int ndrx_svq_event_init(void);
0277 extern NDRX_API int ndrx_svq_scanunit_set(int ms);
0278
0279
0280 extern NDRX_API int ndrx_svqshm_init(int attach_only);
0281 extern NDRX_API int ndrx_svqshm_attach(void);
0282 extern NDRX_API int ndrx_svqshm_down(int force);
0283 extern NDRX_API void ndrx_svqshm_detach(void);
0284 extern NDRX_API int ndrx_svqshm_shmres_get(ndrx_shm_t **map_p2s, ndrx_shm_t **map_s2p,
0285 ndrx_sem_t **map_sem, int *queuesmax);
0286 extern NDRX_API int ndrx_svqshm_get(char *qstr, mode_t mode, int oflag);
0287 extern NDRX_API int ndrx_svqshm_get_qid(int in_qid, char *out_qstr, int out_qstr_len);
0288 extern NDRX_API int ndrx_svqshm_ctl(char *qstr, int qid, int cmd, int arg1,
0289 int (*p_deletecb)(int qid, char *qstr));
0290
0291 extern NDRX_API ndrx_svq_status_t* ndrx_svqshm_statusget(int *len, int ttl);
0292
0293 extern NDRX_API string_list_t* ndrx_sys_mqueue_list_make_svq(char *qpath, int *return_status);
0294
0295 extern NDRX_API int ndrx_svqshm_get_status(ndrx_svq_status_t *status,
0296 int qid, int *pos, int *have_value);
0297
0298 extern NDRX_API int ndrx_svqadmin_init(mqd_t adminq);
0299 extern NDRX_API int ndrx_svqadmin_deinit(void);
0300
0301 #endif
0302
0303