* let strings be accompanied by length for faster handling
authorMichal Voců <michal@ruk.cuni.cz>
Fri, 2 Jun 2006 12:59:18 +0000 (12:59 +0000)
committerMichal Voců <michal@ruk.cuni.cz>
Fri, 2 Jun 2006 12:59:18 +0000 (12:59 +0000)
org.glite.lb.common/interface/il_msg.h
org.glite.lb.common/interface/il_string.h
org.glite.lb.common/src/il_msg.c
org.glite.lb.common/src/il_string.c
org.glite.lb.common/src/lb_perftest.c
org.glite.lb.common/src/perftest_common.sh
org.glite.lb.common/test/il_msg_test.cpp
org.glite.lb.common/test/il_string_test.cpp

index a2e33a4..c00a7d0 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef IL_MSG_H
 #define IL_MSG_H
 
+#include "il_string.h"
+
 #ident "$Header$"
 
 /*
  *
  */
 
-int encode_il_msg(char **, const char *);
+int encode_il_msg(char **, const il_octet_string_t *);
 int encode_il_reply(char **, int, int, const char *);
-int decode_il_msg(char **, const char *);
+int decode_il_msg(il_octet_string_t *, const char *);
 int decode_il_reply(int *, int *, char **, const char *);
 int read_il_data(void *user_data,
                 char **buffer,  
                 int (*reader)(void *user_data, char *buffer, const int));
 
+enum {
+  LB_OK    = 0,
+  LB_NOMEM = 200,
+  LB_PROTO = 400,
+  LB_AUTH  = 500,
+  LB_PERM  = 600,
+  LB_DBERR = 700,
+  LB_SYS   = 800,
+  LB_TIME  = 900
+};
+
 #endif
index db480f7..2a3d479 100644 (file)
@@ -3,28 +3,20 @@
 
 #ident "$Header$"
 
-#define MAXLEN 1024
+typedef struct il_octet_string {
+       int len;
+       char *data;
+} il_octet_string_t;
 
 char *put_int(char *p, int d);
 char *_put_int(char *p, int d);
-char *put_string(char *p, char *s);
+char *put_string(char *p, il_octet_string_t *s);
 
 char *get_int(char *p, int *d);
 char *_get_int(char *p, int *d);
-char *get_string(char *p, char **s);
+char *get_string(char *p, il_octet_string_t *s);
 
-int len_string(char *s);
+int len_string(il_octet_string_t *s);
 int len_int(int d);
 
-enum {
-  LB_OK    = 0,
-  LB_NOMEM = 200,
-  LB_PROTO = 400,
-  LB_AUTH  = 500,
-  LB_PERM  = 600,
-  LB_DBERR = 700,
-  LB_SYS   = 800,
-  LB_TIME  = 900
-};
-
 #endif
index 4154ee9..39c1f9e 100644 (file)
@@ -6,19 +6,23 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <string.h>
+#include <assert.h>
 
 #define IL_PROTOCOL_MAGIC_WORD "michal"
 
 int 
-encode_il_msg(char **buffer, const char *event)
+encode_il_msg(char **buffer, const il_octet_string_t *event)
 {
   int len;
   char *p;
-  char *protocol_magic_word = IL_PROTOCOL_MAGIC_WORD;
-
+  il_octet_string_t protocol_magic_word;
+  
+  protocol_magic_word.data = IL_PROTOCOL_MAGIC_WORD;
+  protocol_magic_word.len = strlen(IL_PROTOCOL_MAGIC_WORD);
 
   /* allocate enough room to hold the message */
-  len = 17 + len_string(protocol_magic_word) + len_string((char*)event);
+  len = 17 + len_string(&protocol_magic_word) + len_string((il_octet_string_t*)event);
   if((*buffer = malloc(len)) == NULL) {
     return(-1);
   }
@@ -30,8 +34,8 @@ encode_il_msg(char **buffer, const char *event)
   p += 17;
 
   /* write rest of the message */
-  p = put_string(p, protocol_magic_word);
-  p = put_string(p, (char*)event);
+  p = put_string(p, &protocol_magic_word);
+  p = put_string(p, (il_octet_string_t*)event);
 
   return(p - *buffer);
 }
@@ -44,8 +48,11 @@ encode_il_reply(char **buffer,
 {
   int len;
   char *p;
+  il_octet_string_t emsg;
 
-  len = 17 + len_int(err_code) + len_int(err_code_min) + len_string((char*)err_msg);
+  emsg.data = (char*)err_msg;
+  emsg.len = strlen(err_msg);
+  len = 17 + len_int(err_code) + len_int(err_code_min) + len_string(&emsg);
   if((*buffer = malloc(len)) == NULL) {
     return(-1);
   }
@@ -54,32 +61,34 @@ encode_il_reply(char **buffer,
   p = *buffer + 17;
   p = put_int(p, err_code);
   p = put_int(p, err_code_min);
-  p = put_string(p, (char*)err_msg);
+  p = put_string(p, &emsg);
   return(p - *buffer);
 }
 
 
 int 
-decode_il_msg(char **event, const char *buf)
+decode_il_msg(il_octet_string_t *event, const char *buf)
 {
   char *p;
-  char *protocol_magic_word=NULL;
+  il_octet_string_t protocol_magic_word;
   int magic_word_check_failed = 0;
 
+  assert( event != NULL );
+
   /* First check that the protocol 'magic' word is there */
   p = get_string((char*)buf, &protocol_magic_word);
-  if (protocol_magic_word) {
-    if (strcmp (protocol_magic_word, IL_PROTOCOL_MAGIC_WORD) != 0) {
+  if (protocol_magic_word.data) {
+    if (strcmp (protocol_magic_word.data, IL_PROTOCOL_MAGIC_WORD) != 0) {
       magic_word_check_failed = 1;
     }
-    free(protocol_magic_word);
+    free(protocol_magic_word.data);
   }
 
   if (magic_word_check_failed != 0) return (-1);
 
   p = get_string(p, event);
   if(p == NULL) {
-    if(*event) { free(*event); *event = NULL; };
+    if(event->data) { free(event->data); event->data = NULL; };
     return(-1);
   }
   return(p - buf);
@@ -89,17 +98,19 @@ decode_il_msg(char **event, const char *buf)
 int
 decode_il_reply(int *maj, int *min, char **err, const char * buf)
 {
-  char *p = buf;
+       char *p = (char*)buf;
+  il_octet_string_t e;
 
   p = get_int(p, maj);
   if(p == NULL) return(-1);
   p = get_int(p, min);
   if(p == NULL) return(-1);
-  p = get_string(p, err);
+  p = get_string(p, &e);
   if(p == NULL) {
-    if(*err) { free(*err); *err = NULL; };
+    if(e.data) { free(e.data); e.data = NULL; };
     return(-1);
   }
+  *err = e.data;
   return(p - buf);
 }
 
index 2c4034d..8006aff 100644 (file)
@@ -7,54 +7,54 @@
 #include "il_string.h"
 
 char *
-put_string(char *p, char *s)
+put_string(char *p, il_octet_string_t *s)
 {
-  int len = strlen(s);
-  
   assert( p != NULL );
+  assert( s != NULL );
 
-  p = _put_int(p, len);
+  p = _put_int(p, s->len);
   *p++ = ' ';
-  strncpy(p, s, len);
-  p += len;
+  /* strncpy(p, s->data, s->len); */
+  memcpy(p, s->data, s->len);
+  p += s->len;
   *p++ = '\n';
   return(p);
 }
 
 
 int
-len_string(char *s)
+len_string(il_octet_string_t *s)
 {
-  int len, slen;
+  int len;
 
   assert( s != NULL );
 
-  slen = strlen(s);
-  len = len_int(slen);
-
-  return(len + slen + 1);
+  len = len_int(s->len);
+  return(len + s->len + 1);
 }
 
 
 char *
-get_string(char *p, char **s)
+get_string(char *p, il_octet_string_t *s)
 {
   int len;
 
   assert( p != NULL );
+  assert( s != NULL );
 
-  *s = NULL;
+  s->data = NULL;
 
   p = _get_int(p, &len);
   if(*p != ' ')
     return(NULL);
   else
     {
-      *s = malloc(len + 1);
-      if(*s == NULL)
+      s->data = malloc(len + 1);
+      if(s->data == NULL)
        return(NULL);
-      strncpy(*s, ++p, len);
-      (*s)[len] = '\0';
+      /* strncpy(s->data, ++p, len); */
+      memcpy(s->data, ++p, len);
+      (s->data)[len] = '\0';
       p += len;
       return( *p++ == '\n' ? p : NULL );
     }
index be0e9e4..a971b05 100644 (file)
@@ -35,6 +35,33 @@ static int dest_port;
 #define BUFFSZ        1024
 
 
+/*
+ * strnstr - look only in first n characters
+ * (taken from NSPR)
+ */
+static
+char *
+_strnstr(const char *big, const char *little, size_t max)
+{
+    size_t ll;
+
+    if( ((const char *)0 == big) || ((const char *)0 == little) ) return (char *)0;
+    if( ((char)0 == *big) || ((char)0 == *little) ) return (char *)0;
+
+    ll = strlen(little);
+    if( ll > (size_t)max ) return (char *)0;
+    max -= ll;
+    max++;
+
+    for( ; max && *big; big++, max-- )
+        if( *little == *big )
+            if( 0 == strncmp(big, little, ll) )
+                return (char *)big;
+
+    return (char *)0;
+}
+
+
 /* 
  * reading lines (pasted from load.c)
  */
@@ -409,7 +436,8 @@ glite_wll_perftest_consumeEventString(const char *event_string)
        gettimeofday(&endtime, NULL);
 
        /* check for the termination event */
-       if(strstr(event_string, termination_string) != NULL) {
+       /* if it is not in the first 1k chars, it is not there */
+       if(_strnstr(event_string, termination_string, 1024) != NULL) {
                /* print the timestamp */
                fprintf(stderr, "PERFTEST_END_TIMESTAMP=%lu.%06lu\n",
                        (unsigned long)endtime.tv_sec,(unsigned long)endtime.tv_usec);
@@ -427,7 +455,7 @@ int
 glite_wll_perftest_consumeEventIlMsg(const char *msg)
 {
        int ret = 0;
-       char *event;
+       il_octet_string_t event;
 
        assert(msg != NULL);
 
@@ -443,7 +471,7 @@ glite_wll_perftest_consumeEventIlMsg(const char *msg)
        }
                
        /* check for the termination event */
-       if(strstr(event, termination_string) != NULL) {
+       if(_strnstr(event.data, termination_string, 1024) != NULL) {
                /* print the timestamp */
                fprintf(stderr, "PERFTEST_END_TIMESTAMP=%lu.%06lu\n",
                        endtime.tv_sec, endtime.tv_usec);
@@ -453,7 +481,7 @@ glite_wll_perftest_consumeEventIlMsg(const char *msg)
        if(pthread_mutex_unlock(&perftest_lock) < 0)
                abort();
 
-       free(event);
+       free(event.data);
 
        return(ret);
 }
index 3523feb..1884f98 100644 (file)
@@ -111,11 +111,13 @@ run_test()
        if [[ $linesbefore -eq $linesafter ]]
        then
            echo "Test failed - consumer did not report timestamp."
+           PERFTEST_THROUGHPUT[$i]=0
+           PERFTEST_EV_THROUGHPUT[$i]=0
        else
            get_result
            [[ $DEBUG -gt 0 ]] && echo Result: $PERFTEST_DAY_JOB_THROUGHPUT
            PERFTEST_THROUGHPUT[$i]=$PERFTEST_DAY_JOB_THROUGHPUT
-           PERFTEST_EVENT_THROUGHPUT[$i]=$PERFTEST_EVENT_THROUGHPUT
+           PERFTEST_EV_THROUGHPUT[$i]=$PERFTEST_EVENT_THROUGHPUT
        fi
        i=$(($i + 1))
     done
index 99c0311..754e498 100644 (file)
@@ -2,6 +2,7 @@
 #include <unistd.h>
 
 extern "C" {
+#include <string.h>
 #include "il_string.h"
 #include "il_msg.h"
 }
@@ -18,7 +19,11 @@ class IlMsgTest : public CppUnit::TestFixture
 
 public:
        void setUp() {
-               len_msg = encode_il_msg(&buffer_msg, "zprava");
+               il_octet_string_t s;
+
+               s.data = "zprava";
+               s.len = strlen(s.data);
+               len_msg = encode_il_msg(&buffer_msg, &s);
                len_rep = encode_il_reply(&buffer_rep, 10, 20, "chyba");
        }
 
@@ -34,14 +39,14 @@ public:
        }
 
        void testDecodeMsg() {
-               char *s;
+               il_octet_string_t s;
                int  l;
 
                l = decode_il_msg(&s, buffer_msg + 17);
                CPPUNIT_ASSERT_EQUAL(l, len_msg - 17);
-               CPPUNIT_ASSERT(s != NULL);
-               CPPUNIT_ASSERT( !strcmp(s, "zprava") );
-               free(s);
+               CPPUNIT_ASSERT(s.data != NULL);
+               CPPUNIT_ASSERT( !strcmp(s.data, "zprava") );
+               free(s.data);
        }
 
        void testEncodeReply() {
index 2f03a94..1f138ac 100644 (file)
@@ -1,6 +1,7 @@
 #include <cppunit/extensions/HelperMacros.h>
 
 extern "C" {
+#include <string.h>
 #include "il_string.h"
 }
 
@@ -20,21 +21,29 @@ public:
        }
 
        void testPutString() {
-               put_string(buffer, "ahoj");
+               il_octet_string_t s;
+               s.data = "ahoj";
+               s.len = strlen(s.data);
+               put_string(buffer, &s);
                CPPUNIT_ASSERT( !strncmp(buffer,"4 ahoj\n",7) );
        }
 
        void testGetString() {
-               char *s;
+               il_octet_string_t s;
                get_string("4 ahoj\n", &s);
-               CPPUNIT_ASSERT( s != NULL );
-               CPPUNIT_ASSERT( !strcmp(s, "ahoj") );
-               CPPUNIT_ASSERT( s[4] == 0 );
-               free(s);
+               CPPUNIT_ASSERT( s.data != NULL );
+               CPPUNIT_ASSERT( !strcmp(s.data, "ahoj") );
+               CPPUNIT_ASSERT( s.data[4] == 0 );
+               free(s.data);
        }
 
        void testLenString() {
-               int d = len_string("ahoj");
+               il_octet_string_t s;
+               int d;
+
+               s.data = "ahoj";
+               s.len = strlen(s.data);
+               d = len_string(&s);
                CPPUNIT_ASSERT( d == 7);
        }