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 // steph 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
00077 pid_t pid;
00078 #endif
00079
00080 char name[JACK_SERVER_NAME_SIZE];
00081 }
00082 jack_shm_server_t;
00083
00084 typedef struct _jack_shm_header {
00085 uint32_t magic;
00086 uint16_t protocol;
00087 jack_shmtype_t type;
00088 jack_shmsize_t size;
00089 jack_shmsize_t hdr_len;
00090 jack_shmsize_t entry_len;
00091 jack_shm_server_t server[MAX_SERVERS];
00092 }
00093 jack_shm_header_t;
00094
00095 typedef struct _jack_shm_registry {
00096 jack_shm_registry_index_t index;
00097
00098 #ifdef WIN32
00099
00100 int allocator;
00101 #else
00102
00103 pid_t allocator;
00104 #endif
00105
00106 jack_shmsize_t size;
00107 jack_shm_id_t id;
00108 }
00109 jack_shm_registry_t;
00110
00111 #define JACK_SHM_REGISTRY_SIZE (sizeof (jack_shm_header_t) \
00112 + sizeof (jack_shm_registry_t) * MAX_SHM_ID)
00113
00121 typedef struct _jack_shm_info {
00122 jack_shm_registry_index_t index;
00123 size_t size;
00124 void *attached_at;
00125 }
00126 jack_shm_info_t;
00127
00128
00129
00130 void jack_shm_copy_from_registry (jack_shm_info_t*,
00131 jack_shm_registry_index_t);
00132 void jack_shm_copy_to_registry (jack_shm_info_t*,
00133 jack_shm_registry_index_t*);
00134 void jack_release_shm_info (jack_shm_registry_index_t);
00135 char* jack_shm_addr (jack_shm_info_t* si);
00136
00137
00138 int jack_register_server (const char *server_name, int new_registry);
00139 void jack_unregister_server (const char *server_name);
00140
00141 int jack_initialize_shm (const char *server_name);
00142 int jack_initialize_shm_server (void);
00143 int jack_initialize_shm_client (void);
00144 int jack_cleanup_shm (void);
00145
00146 int jack_shmalloc (const char *shm_name, jack_shmsize_t size,
00147 jack_shm_info_t* result);
00148 void jack_release_shm (jack_shm_info_t*);
00149 void jack_destroy_shm (jack_shm_info_t*);
00150 int jack_attach_shm (jack_shm_info_t*);
00151 int jack_attach_shm_read (jack_shm_info_t*);
00152 int jack_resize_shm (jack_shm_info_t*, jack_shmsize_t size);
00153
00154 #ifdef __cplusplus
00155 }
00156 #endif
00157
00158 #endif