On 19/06/2013 23:39, Yaakov (Cygwin/X) wrote:
> There appears to be a bug in the MIT-SHM extension with the 64-bit
> xserver; both XWin and Xvfb have manifested this so far. The easiest way to
> trigger this is to install gnome-themes-standard, add
> gtk-theme-name="Adwaita" to your ~/.gtkrc-2.0, then start a GTK+2 program
> (e.g. gtk-demo), but GTK+3 programs also show this. Starting the server
> with -extension MIT-SHM, or using a 32-bit server even with MIT-SHM, works
> fine.

On 06/07/2013 15:28, Jon TURNEY wrote:
> On 06/07/2013 12:46, Ken Brown wrote:
>> On 64bit Cygwin, if I try to run emacs under X11 while cygserver is running,
>> emacs fails to connect to the X server.  The error message from the X server 
>> is
>>
>>   BadShmSeg (invalid shared segment parameter) on protocol request 131
>>
>> To reproduce:
>>
>> 1. Install the current version of emacs-X11 (24.3-4).
>>
>> 2. Start the (64bit) cygserver service.
>>
>> 3. Start the (64bit) X server, e.g., by typing "startxwin" in a Cygwin 
>> Terminal.
>>
>> 4. In the resulting xterm, try to start emacs:
>>
>>   $ emacs-X11.exe -Q &
>>
>> The result is that emacs displays the error message above and then aborts.
>>
>> emacs-X11 works fine if the X server is started when cygserver is not 
>> running.
> 
> Yup, there's some kind of bug which affects SHM use by the X server on 64bit.
> I am looking into it.
> 
> You can also work around this by starting the X server with '-extension 
> MIT-SHM'

After going around in circles on this a few times, this is what I now think I
know:

The proximate cause of this error is that the x86_64 libcairo2 package appears
to be built with IPC_RMID_DEFERRED_RELEASE defined, which should only happen
on systems which allow processes to shmat() to a shared memory segment which
has already been marked for deletion with shmctl(IPC_RMID) (A non-portable
Linux behaviour)

(This behaviour can be turned on in cygwin by setting the
'kern.ipc.shm_allow_removed' to 'yes' in /etc/cygserver.conf, so that is also
a work around)

Attached is the configure test extracted from cairo, which for some reason
functions incorrectly on x86_64.

> $ uname -a
> CYGWIN_NT-5.1 byron 1.7.20(0.266/5/3) 2013-06-07 11:11 i686 Cygwin
> 
> $ ./shmtest ; echo $?
> 1

> $ uname -a
> CYGWIN_NT-6.1 allegra 1.7.21(0.267/5/3) 2013-07-15 13:50 x86_64 Cygwin
> 
> $ ./shmtest ; echo $?
> 0


#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int main()
{
  char *shmaddr;
  char *shmaddr2;

  int id = shmget (IPC_PRIVATE, 4, IPC_CREAT | 0600);
  if (id == -1) return 2;
  shmaddr = shmat (id, 0, 0);
  shmctl (id, IPC_RMID, 0);
  shmaddr2 = (char *)shmat (id, 0, 0);

  if ((char*) shmaddr2 == (char*) -1) {
    shmdt (shmaddr);
    return 1;
  }

  shmdt (shmaddr);
  shmdt (shmaddr2);

  return 0;
}

Reply via email to