add server USE_TRACE

This commit is contained in:
ubuntu201711081 2020-12-06 15:26:59 +00:00
parent d02eb2e69c
commit b53ed414b0
5 changed files with 55 additions and 15 deletions

View File

@ -26,8 +26,6 @@ slowclient: socket_wrapper.o client.c
.PHONY: clean test .PHONY: clean test
clean: clean:
rm *.o $(Bin) rm *.o $(Bin)
rm $(addprefix client_test/,$(ClientBin))
rm $(addprefix server_test/,$(ServerBin))
test: test:
make all make all

View File

@ -30,6 +30,7 @@ For server
- DEFAULT_WORK_QUEUE_SIZE(server only): 10 - DEFAULT_WORK_QUEUE_SIZE(server only): 10
- DEFAULT_MAX_THREAD_NUMBER(server only): 10 - DEFAULT_MAX_THREAD_NUMBER(server only): 10
- DEFAULT_RESPONSE_REQUEST(p-server only): 3(-1 is INF) - DEFAULT_RESPONSE_REQUEST(p-server only): 3(-1 is INF)
- USE_TRACE
For client For client
- MUL_CLIENT(second unit) - MUL_CLIENT(second unit)

View File

@ -13,10 +13,9 @@
#include <assert.h> #include <assert.h>
#include <fcntl.h> #include <fcntl.h>
#include <time.h> #include <time.h>
#include <sys/time.h>
#include <sys/times.h>
#include <pthread.h> #include <pthread.h>
#include "socket_wrapper.h" #include "socket_wrapper.h"
#include "timerhelper.h"
#ifndef DEFAULT_TIMEOUT #ifndef DEFAULT_TIMEOUT
static const int TIMEOUT = 5; static const int TIMEOUT = 5;
@ -208,16 +207,6 @@ void init_bench_data(){
clock_getres(bench.clock_id,&bench.resolution); clock_getres(bench.clock_id,&bench.resolution);
} }
} }
static inline struct timespec timespec_sub(struct timespec a,struct timespec b){
struct timespec ret;
ret.tv_sec = a.tv_sec - b.tv_sec;
ret.tv_nsec = a.tv_nsec - b.tv_nsec;
if (ret.tv_nsec < 0){
ret.tv_sec--;
ret.tv_nsec += 1000000000L;
}
return ret;
}
static size_t thread_number_option = 1; static size_t thread_number_option = 1;

View File

@ -16,6 +16,7 @@
#include "socket_wrapper.h" #include "socket_wrapper.h"
#include "simple_circular_buffer.h" #include "simple_circular_buffer.h"
#include "timerhelper.h"
#ifndef DEFAULT_MAX_LISTEN_SOCKET #ifndef DEFAULT_MAX_LISTEN_SOCKET
static const int MAX_LISTEN_SOCKET = 16; static const int MAX_LISTEN_SOCKET = 16;
@ -235,13 +236,24 @@ int parse_args(int argc,const char * argv[] , in_port_t * port){
typedef struct SharedState{ typedef struct SharedState{
//empty if less than 0 //empty if less than 0
queue_struct(int,WORK_QUEUE_SIZE) socks; queue_struct(int,WORK_QUEUE_SIZE) socks;
#ifdef USE_TRACE
queue_struct(struct timespec,WORK_QUEUE_SIZE) trace_timer;
#endif
pthread_mutex_t sock_mutex; pthread_mutex_t sock_mutex;
pthread_cond_t ready; pthread_cond_t ready;
//int progress[MAX_THREAD_NUMBER]; //int progress[MAX_THREAD_NUMBER];
} shared_state_t; } shared_state_t;
#ifdef USE_TRACE
enum{
Trace_Timer_ID = CLOCK_PROCESS_CPUTIME_ID
};
#endif
void init_shared_state(shared_state_t * state) { void init_shared_state(shared_state_t * state) {
queue_init(&state->socks); queue_init(&state->socks);
#ifdef USE_TRACE
queue_init(&state->trace_timer);
#endif
pthread_mutex_init(&state->sock_mutex,NULL); pthread_mutex_init(&state->sock_mutex,NULL);
pthread_cond_init(&state->ready,NULL); pthread_cond_init(&state->ready,NULL);
} }
@ -275,17 +287,32 @@ static shared_state_t globalState;
void * worker_proc(void * data){ void * worker_proc(void * data){
worker_argument_t * args = (worker_argument_t *)data; worker_argument_t * args = (worker_argument_t *)data;
int fd, csock; int fd, csock;
#ifdef USE_TRACE
struct timespec ts,ts_middle,ts_end;
#endif
for(;;){ for(;;){
pthread_mutex_lock(&globalState.sock_mutex); pthread_mutex_lock(&globalState.sock_mutex);
while (queue_isempty(&globalState.socks)){ while (queue_isempty(&globalState.socks)){
pthread_cond_wait(&globalState.ready,&globalState.sock_mutex); pthread_cond_wait(&globalState.ready,&globalState.sock_mutex);
} }
csock = dequeue(&globalState.socks); csock = dequeue(&globalState.socks);
#ifdef USE_TRACE
ts = dequeue(&globalState.trace_timer);
#endif
pthread_mutex_unlock(&globalState.sock_mutex); pthread_mutex_unlock(&globalState.sock_mutex);
#ifdef USE_TRACE
clock_gettime(Trace_Timer_ID,&ts_middle);
#endif
if((fd = read_request(csock,args->buf,args->bufsize)) > 0){ if((fd = read_request(csock,args->buf,args->bufsize)) > 0){
send_response(csock,fd,args->buf,args->bufsize); send_response(csock,fd,args->buf,args->bufsize);
close(fd); close(fd);
} }
#ifdef USE_TRACE
clock_gettime(Trace_Timer_ID,&ts_end);
struct timespec tophalf = timespec_sub(ts_middle,ts);
struct timespec bottomhelf = timespec_sub(ts_end,ts_middle);
fprintf(stderr,"top : %ld ns, bottom : %ld ns\n",tophalf.tv_nsec,bottomhelf.tv_nsec);
#endif
if(close(csock) < 0) if(close(csock) < 0)
perror("csock close error"); perror("csock close error");
@ -358,6 +385,10 @@ int main(int argc, const char *argv[]){
char ip_buf[INET_ADDRSTRLEN]; char ip_buf[INET_ADDRSTRLEN];
const char * msg = inet_ntop(AF_INET,&client_addr.sin_addr,ip_buf,sizeof(ip_buf)); const char * msg = inet_ntop(AF_INET,&client_addr.sin_addr,ip_buf,sizeof(ip_buf));
fprintf(stdout,"Connected on : %s:%d\n",msg == NULL ? "(null)" : msg , ntohs(addr.sin_port)); fprintf(stdout,"Connected on : %s:%d\n",msg == NULL ? "(null)" : msg , ntohs(addr.sin_port));
#ifdef USE_TRACE
struct timespec ts;
clock_gettime(Trace_Timer_ID, &ts);
#endif
for(;;){ for(;;){
pthread_mutex_lock(&globalState.sock_mutex); pthread_mutex_lock(&globalState.sock_mutex);
if (queue_isfull(&globalState.socks)){ if (queue_isfull(&globalState.socks)){
@ -369,7 +400,12 @@ int main(int argc, const char *argv[]){
#endif #endif
continue; continue;
} }
else enqueue(&globalState.socks,csock); else {
enqueue(&globalState.socks,csock);
#ifdef USE_TRACE
enqueue(&globalState.trace_timer,ts);
#endif
}
break; break;
} }
pthread_mutex_unlock(&globalState.sock_mutex); pthread_mutex_unlock(&globalState.sock_mutex);

16
timerhelper.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef _TIMERHELPER_H_
#define _TIMERHELPER_H_
#include <sys/time.h>
__always_inline struct timespec timespec_sub(struct timespec a,struct timespec b){
struct timespec ret;
ret.tv_sec = a.tv_sec - b.tv_sec;
ret.tv_nsec = a.tv_nsec - b.tv_nsec;
if (ret.tv_nsec < 0){
ret.tv_sec--;
ret.tv_nsec += 1000000000L;
}
return ret;
}
#endif