2015-12-03 22:08 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* contrib/hbnetio/netiosrv.c
! fixed wrongly set error code when last stream is closed.
It was minor problem invisible for client PRG code without any
side effects.
* lock stream mutex a little bit earlier to avoid problems with
future code extensions - i.e. streams closed asynchronously by
other server threads
* contrib/hbnetio/netiocli.c
* allow to send data to currently registered stream.
Now if server stream function sends some data to stream before it
returns then this data is not dropped be client but saved and later
can be accessed by netio_GetData() function
This commit is contained in:
@@ -10,6 +10,21 @@
|
||||
* Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment
|
||||
*/
|
||||
|
||||
2015-12-03 22:08 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
|
||||
* contrib/hbnetio/netiosrv.c
|
||||
! fixed wrongly set error code when last stream is closed.
|
||||
It was minor problem invisible for client PRG code without any
|
||||
side effects.
|
||||
* lock stream mutex a little bit earlier to avoid problems with
|
||||
future code extensions - i.e. streams closed asynchronously by
|
||||
other server threads
|
||||
|
||||
* contrib/hbnetio/netiocli.c
|
||||
* allow to send data to currently registered stream.
|
||||
Now if server stream function sends some data to stream before it
|
||||
returns then this data is not dropped be client but saved and later
|
||||
can be accessed by netio_GetData() function
|
||||
|
||||
2015-12-03 12:26 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
|
||||
* include/hbstack.h
|
||||
* src/vm/estack.c
|
||||
|
||||
@@ -250,6 +250,23 @@ static PHB_SRVDATA s_fileFindSrvData( PHB_CONCLI conn, int iStreamID, int iType
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int s_fileNewSrvData( PHB_CONCLI conn, int iType )
|
||||
{
|
||||
PHB_SRVDATA pSrvData = ( PHB_SRVDATA ) hb_xgrabz( sizeof( HB_SRVDATA ) );
|
||||
|
||||
pSrvData->id = s_fileGenSrvDataID( conn );
|
||||
pSrvData->type = iType;
|
||||
if( iType == NETIO_SRVITEM )
|
||||
pSrvData->maxsize = 4096;
|
||||
else if( iType == NETIO_SRVDATA )
|
||||
pSrvData->maxsize = 0x10000;
|
||||
pSrvData->next = conn->srvdata;
|
||||
if( ! conn->srvdata )
|
||||
hb_atomic_inc( &conn->used );
|
||||
conn->srvdata = pSrvData;
|
||||
return pSrvData->id;
|
||||
}
|
||||
|
||||
static HB_BOOL s_fileCloseSrvData( PHB_CONCLI conn, int iStreamID )
|
||||
{
|
||||
PHB_SRVDATA * pSrvDataPtr = &conn->srvdata;
|
||||
@@ -275,27 +292,6 @@ static HB_BOOL s_fileCloseSrvData( PHB_CONCLI conn, int iStreamID )
|
||||
return HB_FALSE;
|
||||
}
|
||||
|
||||
static void s_fileNewSrvData( PHB_CONCLI conn, int iStreamID, int iType )
|
||||
{
|
||||
PHB_SRVDATA pSrvData = s_fileFindSrvData( conn, iStreamID, 0 );
|
||||
|
||||
if( ! pSrvData )
|
||||
{
|
||||
pSrvData = ( PHB_SRVDATA ) memset( hb_xgrab( sizeof( HB_SRVDATA ) ),
|
||||
0, sizeof( HB_SRVDATA ) );
|
||||
pSrvData->id = iStreamID;
|
||||
pSrvData->type = iType;
|
||||
if( iType == NETIO_SRVITEM )
|
||||
pSrvData->maxsize = 4096;
|
||||
else if( iType == NETIO_SRVDATA )
|
||||
pSrvData->maxsize = 0x10000;
|
||||
pSrvData->next = conn->srvdata;
|
||||
if( ! conn->srvdata )
|
||||
hb_atomic_inc( &conn->used );
|
||||
conn->srvdata = pSrvData;
|
||||
}
|
||||
}
|
||||
|
||||
static HB_BOOL s_fileRecvSrvData( PHB_CONCLI conn, long len, int iStreamID, int iType )
|
||||
{
|
||||
char * buffer = ( char * ) hb_xgrab( len );
|
||||
@@ -1208,7 +1204,7 @@ static HB_BOOL s_netio_procexec( int iMsg, int iType )
|
||||
HB_PUT_LE_UINT32( &msgbuf[ 4 ], size );
|
||||
if( iMsg == NETIO_FUNCCTRL )
|
||||
{
|
||||
iStreamID = s_fileGenSrvDataID( conn );
|
||||
iStreamID = s_fileNewSrvData( conn, iType );
|
||||
HB_PUT_LE_UINT32( &msgbuf[ 8 ], iStreamID );
|
||||
HB_PUT_LE_UINT32( &msgbuf[ 12 ], iType );
|
||||
memset( msgbuf + 16, '\0', sizeof( msgbuf ) - 16 );
|
||||
@@ -1243,7 +1239,7 @@ static HB_BOOL s_netio_procexec( int iMsg, int iType )
|
||||
if( iMsg == NETIO_FUNCCTRL )
|
||||
{
|
||||
if( iStreamID == hb_itemGetNI( pItem ) )
|
||||
s_fileNewSrvData( conn, iStreamID, iType );
|
||||
iStreamID = 0;
|
||||
else
|
||||
hb_itemPutNI( pItem, -1 );
|
||||
}
|
||||
@@ -1262,6 +1258,8 @@ static HB_BOOL s_netio_procexec( int iMsg, int iType )
|
||||
}
|
||||
}
|
||||
}
|
||||
if( iStreamID != 0 )
|
||||
s_fileCloseSrvData( conn, iStreamID );
|
||||
if( buffer )
|
||||
hb_xfree( buffer );
|
||||
s_fileConUnlock( conn );
|
||||
|
||||
@@ -1402,15 +1402,16 @@ HB_FUNC( NETIO_SERVER )
|
||||
while( *pStreamPtr )
|
||||
{
|
||||
if( ( *pStreamPtr )->id == iStreamID )
|
||||
{
|
||||
PHB_CONSTREAM stream = *pStreamPtr;
|
||||
*pStreamPtr = stream->next;
|
||||
hb_xfree( stream );
|
||||
break;
|
||||
}
|
||||
pStreamPtr = &( *pStreamPtr )->next;
|
||||
}
|
||||
if( *pStreamPtr == NULL )
|
||||
if( *pStreamPtr != NULL )
|
||||
{
|
||||
PHB_CONSTREAM stream = *pStreamPtr;
|
||||
*pStreamPtr = stream->next;
|
||||
hb_xfree( stream );
|
||||
}
|
||||
else
|
||||
iStreamID = 0;
|
||||
hb_threadMutexUnlock( conn->mutex );
|
||||
}
|
||||
@@ -1508,17 +1509,22 @@ HB_FUNC( NETIO_SERVER )
|
||||
iStreamID = 0;
|
||||
if( iStreamID )
|
||||
{
|
||||
PHB_CONSTREAM stream = ( PHB_CONSTREAM )
|
||||
hb_xgrab( sizeof( HB_CONSTREAM ) );
|
||||
stream->id = iStreamID;
|
||||
stream->type = iStreamType;
|
||||
stream->next = conn->streams;
|
||||
conn->streams = stream;
|
||||
|
||||
if( conn->mutex == NULL )
|
||||
conn->mutex = hb_threadMutexCreate();
|
||||
if( ! hb_threadMutexLock( conn->mutex ) )
|
||||
if( hb_threadMutexLock( conn->mutex ) )
|
||||
{
|
||||
PHB_CONSTREAM stream = ( PHB_CONSTREAM )
|
||||
hb_xgrab( sizeof( HB_CONSTREAM ) );
|
||||
stream->id = iStreamID;
|
||||
stream->type = iStreamType;
|
||||
stream->next = conn->streams;
|
||||
conn->streams = stream;
|
||||
}
|
||||
else
|
||||
{
|
||||
errCode = NETIO_ERR_REFUSED;
|
||||
iStreamID = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
errCode = NETIO_ERR_WRONG_PARAM;
|
||||
|
||||
Reference in New Issue
Block a user