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
00018 #define MAX_SHM_ID 256
00019 #define JACK_SERVER_NAME_SIZE 256
00020 #define JACK_SHM_MAGIC 0x4a41434b
00021 #define JACK_SHM_NULL_INDEX -1
00022 #define JACK_SHM_REGISTRY_INDEX -2
00023
00024
00025
00026
00027
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
00051 typedef int jack_shm_id_t;
00052 #endif
00053
00054
00055 typedef enum {
00056 shm_POSIX = 1,
00057 shm_SYSV = 2,
00058 shm_WIN32 = 3
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;
00075 #else
00076 pid_t pid;
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;
00085 uint16_t protocol;
00086 jack_shmtype_t type;
00087 jack_shmsize_t size;
00088 jack_shmsize_t hdr_len;
00089 jack_shmsize_t entry_len;
00090 jack_shm_server_t server[MAX_SERVERS];
00091 }
00092 jack_shm_header_t;
00093
00094 typedef struct _jack_shm_registry {
00095 jack_shm_registry_index_t index;
00096
00097 #ifdef WIN32
00098 int allocator;
00099 #else
00100 pid_t allocator;
00101 #endif
00102
00103 jack_shmsize_t size;
00104 jack_shm_id_t id;
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;
00121 uint32_t size;
00122 union {
00123 void *attached_at;
00124 char ptr_size[8];
00125 } ptr;
00126 }
00127 POST_PACKED_STRUCTURE jack_shm_info_t;
00128
00129
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
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