aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--iemnet_data.c10
-rw-r--r--iemnet_data.h9
-rw-r--r--iemnet_receiver.c9
-rw-r--r--iemnet_sender.c10
-rw-r--r--tcpclient.c27
-rw-r--r--tcpserver.c12
6 files changed, 75 insertions, 2 deletions
diff --git a/iemnet_data.c b/iemnet_data.c
index ce19693..5dc7ee5 100644
--- a/iemnet_data.c
+++ b/iemnet_data.c
@@ -296,7 +296,15 @@ t_iemnet_chunk* queue_pop(t_iemnet_queue* const _this) {
return queue_pop_block(_this);
}
-
+int queue_getsize(t_iemnet_queue* const _this) {
+ int size=-1;
+ if(_this) {
+ pthread_mutex_lock(&_this->mtx);
+ size=_this->size;
+ pthread_mutex_unlock(&_this->mtx);
+ }
+ return size;
+}
void queue_finish(t_iemnet_queue* q) {
DEBUG("queue_finish: %x", q);
if(NULL==q)
diff --git a/iemnet_data.h b/iemnet_data.h
index 45d1487..6124a85 100644
--- a/iemnet_data.h
+++ b/iemnet_data.h
@@ -106,6 +106,15 @@ t_iemnet_chunk* queue_pop_block(t_iemnet_queue* const q);
*/
t_iemnet_chunk* queue_pop_noblock(t_iemnet_queue* const);
/**
+ * get size if queue
+ *
+ * \param q the queue to get the size of
+ * \return the fill state of the queue, -1 if something goes wrong
+ *
+ * \note thread safe
+ */
+int queue_getsize(t_iemnet_queue* const q);
+/**
* initiate cleanup process
*
* unblocks all blocking calls to queue_pop_block(t_iemnet_queue* const q);
diff --git a/iemnet_receiver.c b/iemnet_receiver.c
index 5359f65..d161354 100644
--- a/iemnet_receiver.c
+++ b/iemnet_receiver.c
@@ -126,6 +126,15 @@ static void iemnet__receiver_tick(t_iemnet_receiver *x)
}
}
+int iemnet__receiver_getsize(t_iemnet_receiver*x) {
+ int size=-1;
+ if(x && x->queue)
+ size=queue_getsize(x->queue);
+
+ return size;
+}
+
+
t_iemnet_receiver*iemnet__receiver_create(int sock, void*userdata, t_iemnet_receivecallback callback) {
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
t_iemnet_receiver*rec=(t_iemnet_receiver*)getbytes(sizeof(t_iemnet_receiver));
diff --git a/iemnet_sender.c b/iemnet_sender.c
index eb1ec3b..0d6701c 100644
--- a/iemnet_sender.c
+++ b/iemnet_sender.c
@@ -162,3 +162,13 @@ int iemnet__sender_setsockopt(t_iemnet_sender*s, int level, int optname, const v
}
return result;
}
+
+
+
+int iemnet__sender_getsize(t_iemnet_sender*x) {
+ int size=-1;
+ if(x && x->queue)
+ size=queue_getsize(x->queue);
+
+ return size;
+}
diff --git a/tcpclient.c b/tcpclient.c
index d177f89..013fb75 100644
--- a/tcpclient.c
+++ b/tcpclient.c
@@ -68,6 +68,31 @@ static void tcpclient_receive_callback(void *x,
+static void tcpclient_info(t_tcpclient *x)
+{
+ // "server <socket> <IP> <port>"
+ // "bufsize <insize> <outsize>"
+ static t_atom output_atom[3];
+ if(x&&x->x_connectstate) {
+ int sockfd = x->x_fd;
+ unsigned short port = x->x_port;
+ const char*hostname=x->x_hostname;
+
+ int insize =iemnet__receiver_getsize(x->x_receiver);
+ int outsize=iemnet__sender_getsize (x->x_sender );
+
+ SETFLOAT (output_atom+0, sockfd);
+ SETSYMBOL(output_atom+1, gensym(hostname));
+ SETFLOAT (output_atom+2, port);
+
+ outlet_anything( x->x_statusout, gensym("server"), 3, output_atom);
+
+ SETFLOAT (output_atom+0, insize);
+ SETFLOAT (output_atom+1, outsize);
+ outlet_anything( x->x_statusout, gensym("bufsize"), 2, output_atom);
+ }
+}
+
/* connection handling */
static void *tcpclient_child_connect(void *w)
@@ -247,6 +272,8 @@ IEMNET_EXTERN void tcpclient_setup(void)
class_addmethod(tcpclient_class, (t_method)tcpclient_send, gensym("send"), A_GIMME, 0);
class_addlist(tcpclient_class, (t_method)tcpclient_send);
+ class_addbang(tcpclient_class, (t_method)tcpclient_info);
+
diff --git a/tcpserver.c b/tcpserver.c
index ff78d84..8e3dfb3 100644
--- a/tcpserver.c
+++ b/tcpserver.c
@@ -152,13 +152,18 @@ static int tcpserver_fixindex(t_tcpserver*x, int client)
/* ---------------- tcpserver info ---------------------------- */
static void tcpserver_info_client(t_tcpserver *x, int client)
{
- // "client <id> <socket> <IP> <port>
+ // "client <id> <socket> <IP> <port>"
+ // "bufsize <id> <insize> <outsize>"
static t_atom output_atom[4];
if(x&&x->x_sr&&x->x_sr[client]) {
int sockfd = x->x_sr[client]->sr_fd;
unsigned short port = x->x_sr[client]->sr_port;
long address = x->x_sr[client]->sr_host;
char hostname[MAXPDSTRING];
+
+ int insize =iemnet__receiver_getsize(x->x_sr[client]->sr_receiver);
+ int outsize=iemnet__sender_getsize (x->x_sr[client]->sr_sender );
+
snprintf(hostname, MAXPDSTRING-1, "%d.%d.%d.%d",
(address & 0xFF000000)>>24,
(address & 0x0FF0000)>>16,
@@ -172,6 +177,11 @@ static void tcpserver_info_client(t_tcpserver *x, int client)
SETFLOAT (output_atom+3, port);
outlet_anything( x->x_statout, gensym("client"), 4, output_atom);
+
+ SETFLOAT (output_atom+0, client+1);
+ SETFLOAT (output_atom+1, insize);
+ SETFLOAT (output_atom+2, outsize);
+ outlet_anything( x->x_statout, gensym("bufsize"), 3, output_atom);
}
}