@@ -62,6 +62,170 @@ typedef struct _zend_mm_debug_info {
6262
6363BEGIN_EXTERN_C ()
6464
65+ #ifdef  USE_LIBGC 
66+ 
67+ #if  defined(ZEND_DEBUG ) &&  !defined(GC_DEBUG )
68+ # define  GC_DEBUG 
69+ #endif 
70+ #ifdef  GC_H 
71+ # error  gc/gh.h included before zend_alloc.h
72+ #endif 
73+ #include  <gc/gc.h> 
74+ #include  <gc/gc_backptr.h> 
75+ 
76+ typedef  struct  _zend_mm_heap  zend_mm_heap ;
77+ 
78+ ZEND_API  void *  ZEND_FASTCALL  _emalloc (size_t  size  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC );
79+ ZEND_API  void  ZEND_FASTCALL  _efree (void  * ptr  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC );
80+ ZEND_API  void *  ZEND_FASTCALL  _safe_emalloc (size_t  nmemb , size_t  size , size_t  offset  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC );
81+ ZEND_API  void *  ZEND_FASTCALL  _ecalloc (size_t  nmemb , size_t  size  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC );
82+ ZEND_API  void *  ZEND_FASTCALL  _safe_erealloc (void  * ptr , size_t  nmemb , size_t  size , size_t  offset  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC );
83+ ZEND_API  char  * _estrdup (const  char  * s  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC );
84+ ZEND_API  char *  _estrndup (const  char  * s , size_t  len  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC );
85+ ZEND_API  void *  ZEND_FASTCALL  _safe_emalloc_atomic (size_t  nmemb , size_t  size , size_t  offset  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC );
86+ 
87+ ZEND_API  char *  ZEND_FASTCALL  zend_strndup (const  char  * s , size_t  length );
88+ 
89+ ZEND_API  zend_result  zend_set_memory_limit (size_t  memory_limit );
90+ ZEND_API  size_t  zend_memory_usage (bool  real_usage );
91+ ZEND_API  size_t  zend_memory_peak_usage (bool  real_usage );
92+ 
93+ ZEND_API  size_t  zend_mm_gc (zend_mm_heap  * heap );
94+ ZEND_API  zend_mm_heap  * zend_mm_get_heap (void );
95+ ZEND_API  zend_mm_heap  * zend_mm_set_heap (zend_mm_heap  * new_heap );
96+ 
97+ ZEND_API  void  shutdown_memory_manager (bool  silent , bool  full_shutdown );
98+ ZEND_API  void  init_memory_manager (void );
99+ ZEND_API  void  start_memory_manager (void );
100+ 
101+ ZEND_API  bool  is_zend_ptr (const  void  * ptr );
102+ 
103+ #define  is_zend_mm () false
104+ #define  zend_memory_reset_peak_usage () do { } while (0)
105+ #define  zend_alloc_in_memory_limit_error_reporting () false
106+ #define  refresh_memory_manager () do { } while (0)
107+ 
108+ #define  emalloc (size )                       GC_MALLOC(size)
109+ #define  emalloc_large (size )                 GC_MALLOC(size)
110+ #define  emalloc_huge (size )                  GC_MALLOC(size)
111+ #define  safe_emalloc (nmemb , size , offset )   _safe_emalloc(nmemb, size, offset ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
112+ #define  efree (ptr )                          ((void)(ptr))
113+ #define  efree_large (ptr )                    ((void)(ptr))
114+ #define  efree_huge (ptr )                     ((void)(ptr))
115+ #define  ecalloc (nmemb , size )                _ecalloc(nmemb, size ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
116+ #define  erealloc (ptr , size )                 GC_REALLOC(ptr, size)
117+ #define  erealloc2 (ptr , size , copy_size )     GC_REALLOC(ptr, size)
118+ #define  safe_erealloc (ptr , nmemb , size , offset ) _safe_erealloc(ptr, nmemb, size, offset ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
119+ #define  erealloc_recoverable (ptr , size )     GC_REALLOC(ptr, size)
120+ #define  erealloc2_recoverable (ptr , size , copy_size ) GC_REALLOC(ptr, size)
121+ #define  estrdup (s )                          _estrdup(s ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
122+ #define  estrndup (s , length )                 _estrndup(s, length ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
123+ #define  emalloc_atomic (size )                GC_MALLOC_ATOMIC(size)
124+ #define  safe_emalloc_atomic (nmemb , size , offset ) _safe_emalloc_atomic(nmemb, size, offset ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
125+ 
126+ #define  emalloc_rel (size )                       emalloc(size)
127+ #define  safe_emalloc_rel (nmemb , size , offset )   safe_emalloc(nmemb, size, offset)
128+ #define  efree_rel (ptr )                          efree(ptr)
129+ #define  ecalloc_rel (nmemb , size )                ecalloc(nmemb, size)
130+ #define  erealloc_rel (ptr , size )                 erealloc(ptr, size)
131+ #define  erealloc2_rel (ptr , size , copy_size )     erealloc2(ptr, size, copy_size)
132+ #define  erealloc_recoverable_rel (ptr , size )     erealloc_recoverable(ptr, size)
133+ #define  erealloc2_recoverable_rel (ptr , size , copy_size ) erealloc2_recoverable(ptr, size, copy_size)
134+ #define  safe_erealloc_rel (ptr , nmemb , size , offset ) safe_erealloc(ptr, nmemb, size, offset)
135+ #define  estrdup_rel (s )                          estrdup(s)
136+ #define  estrndup_rel (s , length )                 estrndup(s, length)
137+ 
138+ #define  efree_size (ptr , size )
139+ #define  efree_size_rel (ptr , size )
140+ 
141+ #define  pemalloc (size , persistent )                      emalloc(size)
142+ #define  safe_pemalloc (nmemb , size , offset , persistent )  safe_emalloc(nmemb, size, offset)
143+ #define  pefree (ptr , persistent )                         efree(ptr)
144+ #define  pefree_size (ptr , size , persistent )              efree_size(ptr, size)
145+ #define  pecalloc (nmemb , size , persistent )               ecalloc(nmemb, size)
146+ #define  perealloc (ptr , size , persistent )                erealloc(ptr, size)
147+ #define  perealloc2 (ptr , size , copy_size , persistent )    erealloc2(ptr, size, copy_size)
148+ #define  safe_perealloc (ptr , nmemb , size , offset , persistent ) safe_erealloc(ptr, nmemb, size, offset)
149+ #define  perealloc_recoverable (ptr , size , persistent )    erealloc_recoverable(ptr, size)
150+ #define  perealloc2_recoverable (ptr , size , persistent )   erealloc2_recoverable(ptr, size)
151+ #define  pestrdup (s , persistent )                         estrdup(s)
152+ #define  pestrndup (s , length , persistent )                estrndup(s, length)
153+ #define  pemalloc_atomic (size , persistent )               emalloc_atomic(size)
154+ #define  safe_pemalloc_atomic (nmemb , size , offset , persistent ) safe_emalloc_atomic(nmemb, size, offset)
155+ 
156+ #define  pemalloc_rel (size , persistent )                      pemalloc(size, persistent)
157+ #define  pefree_rel (ptr , persistent )                         pefree(ptr, persistent)
158+ #define  pecalloc_rel (nmemb , size , persistent )               pecalloc(nmemb, size, persistent)
159+ #define  perealloc_rel (ptr , size , persistent )                perealloc(ptr, size, persistent)
160+ #define  perealloc2_rel (ptr , size , copy_size , persistent )    perealloc2(ptr, size, copy_size, persistent)
161+ #define  perealloc_recoverable_rel (ptr , size , persistent )    perealloc_recoverable(ptr, size, persistent)
162+ #define  perealloc2_recoverable_rel (ptr , size , copy_size , persistent ) perealloc2_recoverable(ptr, size, copy_size, persistent)
163+ #define  pestrdup_rel (s , persistent )                         pestrdup(s, persistent)
164+ 
165+ /* fast cache for HashTables */ 
166+ #define  ALLOC_HASHTABLE (ht )	\
167+ 	(ht) = (HashTable *) emalloc(sizeof(HashTable))
168+ 
169+ #define  FREE_HASHTABLE (ht )	\
170+ 	efree_size(ht, sizeof(HashTable))
171+ 
172+ #define  ALLOC_HASHTABLE_REL (ht )	\
173+ 	(ht) = (HashTable *) emalloc_rel(sizeof(HashTable))
174+ 
175+ #define  FREE_HASHTABLE_REL (ht )	\
176+ 	efree_size_rel(ht, sizeof(HashTable))
177+ 
178+ // TODO: should fix call site instead 
179+ #define  malloc (size )        emalloc(size)
180+ #define  free (size )          efree(size)
181+ #define  realloc (ptr , size )  erealloc(ptr, size)
182+ #define  calloc (nmemb , size ) ecalloc(nmemb, size)
183+ #define  strdup (s )           estrdup(s)
184+ #define  strndup (s )          estrndup(s)
185+ 
186+ /* Hide ptr from libgc */ 
187+ #define  MASK_PTR (ptr ) ((uintptr_t)(ptr) | (1ULL<<63))
188+ #define  UNMASK_PTR (ptr ) ((uintptr_t)(ptr) & ~(1ULL<<63))
189+ 
190+ #include  "zend_alloc_sizes.h" 
191+ 
192+ /* _emalloc() & _efree() specialization */ 
193+ # if  !ZEND_DEBUG 
194+ #  define  _ZEND_BIN_ALLOCATOR_DEF (_num , _size , _elements , _pages , x , y ) \
195+ 	ZEND_API ZEND_ATTRIBUTE_MALLOC void* ZEND_FASTCALL _emalloc_  ## _size(void);
196+ 
197+ ZEND_MM_BINS_INFO (_ZEND_BIN_ALLOCATOR_DEF , x , y )
198+ 
199+ #  define  _ZEND_BIN_DEALLOCATOR_DEF (_num , _size , _elements , _pages , x , y ) \
200+ 	ZEND_API void ZEND_FASTCALL _efree_ ## _size(void *);
201+ 
202+ ZEND_MM_BINS_INFO (_ZEND_BIN_DEALLOCATOR_DEF , x , y )
203+ # endif 
204+ 
205+ ZEND_API  bool  zend_mm_is_custom_heap (zend_mm_heap  * new_heap );
206+ ZEND_API  void  zend_mm_set_custom_handlers (zend_mm_heap  * heap ,
207+                                           void *   (* _malloc )(size_t  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ),
208+                                           void    (* _free )(void *  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ),
209+                                           void *   (* _realloc )(void * , size_t  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ));
210+ ZEND_API  void  zend_mm_set_custom_handlers_ex (zend_mm_heap  * heap ,
211+ 	                                         void *   (* _malloc )(size_t  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ),
212+ 		                                     void    (* _free )(void *  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ),
213+ 			                                 void *   (* _realloc )(void * , size_t  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ),
214+ 				                             size_t  (* _gc )(void ),
215+ 					                         void    (* _shutdown )(bool , bool ));
216+ ZEND_API  void  zend_mm_get_custom_handlers (zend_mm_heap  * heap ,
217+                                           void *   (* * _malloc )(size_t  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ),
218+                                           void    (* * _free )(void *  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ),
219+                                           void *   (* * _realloc )(void * , size_t  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ));
220+ ZEND_API  void  zend_mm_get_custom_handlers_ex (zend_mm_heap  * heap ,
221+                                           void *   (* * _malloc )(size_t  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ),
222+                                           void    (* * _free )(void *  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ),
223+                                           void *   (* * _realloc )(void * , size_t  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ),
224+                                           size_t  (* * _gc )(void ),
225+                                           void    (* * _shutdown )(bool , bool ));
226+ 
227+ #else  /* USE_LIBGC */ 
228+ 
65229ZEND_API  ZEND_ATTRIBUTE_MALLOC  char *   ZEND_FASTCALL  zend_strndup (const  char  * s , size_t  length );
66230
67231ZEND_API  ZEND_ATTRIBUTE_MALLOC  void *   ZEND_FASTCALL  _emalloc (size_t  size  ZEND_FILE_LINE_DC  ZEND_FILE_LINE_ORIG_DC ) ZEND_ATTRIBUTE_ALLOC_SIZE (1 );
@@ -408,6 +572,8 @@ static void apc_init_heap(void)
408572size_t  zend_mm_globals_size (void );
409573#endif 
410574
575+ #endif  /* LIBGC */ 
576+ 
411577END_EXTERN_C ()
412578
413579#endif 
0 commit comments