Re: [XFree86] XShmSegmentInfo issues

2003-12-05 Thread Mark Vojkovich
On Thu, 4 Dec 2003, Callum Prentice wrote:

 I think you've misinterpreted this.  Aside from corruption of
  the ximage data structure, the only time BadValue is returned
  is if your source rectangle passed to XShmPutImage lies outside
  of the XImage (or if you pass junk for the send_event).  Check
  your dimensions passed to XShmPutImage.
 
 that's odd then - if a rearrange my code so i call create 1 then write 1 then create 
 2 then
 write 2 it works perfectly.
 
 if i call create 1 create 2 write 1 write 2 it fails with the X error i mentioned.
 
 (where 'create' does all the shm stuff and creation of the ximage and 'write' does 
 the
 'XShmPutImage'
 
 so i don't need to save/restone any of the XShmSegmentInfo then ?


Looking through the code, it looks like Xlib stores a pointer
to the shminfo.  I didn't realize it did that.  That would imply
that each XImage needs a XShmSegmentInfo that sticks around for the
life of the XImage.

It impresses me that it is a mistake that it did this rather
than copying the contents of the XShmSegmentInfo.  I'm not sure
why it was implemented that way.   I don't think we have any
XShm man pages.  If we did, hopefully, they would mention something
like that.

The error must be that the first XImage ends up with the second 
XImage's data and subsequently the operation appears to be addressing
outside of the shared memory segment, so the BadValue error happens.

Mark.

___
XFree86 mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/xfree86


Re: [XFree86] XShmSegmentInfo issues

2003-12-05 Thread Callum Prentice
that's the conclusion i came to late last night too.

now, for each of my XImage helper class instances, i declare a XShmSegmentInfo* in the 
ctor
and point it to a new'd buffer so it hangs until the class dtor gets rid of it as my 
app is
ending.

seems to work okay for now.

 Looking through the code, it looks like Xlib stores a pointer
 to the shminfo.  I didn't realize it did that.  That would imply
 that each XImage needs a XShmSegmentInfo that sticks around for the
 life of the XImage.
 
 It impresses me that it is a mistake that it did this rather
 than copying the contents of the XShmSegmentInfo.  I'm not sure
 why it was implemented that way.   I don't think we have any
 XShm man pages.  If we did, hopefully, they would mention something
 like that.
 
 The error must be that the first XImage ends up with the second 
 XImage's data and subsequently the operation appears to be addressing
 outside of the shared memory segment, so the BadValue error happens.
___
XFree86 mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/xfree86


Re: [XFree86] XShmSegmentInfo issues

2003-12-04 Thread Mark Vojkovich
On Thu, 4 Dec 2003, Callum Prentice wrote:

 i have a methods in a class to create a shared memory x image - it creates and 
 stores an
 xImage in the usual way:
 
 XShmSegmentInfo shminfo;
 ximage = XShmCreateImage(..., shminfo);
 shminfo.shmid = shmget (.., ximage-height * ximage-bytes_per_line, ...);
 shminfo.shmaddr = ximage-data = shmat(shminfo.shmid, 0, 0);
 shminfo.readOnly = False;
 XShmAttach (display, shminfo);
 
 i call this method in several places and only call XShmPutImage on the xImage later 
 in my
 code.
 
 i get an X error: 
 
 X Error of failed request:  BadValue (integer parameter out of range for operation)
   Major opcode of failed request:  144 (MIT-SHM)
   Minor opcode of failed request:  3 (X_ShmPutImage)
 
 which appears to be because the shared segment info has changed.

   I think you've misinterpreted this.  Aside from corruption of
the ximage data structure, the only time BadValue is returned
is if your source rectangle passed to XShmPutImage lies outside
of the XImage (or if you pass junk for the send_event).  Check
your dimensions passed to XShmPutImage.


 
 if i save the shminfo each time and then re-attach it to the display before i call
 XShmPutImage, i still get the problem.
 
 any ideas ?  what is the right thing to do here.
 
 also - in the code i'm using there is a call to:
 
 shmctl ( shmInfo.shmid, IPC_RMID, NULL ); 
 
 just after it's created - surely this is wrong and i shouldn't remeove the sgm 
 segment until
 my program is finishing.


   Segments don't disappear until after they are removed and the last
process attaching to them has detached.  Even if you remove it, it
will not go away until after you detach.  When your program quits
or crashes, it detaches automatically.  However, it does not get
removed automatically, so if the app quits or crashes before removing
the segment, the segment will get leaked.  That's why it's common
practice to attach and then remove a segment.


Mark.

___
XFree86 mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/xfree86


Re: [XFree86] XShmSegmentInfo issues

2003-12-04 Thread Callum Prentice
I think you've misinterpreted this.  Aside from corruption of
 the ximage data structure, the only time BadValue is returned
 is if your source rectangle passed to XShmPutImage lies outside
 of the XImage (or if you pass junk for the send_event).  Check
 your dimensions passed to XShmPutImage.

that's odd then - if a rearrange my code so i call create 1 then write 1 then create 2 
then
write 2 it works perfectly.

if i call create 1 create 2 write 1 write 2 it fails with the X error i mentioned.

(where 'create' does all the shm stuff and creation of the ximage and 'write' does the
'XShmPutImage'

so i don't need to save/restone any of the XShmSegmentInfo then ?


Segments don't disappear until after they are removed and the last
 process attaching to them has detached.  Even if you remove it, it
 will not go away until after you detach.  When your program quits
 or crashes, it detaches automatically.  However, it does not get
 removed automatically, so if the app quits or crashes before removing
 the segment, the segment will get leaked.  That's why it's common
 practice to attach and then remove a segment.

thanks for that clarification - excellent.
___
XFree86 mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/xfree86