Drop trigger messages on high load

git-svn-id: svn://code.dyne.org/veejay/trunk@286 eb8d1916-c9e9-0310-b8de-cf0c9472ead5
This commit is contained in:
Niels Elburg
2005-04-11 01:22:52 +00:00
parent 70e49a38e1
commit c20b0ee039
3 changed files with 151 additions and 18 deletions

View File

@@ -441,6 +441,107 @@ int vj_server_poll(vj_server * vje)
return 0;
}
static int _vj_server_empty_queue(vj_server *vje, int link_id)
{
// ensure message queue is empty!!
int num_msg = 0;
vj_link **Link = (vj_link**) vje->link;
vj_message **v = Link[link_id]->m_queue;
int i;
for( i = 0; i < VJ_MAX_PENDING_MSG; i ++ )
{
if( v[i]->msg )
free(v[i]->msg);
v[i]->msg = NULL;
v[i]->len = 0;
}
Link[link_id]->n_queued = 0;
Link[link_id]->n_retrieved = 0;
return 1;
}
static int _vj_parse_highpriority_msg(vj_server *vje,int link_id, char *buf, int buf_len )
{
int nmsgs = 0;
int i = 0;
char *s = buf;
int num_msg = 0;
vj_link **Link = (vj_link**) vje->link;
vj_message **v = Link[link_id]->m_queue;
while( i < buf_len )
{
while( s[i] != 'V' && s[i+4] != 'D' )
i ++ ;
if( s[i] == 'V' && s[i+4] == 'D' )
{ // found message
char tmp_len[4];
char net_id[4];
int strlen = 0;
int netid = 0;
bzero(tmp_len,4);
bzero(net_id,4 );
strncpy( tmp_len, s + (i + 1 ), 3 );
if(sscanf(tmp_len,"%03d", &strlen))
{
i += 5;
strncpy( net_id, s + i , 3 );
if(sscanf(net_id, "%03d", &netid ))
{
if(netid >= 255 )
{
v[num_msg]->len = strlen;
v[num_msg]->msg = (char*)strndup( s + i , strlen );
num_msg ++;
if(num_msg == VJ_MAX_PENDING_MSG )
return num_msg; // cant take more
}
}
i += strlen;
}
else
{
i ++;
}
}
}
return num_msg;
}
static int _vj_get_n_msg_waiting(char *buf, int buf_len, int *offset )
{
int nmsgs = 0;
int i = 0;
char *s = buf;
while( i < buf_len )
{
while( s[i] != 'V' && s[i+4] != 'D' )
i ++ ;
if( s[i] == 'V' && s[i+4] == 'D' )
{ // found message
char tmp_len[4];
int strlen = 0;
bzero(tmp_len,4);
strncpy( tmp_len, s + (i + 1 ), 3 );
if(sscanf(tmp_len,"%03d", &strlen))
nmsgs++;
i += 5;
i += strlen;
if( nmsgs >= VJ_MAX_PENDING_MSG )
{
*offset = i;
return VJ_MAX_PENDING_MSG;
}
}
}
return nmsgs;
}
int _vj_server_parse_msg( vj_server *vje,int link_id, char *buf, int buf_len )
{
int i = 0;
@@ -460,12 +561,15 @@ int _vj_server_parse_msg( vj_server *vje,int link_id, char *buf, int buf_len )
if( n == 1)
{
i += 5; // skip header
while( (v[num_msg]->len > 0 ) || v[num_msg]->msg != NULL )
num_msg ++;
if(num_msg == VJ_MAX_PENDING_MSG)
return VJ_MAX_PENDING_MSG;
v[num_msg]->len = len;
if(v[num_msg]->msg != NULL)
free( v[num_msg]->msg );
v[num_msg]->msg = (char*)strndup( buf + i , len );
i += len;
num_msg ++;
}
@@ -558,7 +662,36 @@ int vj_server_update( vj_server *vje, int id )
}
}
return _vj_server_parse_msg( vje, id, vje->recv_buf,n );
// return _vj_server_parse_msg( vje, id, vje->recv_buf,n );
// ensure all is empty
_vj_server_empty_queue(vje, id);
char *tmp_buf = vje->recv_buf;
int bytes_left = n;
int skip_bytes = 0;
while( bytes_left > 0 )
{
int n_msg = _vj_get_n_msg_waiting( tmp_buf, bytes_left, &skip_bytes );
if( n_msg >= VJ_MAX_PENDING_MSG)
{
// cant skip all!
int hmsg = _vj_parse_highpriority_msg( vje, id,tmp_buf, skip_bytes );
if(hmsg == VJ_MAX_PENDING_MSG)
{
veejay_msg(VEEJAY_MSG_ERROR, "Link %d is acting very sucispous !", id);
return VJ_MAX_PENDING_MSG;
}
bzero( tmp_buf, skip_bytes );
tmp_buf += skip_bytes;
bytes_left -= skip_bytes;
}
else
{
return _vj_server_parse_msg( vje, id, tmp_buf, bytes_left );
}
}
return 0;
}
void vj_server_shutdown(vj_server *vje)
{

View File

@@ -8,8 +8,8 @@ enum {
NET_SWITCH_CLIP_TAG = 13,
NET_RESIZE_SDL_SCREEN = 12,
NET_SET_PLAY_MODE = 2,
NET_EFFECT_LIST = 15,
NET_EDITLIST_LIST = 201,
NET_EFFECT_LIST = 256,
NET_EDITLIST_LIST = 257,
NET_SET_MODE_AND_GO = 3,
NET_STREAM_COLOR = 6,
NET_RGB_PARAMETER_TYPE = 199,
@@ -29,7 +29,7 @@ enum {
NET_SCREENSHOT = 54,
NET_BUNDLE_FILE = 55,
NET_BUNDLE_SAVE = 56,
NET_LIST_BUNDLES = 57,
NET_LIST_BUNDLES = 258,
NET_BUNDLE_CAPTURE = 58,
NET_VIDEO_INFORMATION = 202,
NET_AUDIO_ENABLE = 4,
@@ -68,10 +68,10 @@ enum {
NET_CLIP_CLEAR_FREEZE = 117,
NET_CLIP_LOAD_CLIPLIST = 124,
NET_CLIP_SAVE_CLIPLIST = 125,
NET_CLIP_HISTORY_LIST = 126,
NET_CLIP_HISTORY_LIST = 259,
NET_CLIP_DEL_ALL = 135,
NET_CLIP_COPY = 139,
NET_CLIP_LIST = 205,
NET_CLIP_LIST = 260,
NET_SET_MARKER_START = 127,
NET_SET_MARKER_END = 128,
NET_CLIP_REC_START = 130,
@@ -81,7 +81,7 @@ enum {
NET_CLIP_RENDER_SELECT = 129,
NET_CLIP_RENDER_TO = 138,
NET_CLIP_RENDER_MOVE = 137,
NET_CLIP_RENDERLIST = 98,
NET_CLIP_RENDERLIST = 261,
NET_CLIP_UPDATE = 134,
NET_TAG_SELECT = 140,
NET_TAG_ACTIVATE = 141,
@@ -96,13 +96,13 @@ enum {
NET_TAG_OFFLINE_REC_STOP = 151,
NET_TAG_REC_START = 152,
NET_TAG_REC_STOP = 153,
NET_TAG_LIST = 206,
NET_TAG_DEVICES = 207,
NET_TAG_LIST = 262,
NET_TAG_DEVICES = 263,
NET_TAG_CHAIN_ENABLE = 156,
NET_TAG_CHAIN_DISABLE = 157,
NET_TAG_SET_DESCRIPTION = 158,
#ifdef HAVE_V4L
NET_TAG_GET_V4L = 159,
NET_TAG_GET_V4L = 264,
NET_TAG_SET_BRIGHTNESS = 160,
NET_TAG_SET_CONTRAST = 161,
NET_TAG_SET_HUE = 162,
@@ -113,14 +113,14 @@ enum {
NET_TAG_NEW_MCAST = 166,
NET_CHAIN_CHANNEL_INC = 170,
NET_CHAIN_CHANNEL_DEC = 171,
NET_CHAIN_GET_ENTRY = 208,
NET_CHAIN_GET_ENTRY = 265,
NET_CHAIN_TOGGLE_ALL = 172,
NET_CHAIN_ENABLE = 175,
NET_CHAIN_DISABLE = 176,
NET_CHAIN_CLEAR = 177,
NET_CHAIN_FADE_IN = 178,
NET_CHAIN_FADE_OUT = 179,
NET_CHAIN_LIST = 209,
NET_CHAIN_LIST = 266,
NET_CHAIN_SET_ENTRY = 180,
NET_CHAIN_ENTRY_SET_EFFECT = 181,
NET_CHAIN_ENTRY_SET_PRESET = 182,
@@ -138,7 +138,7 @@ enum {
NET_FULLSCREEN = 222,
NET_OUTPUT_Y4M_START = 71,
NET_OUTPUT_Y4M_STOP = 72,
NET_GET_FRAME = 225,
NET_GET_FRAME = 275,
NET_SAMPLE_MODE = 250,
NET_BEZERK = 251,
NET_DEBUG_LEVEL = 252,

View File

@@ -43,7 +43,7 @@
#include <veejay/vj-plugin.h>
/* Highest possible SDL Key identifier */
#define MAX_SDL_KEY 350
#define NET_MAX 256
#define NET_MAX 300
#define MSG_MIN_LEN 5