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 SHM_NAME_MAX
00032 #define SHM_NAME_MAX NAME_MAX
00033 #endif
00034 typedef char shm_name_t[SHM_NAME_MAX];
00035 typedef shm_name_t jack_shm_id_t;
00036
00037 #elif WIN32 // steph TO CHECK
00038 #define NAME_MAX 255
00039 #ifndef SHM_NAME_MAX
00040 #define SHM_NAME_MAX NAME_MAX
00041 #endif
00042 typedef char shm_name_t[SHM_NAME_MAX];
00043 typedef shm_name_t jack_shm_id_t;
00044
00045 #else
00046
00047 typedef int jack_shm_id_t;
00048 #endif
00049
00050
00051 typedef enum {
00052 shm_POSIX = 1,
00053 shm_SYSV = 2,
00054 shm_WIN32 = 3
00055 } jack_shmtype_t;
00056
00057 typedef int16_t jack_shm_registry_index_t;
00058
00068 typedef struct _jack_shm_server {
00069 #ifdef WIN32
00070 int pid;
00071 #else
00072
00073 pid_t pid;
00074 #endif
00075
00076 char name[JACK_SERVER_NAME_SIZE];
00077 }
00078 jack_shm_server_t;
00079
00080 typedef struct _jack_shm_header {
00081 uint32_t magic;
00082 uint16_t protocol;
00083 jack_shmtype_t type;
00084 jack_shmsize_t size;
00085 jack_shmsize_t hdr_len;
00086 jack_shmsize_t entry_len;
00087 jack_shm_server_t server[MAX_SERVERS];
00088 }
00089 jack_shm_header_t;
00090
00091 typedef struct _jack_shm_registry {
00092 jack_shm_registry_index_t index;
00093
00094 #ifdef WIN32
00095
00096 int allocator;
00097 #else
00098
00099 pid_t allocator;
00100 #endif
00101
00102 jack_shmsize_t size;
00103 jack_shm_id_t id;
00104 }
00105 jack_shm_registry_t;
00106
00107 #define JACK_SHM_REGISTRY_SIZE (sizeof (jack_shm_header_t) \
00108 + sizeof (jack_shm_registry_t) * MAX_SHM_ID)
00109
00117 typedef struct _jack_shm_info {
00118 jack_shm_registry_index_t index;
00119 size_t size;
00120 void *attached_at;
00121 }
00122 jack_shm_info_t;
00123
00124
00125
00126 void jack_shm_copy_from_registry (jack_shm_info_t*,
00127 jack_shm_registry_index_t);
00128 void jack_shm_copy_to_registry (jack_shm_info_t*,
00129 jack_shm_registry_index_t*);
00130 void jack_release_shm_info (jack_shm_registry_index_t);
00131 char* jack_shm_addr (jack_shm_info_t* si);
00132
00133
00134 int jack_register_server (const char *server_name, int new_registry);
00135 void jack_unregister_server (const char *server_name);
00136
00137 int jack_initialize_shm (const char *server_name);
00138 int jack_initialize_shm_server (void);
00139 int jack_initialize_shm_client (void);
00140 int jack_cleanup_shm (void);
00141
00142 int jack_shmalloc (const char *shm_name, jack_shmsize_t size,
00143 jack_shm_info_t* result);
00144 void jack_release_shm (jack_shm_info_t*);
00145 void jack_destroy_shm (jack_shm_info_t*);
00146 int jack_attach_shm (jack_shm_info_t*);
00147 int jack_attach_shm_read (jack_shm_info_t*);
00148 int jack_resize_shm (jack_shm_info_t*, jack_shmsize_t size);
00149
00150 #ifdef __cplusplus
00151 }
00152 #endif
00153
00154 #endif