Jack2 1.9.6
|
00001 #ifndef __jack_shm_h__ 00002 #define __jack_shm_h__ 00003 00004 #include <limits.h> 00005 #include <sys/types.h> 00006 #include "types.h" 00007 #include "JackCompilerDeps.h" 00008 00009 #define TRUE 1 00010 #define FALSE 0 00011 00012 #ifdef __cplusplus 00013 extern "C" 00014 { 00015 #endif 00016 00017 #define MAX_SERVERS 8 /* maximum concurrent servers */ 00018 #define MAX_SHM_ID 256 /* generally about 16 per server */ 00019 #define JACK_SERVER_NAME_SIZE 256 /* maximum length of server name */ 00020 #define JACK_SHM_MAGIC 0x4a41434b /* shm magic number: "JACK" */ 00021 #define JACK_SHM_NULL_INDEX -1 /* NULL SHM index */ 00022 #define JACK_SHM_REGISTRY_INDEX -2 /* pseudo SHM index for registry */ 00023 00024 00025 /* On Mac OS X, SHM_NAME_MAX is the maximum length of a shared memory 00026 * segment name (instead of NAME_MAX or PATH_MAX as defined by the 00027 * standard). 00028 */ 00029 #ifdef USE_POSIX_SHM 00030 00031 #ifndef NAME_MAX 00032 #define NAME_MAX 255 00033 #endif 00034 00035 #ifndef SHM_NAME_MAX 00036 #define SHM_NAME_MAX NAME_MAX 00037 #endif 00038 typedef char shm_name_t[SHM_NAME_MAX]; 00039 typedef shm_name_t jack_shm_id_t; 00040 00041 #elif WIN32 // TO CHECK 00042 #define NAME_MAX 255 00043 #ifndef SHM_NAME_MAX 00044 #define SHM_NAME_MAX NAME_MAX 00045 #endif 00046 typedef char shm_name_t[SHM_NAME_MAX]; 00047 typedef shm_name_t jack_shm_id_t; 00048 00049 #else 00050 /* System V SHM */ 00051 typedef int jack_shm_id_t; 00052 #endif /* SHM type */ 00053 00054 /* shared memory type */ 00055 typedef enum { 00056 shm_POSIX = 1, /* POSIX shared memory */ 00057 shm_SYSV = 2, /* System V shared memory */ 00058 shm_WIN32 = 3 /* Windows 32 shared memory */ 00059 } jack_shmtype_t; 00060 00061 typedef int16_t jack_shm_registry_index_t; 00062 00072 typedef struct _jack_shm_server { 00073 #ifdef WIN32 00074 int pid; /* process ID */ 00075 #else 00076 pid_t pid; /* process ID */ 00077 #endif 00078 00079 char name[JACK_SERVER_NAME_SIZE]; 00080 } 00081 jack_shm_server_t; 00082 00083 typedef struct _jack_shm_header { 00084 uint32_t magic; /* magic number */ 00085 uint16_t protocol; /* JACK protocol version */ 00086 jack_shmtype_t type; /* shm type */ 00087 jack_shmsize_t size; /* total registry segment size */ 00088 jack_shmsize_t hdr_len; /* size of header */ 00089 jack_shmsize_t entry_len; /* size of registry entry */ 00090 jack_shm_server_t server[MAX_SERVERS]; /* current server array */ 00091 } 00092 jack_shm_header_t; 00093 00094 typedef struct _jack_shm_registry { 00095 jack_shm_registry_index_t index; /* offset into the registry */ 00096 00097 #ifdef WIN32 00098 int allocator; /* PID that created shm segment */ 00099 #else 00100 pid_t allocator; /* PID that created shm segment */ 00101 #endif 00102 00103 jack_shmsize_t size; /* for POSIX unattach */ 00104 jack_shm_id_t id; /* API specific, see above */ 00105 } 00106 jack_shm_registry_t; 00107 00108 #define JACK_SHM_REGISTRY_SIZE (sizeof (jack_shm_header_t) \ 00109 + sizeof (jack_shm_registry_t) * MAX_SHM_ID) 00110 00119 typedef struct _jack_shm_info { 00120 jack_shm_registry_index_t index; /* offset into the registry */ 00121 uint32_t size; 00122 union { 00123 void *attached_at; /* address where attached */ 00124 char ptr_size[8]; 00125 } ptr; /* a "pointer" that has the same 8 bytes size when compling in 32 or 64 bits */ 00126 } 00127 POST_PACKED_STRUCTURE jack_shm_info_t; 00128 00129 /* utility functions used only within JACK */ 00130 00131 void jack_shm_copy_from_registry (jack_shm_info_t*, 00132 jack_shm_registry_index_t); 00133 void jack_shm_copy_to_registry (jack_shm_info_t*, 00134 jack_shm_registry_index_t*); 00135 int jack_release_shm_info (jack_shm_registry_index_t); 00136 char* jack_shm_addr (jack_shm_info_t* si); 00137 00138 // here begin the API 00139 int jack_register_server (const char *server_name, int new_registry); 00140 int jack_unregister_server (const char *server_name); 00141 00142 int jack_initialize_shm (const char *server_name); 00143 int jack_initialize_shm_server (void); 00144 int jack_initialize_shm_client (void); 00145 int jack_cleanup_shm (void); 00146 00147 int jack_shmalloc (const char *shm_name, jack_shmsize_t size, 00148 jack_shm_info_t* result); 00149 void jack_release_shm (jack_shm_info_t*); 00150 void jack_destroy_shm (jack_shm_info_t*); 00151 int jack_attach_shm (jack_shm_info_t*); 00152 int jack_attach_shm_read (jack_shm_info_t*); 00153 int jack_resize_shm (jack_shm_info_t*, jack_shmsize_t size); 00154 00155 #ifdef __cplusplus 00156 } 00157 #endif 00158 00159 #endif /* __jack_shm_h__ */