On tisdag, juli 30, 2002, at 03:24 , Elizabeth Mattijsen wrote: > > At 02:10 PM 7/30/02 +0100, Nicholas Clark wrote: >> > As I said, as a simple solution for now, I think a: >> > sub CLONE { undef( %PerlIO::gzip:: ) } >> > or equivalent of that in XS code would be sufficient to get around >> the >> > current problem of having to start your threads before you can open a >> > PerlIO::gzip layer... >> >> I believe that this won't work. Nor the direct XS equivalent. It will >> hide >> the problem: >> >> Once an IO layer is created, it is a free standing object attached to a >> stream. It doesn't matter if you "nuke" the module in the symbol >> table - >> you still have existing PerlIO structures pushed on existing streams >> that >> don't get killed this way. > > Then maybe it should become possible to indicate that a PerlIO > _structure_ should never be cloned? So it never gets to the part where > it attempt to clone it? > > >> And the PerlIO system defaults to doing a shallow structure copy (much >> like >> the default in C++ for copying objects) to make a copy of every layer >> for >> the new chain of layers in the layer stack. And to clone safely >> PerlIO::gzip >> needs to implement a deep copying constructor. And zlib doesn't provide >> one for inflate streams (I've checked - deflateCopy copies the >> internal state >> for deflation streams, and the internal state differs) > > So, we put in a flag that the PerlIO structure doesn't get cloned. > This would probably fix problems with other PerlIO:: modules... And > the flag could be set by the PerlIO:: module itself! > > So instead of trying to find a solution to the problem, try to prevent > the problem from ever happening... > > > (hope this made sense...) > > > Liz No, the correct approach is to clone perlio structures. Arthur