File: Shm.h

package info (click to toggle)
jackd2 1.9.22~dfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,984 kB
  • sloc: cpp: 48,694; ansic: 23,970; python: 13,621; sh: 228; makefile: 31
file content (144 lines) | stat: -rw-r--r-- 5,647 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 Copyright (C) 2001-2003 Paul Davis
 Copyright (C) 2005-2012 Grame
 Copyright (C) 2013 Samsung Electronics
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
 the Free Software Foundation; either version 2.1 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

 */

#ifndef __jack_shm_android_h__
#define __jack_shm_android_h__

#include <limits.h>
#include <sys/types.h>
#include "types.h"
#include "JackCompilerDeps.h"
#include <binder/MemoryHeapBase.h>
#include <utils/RefBase.h>

#ifdef __cplusplus
extern "C"
{
#endif

#define JACK_SHM_REGISTRY_FD        -1
#define JACK_SHM_HEAP_ENOUGH_COUNT  300

void jack_instantiate();

#ifdef __cplusplus
}
#endif

namespace android {

    class IAndroidShm;

    class Shm {
        public:
            static Shm* Instantiate();
            virtual ~Shm();
        private:
            Shm();
            Shm( const Shm&);
            Shm& operator=(const Shm);

        private:
            void set_server_prefix (const char *server_name);
            int server_initialize_shm (int new_registry);
            int shm_lock_registry (void);
            void shm_unlock_registry (void);
            int access_registry (jack_shm_info_t *ri);
            void remove_shm (jack_shm_id_t *id);
            int create_registry (jack_shm_info_t *ri);
            int shm_validate_registry ();
            int GetUID();
            int GetPID();
            void shm_init_registry ();
            void release_shm_entry (jack_shm_registry_index_t index);
            jack_shm_registry_t * get_free_shm_info ();

        public:
            static void jack_shm_copy_from_registry (jack_shm_info_t*, jack_shm_registry_index_t);
            static void jack_shm_copy_to_registry (jack_shm_info_t*, jack_shm_registry_index_t*);
            static int jack_release_shm_info (jack_shm_registry_index_t);
            static char* jack_shm_addr (jack_shm_info_t* si);
            static int jack_register_server (const char *server_name, int new_registry);
            static int jack_unregister_server (const char *server_name);
            static int jack_initialize_shm (const char *server_name);
            static int jack_initialize_shm_server (void);
            static int jack_initialize_shm_client (void);
            static int jack_cleanup_shm (void);
            static int jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* result);
            static void jack_release_shm (jack_shm_info_t*);
            static void jack_release_lib_shm (jack_shm_info_t*);
            static void jack_destroy_shm (jack_shm_info_t*);
            static int jack_attach_shm (jack_shm_info_t*);
            static int jack_attach_lib_shm (jack_shm_info_t*);
            static int jack_attach_shm_read (jack_shm_info_t*);
            static int jack_attach_lib_shm_read (jack_shm_info_t*);
            static int jack_resize_shm (jack_shm_info_t*, jack_shmsize_t size);

        public:
            void shm_copy_from_registry (jack_shm_info_t*, jack_shm_registry_index_t);
            void shm_copy_to_registry (jack_shm_info_t*, jack_shm_registry_index_t*);
            int release_shm_info (jack_shm_registry_index_t);
            char* shm_addr (unsigned int fd);
            
            // here begin the API
            int register_server (const char *server_name, int new_registry);
            int unregister_server (const char *server_name);
            
            int initialize_shm (const char *server_name);
            int initialize_shm_server (void);
            int initialize_shm_client (void);
            int cleanup_shm (void);
            
            int shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* result);
            void release_shm (jack_shm_info_t*);
            void release_lib_shm (jack_shm_info_t*);
            void destroy_shm (jack_shm_info_t*);
            int attach_shm (jack_shm_info_t*);
            int attach_lib_shm (jack_shm_info_t*);
            int attach_shm_read (jack_shm_info_t*);
            int attach_lib_shm_read (jack_shm_info_t*);
            int resize_shm (jack_shm_info_t*, jack_shmsize_t size);

        private:
            static jack_shmtype_t jack_shmtype;
            static jack_shm_id_t   registry_id;
            static jack_shm_fd_t   registry_fd;
            static jack_shm_info_t registry_info;
            static jack_shm_header_t   *jack_shm_header;
            static jack_shm_registry_t *jack_shm_registry;
            static char jack_shm_server_prefix[JACK_SERVER_NAME_SIZE+1];
            static int semid;
            static pthread_mutex_t mutex;
            static Shm* ref;
            
            void jack_release_shm_entry (jack_shm_registry_index_t index);
            int jack_shm_lock_registry (void);
            void jack_shm_unlock_registry (void);
            
            //static  sp<IAndroidShm>  mShmService;
            static sp<IMemoryHeap> mShmMemBase[JACK_SHM_HEAP_ENOUGH_COUNT];

        public:
            static sp<IAndroidShm> getShmService();
    };
};

#endif /* __jack_shm_android_h__ */