diff options
author | Dave Mitchell <davem@fdisolutions.com> | 2006-01-02 12:09:37 +0000 |
---|---|---|
committer | Dave Mitchell <davem@fdisolutions.com> | 2006-01-02 12:09:37 +0000 |
commit | a5063e7cd8fef802efd25ffe9df2c3748f4254f6 (patch) | |
tree | d64839134e7ea4472187ba4d6b88f6dcaea8b65f /ext/threads | |
parent | 7e35a1b7e6a7c6685061284278f26171e0070f33 (diff) | |
download | perl-a5063e7cd8fef802efd25ffe9df2c3748f4254f6.tar.gz |
add svt_local slot to magic vtable, and fix local $shared
p4raw-id: //depot/perl@26569
Diffstat (limited to 'ext/threads')
-rw-r--r-- | ext/threads/shared/shared.xs | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/ext/threads/shared/shared.xs b/ext/threads/shared/shared.xs index c902683f6a..18a752ca8b 100644 --- a/ext/threads/shared/shared.xs +++ b/ext/threads/shared/shared.xs @@ -196,6 +196,7 @@ MGVTBL sharedsv_shared_vtbl = { sharedsv_shared_mg_free, /* free */ 0, /* copy */ 0, /* dup */ + 0 /* local */ }; /* Access to shared things is heavily based on MAGIC - in mg.h/mg.c/sv.c sense */ @@ -376,7 +377,7 @@ Perl_sharedsv_associate(pTHX_ SV **psv, SV *ssv, shared_sv *data) } mg = sv_magicext(sv, Nullsv, PERL_MAGIC_shared_scalar, &sharedsv_scalar_vtbl, (char *)data, 0); - mg->mg_flags |= (MGf_COPY|MGf_DUP); + mg->mg_flags |= (MGf_COPY|MGf_DUP|MGf_LOCAL); SvREFCNT_inc(ssv); if(SvOBJECT(ssv)) { STRLEN len; @@ -605,6 +606,28 @@ sharedsv_scalar_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *param) return 0; } + +/* + * Called during local $shared + */ +int +sharedsv_scalar_mg_local(pTHX_ SV* nsv, MAGIC *mg) +{ + MAGIC *nmg; + shared_sv *shared = (shared_sv *) mg->mg_ptr; + if (shared) { + ENTER_LOCK; + SvREFCNT_inc(SHAREDSvPTR(shared)); + LEAVE_LOCK; + } + nmg = sv_magicext(nsv, mg->mg_obj, mg->mg_type, mg->mg_virtual, + mg->mg_ptr, mg->mg_len); + nmg->mg_flags = mg->mg_flags; + nmg->mg_private = mg->mg_private; + + return 0; +} + MGVTBL sharedsv_scalar_vtbl = { sharedsv_scalar_mg_get, /* get */ sharedsv_scalar_mg_set, /* set */ @@ -612,7 +635,8 @@ MGVTBL sharedsv_scalar_vtbl = { sharedsv_scalar_mg_clear, /* clear */ sharedsv_scalar_mg_free, /* free */ 0, /* copy */ - sharedsv_scalar_mg_dup /* dup */ + sharedsv_scalar_mg_dup, /* dup */ + sharedsv_scalar_mg_local /* local */ }; /* Now the arrays/hashes stuff */ @@ -753,7 +777,8 @@ MGVTBL sharedsv_elem_vtbl = { sharedsv_elem_mg_DELETE, /* clear */ sharedsv_elem_mg_free, /* free */ 0, /* copy */ - sharedsv_elem_mg_dup /* dup */ + sharedsv_elem_mg_dup, /* dup */ + 0 /* local */ }; U32 @@ -832,7 +857,8 @@ MGVTBL sharedsv_array_vtbl = { sharedsv_array_mg_CLEAR, /* clear */ sharedsv_array_mg_free, /* free */ sharedsv_array_mg_copy, /* copy */ - sharedsv_array_mg_dup /* dup */ + sharedsv_array_mg_dup, /* dup */ + 0 /* local */ }; =for apidoc sharedsv_unlock |