From: Michal Voců Date: Fri, 2 Jun 2006 12:59:18 +0000 (+0000) Subject: * let strings be accompanied by length for faster handling X-Git-Tag: connpool_branch_start~12 X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=59f700ec923678923582b62f0f0aada3c8217525;p=jra1mw.git * let strings be accompanied by length for faster handling --- diff --git a/org.glite.lb.common/interface/il_msg.h b/org.glite.lb.common/interface/il_msg.h index a2e33a4..c00a7d0 100644 --- a/org.glite.lb.common/interface/il_msg.h +++ b/org.glite.lb.common/interface/il_msg.h @@ -1,6 +1,8 @@ #ifndef IL_MSG_H #define IL_MSG_H +#include "il_string.h" + #ident "$Header$" /* @@ -29,12 +31,23 @@ * */ -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 diff --git a/org.glite.lb.common/interface/il_string.h b/org.glite.lb.common/interface/il_string.h index db480f7..2a3d479 100644 --- a/org.glite.lb.common/interface/il_string.h +++ b/org.glite.lb.common/interface/il_string.h @@ -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 diff --git a/org.glite.lb.common/src/il_msg.c b/org.glite.lb.common/src/il_msg.c index 4154ee9..39c1f9e 100644 --- a/org.glite.lb.common/src/il_msg.c +++ b/org.glite.lb.common/src/il_msg.c @@ -6,19 +6,23 @@ #include #include #include +#include +#include #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); } diff --git a/org.glite.lb.common/src/il_string.c b/org.glite.lb.common/src/il_string.c index 2c4034d..8006aff 100644 --- a/org.glite.lb.common/src/il_string.c +++ b/org.glite.lb.common/src/il_string.c @@ -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 ); } diff --git a/org.glite.lb.common/src/lb_perftest.c b/org.glite.lb.common/src/lb_perftest.c index be0e9e4..a971b05 100644 --- a/org.glite.lb.common/src/lb_perftest.c +++ b/org.glite.lb.common/src/lb_perftest.c @@ -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); } diff --git a/org.glite.lb.common/src/perftest_common.sh b/org.glite.lb.common/src/perftest_common.sh index 3523feb..1884f98 100644 --- a/org.glite.lb.common/src/perftest_common.sh +++ b/org.glite.lb.common/src/perftest_common.sh @@ -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 diff --git a/org.glite.lb.common/test/il_msg_test.cpp b/org.glite.lb.common/test/il_msg_test.cpp index 99c0311..754e498 100644 --- a/org.glite.lb.common/test/il_msg_test.cpp +++ b/org.glite.lb.common/test/il_msg_test.cpp @@ -2,6 +2,7 @@ #include extern "C" { +#include #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() { diff --git a/org.glite.lb.common/test/il_string_test.cpp b/org.glite.lb.common/test/il_string_test.cpp index 2f03a94..1f138ac 100644 --- a/org.glite.lb.common/test/il_string_test.cpp +++ b/org.glite.lb.common/test/il_string_test.cpp @@ -1,6 +1,7 @@ #include extern "C" { +#include #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); }