00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef __jack_shm_h__
00035 #define __jack_shm_h__
00036
00037 #include <limits.h>
00038 #include <sys/types.h>
00039 #include "types.h"
00040 #include "JackCompilerDeps.h"
00041 #include "JackConstants.h"
00042
00043 #define TRUE 1
00044 #define FALSE 0
00045
00046 #ifdef __cplusplus
00047 extern "C"
00048 {
00049 #endif
00050
00051 #define MAX_SERVERS 8
00052 #define MAX_SHM_ID 256
00053 #define JACK_SHM_MAGIC 0x4a41434b
00054 #define JACK_SHM_NULL_INDEX -1
00055 #define JACK_SHM_REGISTRY_INDEX -2
00056
00057
00058
00059
00060
00061
00062 #ifdef USE_POSIX_SHM
00063
00064 #ifndef NAME_MAX
00065 #define NAME_MAX 255
00066 #endif
00067
00068 #ifndef SHM_NAME_MAX
00069 #define SHM_NAME_MAX NAME_MAX
00070 #endif
00071 typedef char shm_name_t[SHM_NAME_MAX];
00072 typedef shm_name_t jack_shm_id_t;
00073
00074 #elif WIN32
00075 #define NAME_MAX 255
00076 #ifndef SHM_NAME_MAX
00077 #define SHM_NAME_MAX NAME_MAX
00078 #endif
00079 typedef char shm_name_t[SHM_NAME_MAX];
00080 typedef shm_name_t jack_shm_id_t;
00081
00082 #elif __ANDROID__
00083
00084 #ifndef NAME_MAX
00085 #define NAME_MAX 255
00086 #endif
00087
00088 #ifndef SHM_NAME_MAX
00089 #define SHM_NAME_MAX NAME_MAX
00090 #endif
00091 typedef char shm_name_t[SHM_NAME_MAX];
00092 typedef shm_name_t jack_shm_id_t;
00093 typedef int jack_shm_fd_t;
00094
00095 #else
00096
00097 typedef int jack_shm_id_t;
00098 #endif
00099
00100
00101 typedef enum {
00102 shm_POSIX = 1,
00103 shm_SYSV = 2,
00104 shm_WIN32 = 3,
00105 shm_ANDROID = 4
00106 } jack_shmtype_t;
00107
00108 typedef int16_t jack_shm_registry_index_t;
00109
00119 typedef struct _jack_shm_server {
00120 #ifdef WIN32
00121 int pid;
00122 #else
00123 pid_t pid;
00124 #endif
00125
00126 char name[JACK_SERVER_NAME_SIZE];
00127 }
00128 jack_shm_server_t;
00129
00130 typedef struct _jack_shm_header {
00131 uint32_t magic;
00132 uint16_t protocol;
00133 jack_shmtype_t type;
00134 jack_shmsize_t size;
00135 jack_shmsize_t hdr_len;
00136 jack_shmsize_t entry_len;
00137 jack_shm_server_t server[MAX_SERVERS];
00138 }
00139 jack_shm_header_t;
00140
00141 typedef struct _jack_shm_registry {
00142 jack_shm_registry_index_t index;
00143
00144 #ifdef WIN32
00145 int allocator;
00146 #else
00147 pid_t allocator;
00148 #endif
00149
00150 jack_shmsize_t size;
00151 jack_shm_id_t id;
00152 #ifdef __ANDROID__
00153 jack_shm_fd_t fd;
00154 #endif
00155 }
00156 jack_shm_registry_t;
00157
00158 #define JACK_SHM_REGISTRY_SIZE (sizeof (jack_shm_header_t) \
00159 + sizeof (jack_shm_registry_t) * MAX_SHM_ID)
00160
00169 PRE_PACKED_STRUCTURE
00170 struct _jack_shm_info {
00171 jack_shm_registry_index_t index;
00172 uint32_t size;
00173 #ifdef __ANDROID__
00174 jack_shm_fd_t fd;
00175 #endif
00176 union {
00177 void *attached_at;
00178 char ptr_size[8];
00179 } ptr;
00180 } POST_PACKED_STRUCTURE;
00181
00182 typedef struct _jack_shm_info jack_shm_info_t;
00183
00184
00185
00186 void jack_shm_copy_from_registry (jack_shm_info_t*,
00187 jack_shm_registry_index_t);
00188 void jack_shm_copy_to_registry (jack_shm_info_t*,
00189 jack_shm_registry_index_t*);
00190 int jack_release_shm_info (jack_shm_registry_index_t);
00191 char* jack_shm_addr (jack_shm_info_t* si);
00192
00193
00194 int jack_register_server (const char *server_name, int new_registry);
00195 int jack_unregister_server (const char *server_name);
00196
00197 int jack_initialize_shm (const char *server_name);
00198 int jack_initialize_shm_server (void);
00199 int jack_initialize_shm_client (void);
00200 int jack_cleanup_shm (void);
00201
00202 int jack_shmalloc (const char *shm_name, jack_shmsize_t size,
00203 jack_shm_info_t* result);
00204 void jack_release_shm (jack_shm_info_t*);
00205 void jack_release_lib_shm (jack_shm_info_t*);
00206 void jack_destroy_shm (jack_shm_info_t*);
00207 int jack_attach_shm (jack_shm_info_t*);
00208 int jack_attach_lib_shm (jack_shm_info_t*);
00209 int jack_attach_shm_read (jack_shm_info_t*);
00210 int jack_attach_lib_shm_read (jack_shm_info_t*);
00211 int jack_resize_shm (jack_shm_info_t*, jack_shmsize_t size);
00212
00213 #ifdef __cplusplus
00214 }
00215 #endif
00216
00217 #endif