Skip to content

Commit

Permalink
Only reallocate shared memory if the size changes
Browse files Browse the repository at this point in the history
  • Loading branch information
matt335672 committed Dec 1, 2021
1 parent d9f08ea commit 6ad2724
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 27 deletions.
62 changes: 35 additions & 27 deletions module/rdpClientCon.c
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,38 @@ rdpClientConProcessMsgVersion(rdpPtr dev, rdpClientCon *clientCon,
return 0;
}

/**************************************************************************//**
* Allocate shared memory
*
* This memory is shared with the xup driver in xrdp which avoids a lot
* of unnecessary copying
*
* @param clientCon Client connection
* @param bytes Size of area to attach
*/
static void
AllocSharedMemory(rdpClientCon *clientCon, int bytes)
{
if (clientCon->shmemptr == NULL || clientCon->shmem_bytes != bytes)
{
if (clientCon->shmemptr != 0)
{
shmdt(clientCon->shmemptr);
}
clientCon->shmemid = shmget(IPC_PRIVATE, bytes, IPC_CREAT | 0777);
clientCon->shmemptr = shmat(clientCon->shmemid, 0, 0);
clientCon->shmem_bytes = bytes;
shmctl(clientCon->shmemid, IPC_RMID, NULL);
LLOGLN(0, ("AllocSharedMemory: shmemid %d shmemptr %p bytes %d",
clientCon->shmemid, clientCon->shmemptr,
clientCon->shmem_bytes));
}
else
{
LLOGLN(0, ("AllocSharedMemory: reusing shmemid %d",
clientCon->shmemid));
}
}
/******************************************************************************/
/*
this from miScreenInit
Expand Down Expand Up @@ -727,17 +759,9 @@ rdpClientConProcessScreenSizeMsg(rdpPtr dev, rdpClientCon *clientCon,

clientCon->cap_stride_bytes = clientCon->rdp_width * clientCon->rdp_Bpp;

if (clientCon->shmemptr != 0)
{
shmdt(clientCon->shmemptr);
}
bytes = clientCon->rdp_width * clientCon->rdp_height *
clientCon->rdp_Bpp;
clientCon->shmemid = shmget(IPC_PRIVATE, bytes, IPC_CREAT | 0777);
clientCon->shmemptr = shmat(clientCon->shmemid, 0, 0);
shmctl(clientCon->shmemid, IPC_RMID, NULL);
LLOGLN(0, ("rdpClientConProcessScreenSizeMsg: shmemid %d shmemptr %p",
clientCon->shmemid, clientCon->shmemptr));
AllocSharedMemory(clientCon, bytes);
clientCon->shmem_lineBytes = clientCon->rdp_Bpp * clientCon->rdp_width;

if (clientCon->shmRegion != 0)
Expand Down Expand Up @@ -868,17 +892,9 @@ rdpClientConProcessMsgClientInfo(rdpPtr dev, rdpClientCon *clientCon)
clientCon->cap_height = RDPALIGN(clientCon->rdp_height, 64);
LLOGLN(0, (" cap_width %d cap_height %d",
clientCon->cap_width, clientCon->cap_height));
if (clientCon->shmemptr != 0)
{
shmdt(clientCon->shmemptr);
}
bytes = clientCon->cap_width * clientCon->cap_height *
clientCon->rdp_Bpp;
clientCon->shmemid = shmget(IPC_PRIVATE, bytes, IPC_CREAT | 0777);
clientCon->shmemptr = shmat(clientCon->shmemid, 0, 0);
shmctl(clientCon->shmemid, IPC_RMID, NULL);
LLOGLN(0, ("rdpClientConProcessMsgClientInfo: shmemid %d shmemptr %p "
"bytes %d", clientCon->shmemid, clientCon->shmemptr, bytes));
AllocSharedMemory(clientCon, bytes);
clientCon->shmem_lineBytes = clientCon->rdp_Bpp * clientCon->cap_width;
clientCon->cap_stride_bytes = clientCon->cap_width * 4;
shmemstatus = SHM_RFX_ACTIVE;
Expand All @@ -890,16 +906,8 @@ rdpClientConProcessMsgClientInfo(rdpPtr dev, rdpClientCon *clientCon)
clientCon->cap_height = clientCon->rdp_height;
LLOGLN(0, (" cap_width %d cap_height %d",
clientCon->cap_width, clientCon->cap_height));
if (clientCon->shmemptr != 0)
{
shmdt(clientCon->shmemptr);
}
bytes = clientCon->cap_width * clientCon->cap_height * 2;
clientCon->shmemid = shmget(IPC_PRIVATE, bytes, IPC_CREAT | 0777);
clientCon->shmemptr = shmat(clientCon->shmemid, 0, 0);
shmctl(clientCon->shmemid, IPC_RMID, NULL);
LLOGLN(0, ("rdpClientConProcessMsgClientInfo: shmemid %d shmemptr %p "
"bytes %d", clientCon->shmemid, clientCon->shmemptr, bytes));
AllocSharedMemory(clientCon, bytes);
clientCon->shmem_lineBytes = clientCon->rdp_Bpp * clientCon->cap_width;
clientCon->cap_stride_bytes = clientCon->cap_width * 4;
shmemstatus = SHM_H264_ACTIVE;
Expand Down
1 change: 1 addition & 0 deletions module/rdpClientCon.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ struct _rdpClientCon

uint8_t *shmemptr;
int shmemid;
int shmem_bytes;
int shmem_lineBytes;
RegionPtr shmRegion;
int rect_id;
Expand Down

0 comments on commit 6ad2724

Please sign in to comment.