Re: issue in copying the hash table(Reposted third time)
| From: | Kamesh Jayachandran | Date: | Thu, 08 Jul 2004 10:16:39 +0000 |
| Subject: | Re: issue in copying the hash table(Reposted third time) | ||
| References: | 1 2 3 4 5 6 7 8 9 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-10976@lists.php.net to get a copy of this message | ||
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"
<moriyoshi@at.wakwak.com> 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
>