Hi Moriyoshi,
Sorry to copy the INIT_DATA macro in the mail.
#define INIT_DATA(ht, p, pData, nDataSize)
        if (nDataSize == sizeof(void*)) {
                memcpy(&(p)->pDataPtr, pData, sizeof(void *));
                (p)->pData = &(p)->pDataPtr;
        } else {
               (p)->pData = (void *) pemalloc_rel(nDataSize,
               (ht)->persistent);        
                if (!(p)->pData) {
                        pefree_rel(p, (ht)->persistent);
                        return FAILURE;                                                
                                         }                                             
                                                                  memcpy((p)->pData, 
pData, nDataSize);
                (p)->pDataPtr=NULL;                                                    
                                 }

In case of deep copy the global_class_table,
For each class entry in the hash table, We call the above macro
INIT_DATA which allocates nDataSize( in this case 292) bytes for
zend_class_entry. We copy the corressponding entry(INIT_DATA).

Since nDataSize is 292 we will be in the else block.
As you told there will be redundant memory of sizeof(zend_class_entry) -
sizeof(zend_class_entry *) This redundancy is fine atleast.
But the problem is in the NetWare port as I am not able copy the 292
bytes as the way with linux. The source address goes beyond my process
address space and I am getting segmentation fault.

What is the likelyhood of having similar seg fault in Linux?

With regards
Kamesh Jayachandran

On Thu, 8 Jul 2004 18:01:17 +0900, "Moriyoshi Koizumi"
<[EMAIL PROTECTED]> said:
> 
> On 2004/07/08, at 14:41, Kamesh Jayachandran wrote:
> 
> > The last parameter sizeof(zend_class_entry) of value say 292 to
> > zend_hash_copy indicate it to dereference the value of one of the
> > hashtable entry.
> > This value is of type zend_class_entry** which when dereferenced once
> > gives rise to zend_class_entry* the corresponding memcpy function 
> > copies
> > 292 bytes from this zend_class_entry * which is not correct.
> > For details look at INIT_DATA macro in zend_hash.c
> 
> This makes sense. So, your intention is just to make the line in 
> question
> to reduce unnecessary malloc()'s and memcpy()'s.
> 
> zend_hash_copy(compiler_globals->class_table, ... , 
> sizeof(zend_class_entry));
> 
> Although this can eventually work, the newly built hash table 
> CG(class_table)
> will hold the redundant space of sizeof(zend_class_entry) - 
> sizeof(zend_class_entry *) bytes
> per class entry.
> 
> And then you pointed out the above line should go like
> 
> zend_hash_copy(compiler_globals->class_table, ... , 
> sizeof(zend_class_entry *));
> 
> This appears a typo because the global function table, which is
> a hash table that contains instances of zend_function (not 
> zend_function *),
> is also copied by zend_hash_copy() with the last argument being 
> sizeof(zend_function).
> 
> zend_hash_copy(compiler_globals->function_table, ... , 
> sizeof(zend_function));
> 
> 
> ... Did I get it right?
> 
> Regards,
> Moriyoshi
> 

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to