| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 | 
							- /* Copyright (C) 2014 Stony Brook University
 
-    This file is part of Graphene Library OS.
 
-    Graphene Library OS is free software: you can redistribute it and/or
 
-    modify it under the terms of the GNU Lesser General Public License
 
-    as published by the Free Software Foundation, either version 3 of the
 
-    License, or (at your option) any later version.
 
-    Graphene Library OS is distributed in the hope that it will be useful,
 
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
-    GNU Lesser General Public License for more details.
 
-    You should have received a copy of the GNU Lesser General Public License
 
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
- /*
 
-  * shim_sysv.h
 
-  *
 
-  * This file includes functions and types for implementing System V IPC
 
-  * functionality.
 
-  */
 
- #ifndef __SHIM_SYSV_H__
 
- #define __SHIM_SYSV_H__
 
- #include <shim_handle.h>
 
- #include <shim_types.h>
 
- enum sysv_type { SYSV_NONE, SYSV_MSGQ, SYSV_SEM, SYSV_SHM };
 
- #define SYSV_TYPE_STR(type)       \
 
-     ((type) == SYSV_MSGQ ? "MSGQ" \
 
-                          : ((type) == SYSV_SEM ? "SEM" : ((type) == SYSV_SHM ? "SHM" : "")))
 
- #define VALID_SYSV_TYPE(type) ((type) == SYSV_MSGQ || (type) == SYSV_SEM || (type) == SYSV_SHM)
 
- struct sysv_score {
 
-     IDTYPE vmid;
 
-     unsigned long score;
 
- };
 
- struct sysv_client {
 
-     struct shim_ipc_port* port;
 
-     IDTYPE vmid;
 
-     unsigned seq;
 
- };
 
- struct shim_handle;
 
- struct sysv_balance_policy {
 
-     unsigned int score_decay;
 
-     unsigned int score_max;
 
-     unsigned int balance_threshold;
 
-     int (*migrate)(struct shim_handle* hdl, struct sysv_client* client);
 
- };
 
- int __balance_sysv_score(struct sysv_balance_policy* policy, struct shim_handle* hdl,
 
-                          struct sysv_score* scores, int nscores, struct sysv_client* src,
 
-                          long score);
 
- #define MSG_NOERROR 010000
 
- #include <list.h>
 
- struct __kernel_msgbuf {
 
-     long mtype;   /* type of message */
 
-     char mtext[]; /* message text */
 
- };
 
- #define MSG_QOBJ_SIZE 64
 
- struct msg_qobj {
 
-     void* next;
 
-     char data[MSG_QOBJ_SIZE - sizeof(void*)];
 
- } __attribute__((packed));
 
- struct msg_item {
 
-     void* next;
 
-     unsigned short size;
 
-     char data[];
 
- } __attribute__((packed));
 
- #define MSG_ITEM_DATA_SIZE(size)                               \
 
-     ((size) < MSG_QOBJ_SIZE - sizeof(struct msg_item) ? (size) \
 
-                                                       : MSG_QOBJ_SIZE - sizeof(struct msg_item))
 
- struct msg_ext_item {
 
-     void* next;
 
-     char data[];
 
- } __attribute__((packed));
 
- #define MSG_EXT_ITEM_DATA_SIZE(size)                      \
 
-     ((size) < MSG_QOBJ_SIZE - sizeof(struct msg_ext_item) \
 
-          ? (size)                                         \
 
-          : MSG_QOBJ_SIZE - sizeof(struct msg_ext_item))
 
- struct msg_req {
 
-     struct msg_req* next;
 
-     unsigned short size;
 
-     int flags;
 
-     struct sysv_client dest;
 
- };
 
- #define INIT_MSG_TYPE_SIZE 32
 
- struct msg_type {
 
-     long type; /* type of the messages */
 
-     struct msg_item* msgs;
 
-     struct msg_item* msg_tail;
 
-     struct msg_req* reqs;
 
-     struct msg_req* req_tail;
 
- };
 
- #define DEFAULT_MSG_QUEUE_SIZE 2048
 
- #define MSG_SND_SCORE         1
 
- #define MSG_RCV_SCORE         20
 
- #define MSG_SCORE_DECAY       10
 
- #define MSG_SCORE_MAX         200
 
- #define MSG_BALANCE_THRESHOLD 100
 
- struct msg_handle_backup {
 
-     int perm;        /* access permissions */
 
-     int nmsgs;       /* number of msgs */
 
-     int currentsize; /* current size in bytes */
 
- };
 
- struct msg_backup {
 
-     long type;
 
-     int size;
 
-     char data[];
 
- };
 
- struct shim_msg_handle;
 
- int add_msg_handle(unsigned long key, IDTYPE id, bool owned);
 
- int del_msg_handle(struct shim_msg_handle* msgq);
 
- struct shim_msg_handle* get_msg_handle_by_key(unsigned long key);
 
- struct shim_msg_handle* get_msg_handle_by_id(IDTYPE id);
 
- void put_msg_handle(struct shim_msg_handle* msgq);
 
- int recover_msg_ownership(struct shim_msg_handle* msgq);
 
- int add_sysv_msg(struct shim_msg_handle* msgq, long type, size_t size, const void* data,
 
-                  struct sysv_client* src);
 
- int get_sysv_msg(struct shim_msg_handle* msgq, long type, size_t size, void* data, int flags,
 
-                  struct sysv_client* src);
 
- int store_all_msg_persist(void);
 
- #define HOST_SEM_NUM 65535
 
- DEFINE_LIST(sem_ops);
 
- struct sem_ops {
 
-     LIST_TYPE(sem_ops) progress;
 
-     struct sem_stat {
 
-         bool completed;
 
-         bool failed;
 
-         int nops;
 
-         int current;
 
-         unsigned long timeout;
 
-     } stat;
 
-     struct sysv_client client;
 
-     struct sembuf ops[];
 
- };
 
- DEFINE_LISTP(sem_ops);
 
- struct sem_obj {
 
-     unsigned short num;
 
-     unsigned short val;
 
-     unsigned short zcnt;
 
-     unsigned short ncnt;
 
-     IDTYPE pid;
 
-     PAL_NUM host_sem_id;
 
-     PAL_HANDLE host_sem;
 
-     LISTP_TYPE(sem_ops) ops;
 
-     LISTP_TYPE(sem_ops) next_ops;
 
- };
 
- #define SEM_POSITIVE_SCORE(num) ((num) < 5 ? 5 - (num) : 1)
 
- #define SEM_ZERO_SCORE          20
 
- #define SEM_NEGATIVE_SCORE(num) (20 * (num))
 
- #define SEM_SCORE_DECAY         10
 
- #define SEM_SCORE_MAX           200
 
- #define SEM_BALANCE_THRESHOLD   100
 
- struct sem_backup {
 
-     unsigned short val;
 
-     unsigned short zcnt;
 
-     unsigned short ncnt;
 
-     IDTYPE pid;
 
- };
 
- struct sem_client_backup {
 
-     IDTYPE vmid;
 
-     unsigned long seq;
 
-     int current;
 
-     int nops;
 
- };
 
- int add_sem_handle(unsigned long key, IDTYPE id, int nsems, bool owned);
 
- struct shim_sem_handle* get_sem_handle_by_key(unsigned long key);
 
- struct shim_sem_handle* get_sem_handle_by_id(IDTYPE semid);
 
- void put_sem_handle(struct shim_sem_handle* sem);
 
- int del_sem_handle(struct shim_sem_handle* sem);
 
- int recover_sem_ownership(struct shim_sem_handle* sem, struct sem_backup* backups, int nbackups,
 
-                           struct sem_client_backup* clients, int nclients);
 
- int submit_sysv_sem(struct shim_sem_handle* sem, struct sembuf* sops, int nsops,
 
-                     unsigned long timeout, struct sysv_client* client);
 
- #ifdef USE_SHARED_SEMAPHORE
 
- int send_sem_host_ids(struct shim_sem_handle* sem, struct shim_ipc_port* port, IDTYPE dest,
 
-                       unsigned long seq);
 
- #endif
 
- #endif /* __SHIM_SYSV_H__ */
 
 
  |