diff options
Diffstat (limited to 'toj/center/src')
-rwxr-xr-x | toj/center/src/center_judge.cpp | 47 | ||||
-rwxr-xr-x | toj/center/src/center_judge.h | 14 | ||||
-rwxr-xr-x | toj/center/src/center_manage.cpp | 165 | ||||
-rwxr-xr-x | toj/center/src/center_manage.h | 1 | ||||
-rw-r--r-- | toj/center/src/judge_manage.cpp | 4 | ||||
-rw-r--r-- | toj/center/src/judge_manage.h | 2 | ||||
-rwxr-xr-x | toj/center/src/judge_server.cpp | 2 | ||||
-rwxr-xr-x | toj/center/src/judge_server.h | 2 |
8 files changed, 142 insertions, 95 deletions
diff --git a/toj/center/src/center_judge.cpp b/toj/center/src/center_judge.cpp index 85a2fd6..46600c2 100755 --- a/toj/center/src/center_judge.cpp +++ b/toj/center/src/center_judge.cpp @@ -82,6 +82,16 @@ int judge_info::updatepro(std::vector<std::pair<int,int> > &pro_list){ return 0; } +int judge_info::updatejmod(std::vector<std::pair<char*,int> > &jmod_list){ + int i; + + for(i = 0;i < jmod_list.size();i++){ + jmod_map.erase(jmod_list[i].first); + } + conn_main->send_setjmod(jmod_list,0); + + return 0; +} judge_conn::judge_conn(int fd):netio(fd){ @@ -181,18 +191,21 @@ int judge_conn::send_setpro(std::vector<std::pair<int,int> > &pro_list,int type) return 0; } -int judge_conn::send_setjmod(char **jmod_name,int *cacheid,int type,int count){ +int judge_conn::send_setjmod(std::vector<std::pair<char*,int> > &jmod_list,int type){ int i; + int count; char *write_buf; int write_len; center_com_setjmod *setjmod; + count = jmod_list.size(); write_buf = create_combuf(CENTER_COMCODE_SETJMOD,sizeof(center_com_setjmod) * count,write_len,(void**)&setjmod); + for(i = 0;i < count;i++){ setjmod[i].jmod_name[0] = '\0'; - strncat(setjmod[i].jmod_name,jmod_name[i],sizeof(setjmod[i].jmod_name)); - setjmod[i].cacheid = cacheid[i]; + strncat(setjmod[i].jmod_name,jmod_list[i].first,sizeof(setjmod[i].jmod_name)); + setjmod[i].cacheid = jmod_list[i].second; setjmod[i].type = type; } writebytes(write_buf,write_len,NULL,NULL); @@ -268,27 +281,20 @@ void judge_conn::recv_setinfo(void *buf,size_t len,void *data){ int count; center_com_setinfo *setinfo; - char **jmod_name; std::map<std::string,center_jmod_info*>::iterator jmod_it; - std::vector<std::pair<int,int> > pro_list; - int *cacheid; + std::vector<std::pair<char*,int> > jmod_list; std::map<int,center_pro_info*>::iterator pro_it; + std::vector<std::pair<int,int> > pro_list; setinfo = (center_com_setinfo*)buf; info->setinfo(setinfo->avail); count = center_manage_jmodmap.size(); - jmod_name = new char*[count]; - cacheid = new int[count]; jmod_it = center_manage_jmodmap.begin(); for(i = 0;i < count;i++,jmod_it++){ - jmod_name[i] = jmod_it->second->name; - cacheid[i] = jmod_it->second->cacheid; + jmod_list.push_back(std::make_pair(jmod_it->second->name,jmod_it->second->cacheid)); } - send_setjmod(jmod_name,cacheid,0,count); - - delete jmod_name; - delete cacheid; + send_setjmod(jmod_list,0); count = center_manage_promap.size(); pro_it = center_manage_promap.begin(); @@ -489,6 +495,7 @@ static int judge_run_waitqueue(){ center_pro_info *pro_info; count = judge_submitqueue.size(); + printf(" remain count %d\n",count); for(;count > 0;count--){ sub_info = judge_submitqueue.front(); judge_submitqueue.pop(); @@ -557,3 +564,15 @@ int center_judge_updatepro(std::vector<std::pair<int,int> > &pro_list){ return 0; } +int center_judge_updatejmod(std::vector<std::pair<char*,int> > &jmod_list){ + int i; + int j; + std::list<judge_info*>::iterator judge_it; + judge_info *info; + + for(judge_it = judge_runlist.begin();judge_it != judge_runlist.end();judge_it++){ + (*judge_it)->updatejmod(jmod_list); + } + + return 0; +} diff --git a/toj/center/src/center_judge.h b/toj/center/src/center_judge.h index 99a3cf9..a955ce9 100755 --- a/toj/center/src/center_judge.h +++ b/toj/center/src/center_judge.h @@ -22,6 +22,7 @@ public: int submit(judge_submit_info *submit_info); int result(int subid,char *res_data); int updatepro(std::vector<std::pair<int,int> > &pro_list); + int updatejmod(std::vector<std::pair<char*,int> > &jmod_list); }; class judge_conn : public netio{ @@ -58,7 +59,7 @@ public: int send_setid(int judgeid); int send_submit(judge_submit_info* submit_info); int send_setpro(std::vector<std::pair<int,int> > &pro_list,int type); - int send_setjmod(char **jmod_name,int *cacheid,int type,int count); + int send_setjmod(std::vector<std::pair<char*,int> > &jmod_list,int type); virtual int readidle(); }; @@ -70,13 +71,13 @@ public: char *set_data; size_t set_len; - judge_submit_info(int subid,int proid,int lang,char *setdata,size_t setlen){ + judge_submit_info(int subid,int proid,int lang,char *set_data,size_t set_len){ this->subid = subid; this->proid = proid; this->lang = lang; - this->set_data = new char[setlen]; - memcpy(this->set_data,setdata,setlen); - this->set_len = setlen; + this->set_data = new char[set_len]; + memcpy(this->set_data,set_data,set_len); + this->set_len = set_len; } ~judge_submit_info(){ delete this->set_data; @@ -92,8 +93,9 @@ static std::queue<judge_submit_info*> judge_submitqueue; int center_judge_init(); void* center_judge_addconn(int fd); int center_judge_dispatch(int evflag,void *data); -int center_judge_submit(int subid,int proid,int lang,char *setdata,size_t setlen); +int center_judge_submit(int subid,int proid,int lang,char *set_data,size_t set_len); int center_judge_updatepro(std::vector<std::pair<int,int> > &pro_list); +int center_judge_updatejmod(std::vector<std::pair<char*,int> > &jmod_list); extern int center_manage_result(int subid,char *res_data); extern center_pro_info* center_manage_getprobyid(int proid); diff --git a/toj/center/src/center_manage.cpp b/toj/center/src/center_manage.cpp index 454faf2..a6a759c 100755 --- a/toj/center/src/center_manage.cpp +++ b/toj/center/src/center_manage.cpp @@ -228,38 +228,51 @@ static void manage_submit_cb(void *data){ char lchr; char tchr; - sub_info = (manage_submit_info*)data; - jmod_info = sub_info->jmod_info; - pro_info = sub_info->pro_info; + try{ + sub_info = (manage_submit_info*)data; + jmod_info = sub_info->jmod_info; + pro_info = sub_info->pro_info; + + if(jmod_info->manage_dll == NULL){ + getcwd(cwd_path,sizeof(cwd_path)); + snprintf(tpath,sizeof(tpath),"%s/jmod/%s/%s_manage.so",cwd_path,jmod_info->name,jmod_info->name); + + jmod_info->manage_dll = dlopen(tpath,RTLD_NOW); + jmod_info->manage_sub_fn = dlsym(jmod_info->manage_dll,"submit"); + jmod_info->manage_res_fn = dlsym(jmod_info->manage_dll,"result"); + } + mg_sub_fn = (judgm_manage_submit_fn)jmod_info->manage_sub_fn; - if(jmod_info->manage_dll == NULL){ - getcwd(cwd_path,sizeof(cwd_path)); - snprintf(tpath,sizeof(tpath),"%s/jmod/%s/%s_manage.so",cwd_path,jmod_info->name,jmod_info->name); + mg_info = sub_info->manage_info; + snprintf(mg_info->pro_path,sizeof(mg_info->pro_path),"tmp/pro/%d_%d",pro_info->proid,pro_info->cacheid); + snprintf(mg_info->res_path,sizeof(mg_info->res_path),"submit/%d/%d/result",(sub_info->subid / 1000) * 1000,sub_info->subid); - jmod_info->manage_dll = dlopen(tpath,RTLD_NOW); - jmod_info->manage_sub_fn = dlsym(jmod_info->manage_dll,"submit"); - jmod_info->manage_res_fn = dlsym(jmod_info->manage_dll,"result"); - } - mg_sub_fn = (judgm_manage_submit_fn)jmod_info->manage_sub_fn; - - mg_info = sub_info->manage_info; - snprintf(mg_info->pro_path,sizeof(mg_info->pro_path),"pro/%d",pro_info->proid); - snprintf(mg_info->res_path,sizeof(mg_info->res_path),"submit/%d/%d/result",(sub_info->subid / 1000) * 1000,sub_info->subid); - - snprintf(tpath,sizeof(tpath),"pro/%d/setting",pro_info->proid); - set_file = fopen(tpath,"r"); - lchr = '\n'; - while((tchr = fgetc(set_file)) != EOF){ - if(lchr == '\n' && tchr == '='){ - while(fgetc(set_file) != '\n'); - break; + snprintf(tpath,sizeof(tpath),"tmp/pro/%d_%d/setting",pro_info->proid,pro_info->cacheid); + if((set_file = fopen(tpath,"r")) == NULL){ + throw 0; + } + lchr = '\n'; + while((tchr = fgetc(set_file)) != EOF){ + if(lchr == '\n' && tchr == '='){ + while(fgetc(set_file) != '\n'); + break; + } + lchr = tchr; } - lchr = tchr; - } - - mg_sub_fn(mg_info,set_file); - fclose(set_file); + mg_sub_fn(mg_info,set_file); + + fclose(set_file); + }catch(...){ + manage_finish_result(sub_info->subid, + sub_info->uid, + sub_info->pro_info->proid, + JUDGE_ERR, + 0, + 0, + 0, + sub_info->rejudge_flag); + } } DLL_PUBLIC int center_manage_queuesubmit(int subid,int proid,int lang,char *set_data,size_t set_len){ center_judge_submit(subid,proid,lang,set_data,set_len); @@ -275,15 +288,6 @@ int center_manage_result(int subid,char *res_data){ judgm_manage_info *mg_info; judgm_manage_result_fn mg_res_fn; - PGconn *db_conn; - PGresult *db_res; - char db_result[32]; - char db_score[32]; - char db_runtime[32]; - char db_memory[32]; - char db_subid[32]; - char *db_param[5]; - if((sub_it = manage_submap.find(subid)) == manage_submap.end()){ return -1; } @@ -295,39 +299,14 @@ int center_manage_result(int subid,char *res_data){ if(mg_res_fn(mg_info,res_data)){ manage_submap.erase(sub_it); - if((db_conn = center_manage_conndb()) == NULL){ - return -1; - } - - snprintf(db_result,sizeof(db_result),"%d",mg_info->result); - snprintf(db_score,sizeof(db_score),"%lf",mg_info->score); - snprintf(db_runtime,sizeof(db_runtime),"%lu",mg_info->runtime); - snprintf(db_memory,sizeof(db_memory),"%lu",mg_info->memory / 1024UL); - snprintf(db_subid,sizeof(db_subid),"%d",subid); - db_param[0] = db_result; - db_param[1] = db_score; - db_param[2] = db_runtime; - db_param[3] = db_memory; - db_param[4] = db_subid; - db_res = PQexecParams(db_conn, - "UPDATE \"submit\" SET \"result\"=$1,\"score\"=$2,\"runtime\"=$3,\"memory\"=$4 WHERE \"subid\"=$5;", - 5, - NULL, - db_param, - NULL, - NULL, - 0); - PQclear(db_res); - center_manage_closedb(db_conn); - - manage_notice(subid, - sub_info->uid, - sub_info->pro_info->proid, - mg_info->result, - mg_info->score, - mg_info->runtime, - mg_info->memory, - sub_info->rejudge_flag); + manage_finish_result(subid, + sub_info->uid, + sub_info->pro_info->proid, + mg_info->result, + mg_info->score, + mg_info->runtime, + mg_info->memory, + sub_info->rejudge_flag); center_manage_putpro(sub_info->pro_info); delete sub_info; @@ -337,6 +316,52 @@ int center_manage_result(int subid,char *res_data){ return 0; } +static int manage_finish_result(int subid,int uid,int proid,int result,double score,int runtime,int memory,bool rejudge_flag){ + PGconn *db_conn; + PGresult *db_res; + char db_result[32]; + char db_score[32]; + char db_runtime[32]; + char db_memory[32]; + char db_subid[32]; + char *db_param[5]; + + if((db_conn = center_manage_conndb()) == NULL){ + return -1; + } + + snprintf(db_result,sizeof(db_result),"%d",result); + snprintf(db_score,sizeof(db_score),"%lf",score); + snprintf(db_runtime,sizeof(db_runtime),"%lu",runtime); + snprintf(db_memory,sizeof(db_memory),"%lu",memory / 1024UL); + snprintf(db_subid,sizeof(db_subid),"%d",subid); + db_param[0] = db_result; + db_param[1] = db_score; + db_param[2] = db_runtime; + db_param[3] = db_memory; + db_param[4] = db_subid; + db_res = PQexecParams(db_conn, + "UPDATE \"submit\" SET \"result\"=$1,\"score\"=$2,\"runtime\"=$3,\"memory\"=$4 WHERE \"subid\"=$5;", + 5, + NULL, + db_param, + NULL, + NULL, + 0); + PQclear(db_res); + center_manage_closedb(db_conn); + + manage_notice(subid, + uid, + proid, + result, + score, + runtime, + memory, + rejudge_flag); + + return 0; +} static int manage_notice(int subid,int uid,int proid,int result,double score,int runtime,int memory,bool rejudge_flag){ char msg[4096]; json_object *jso_msg; diff --git a/toj/center/src/center_manage.h b/toj/center/src/center_manage.h index 1f84403..b2ee36e 100755 --- a/toj/center/src/center_manage.h +++ b/toj/center/src/center_manage.h @@ -28,6 +28,7 @@ public: static void manage_submit_th(void *data); static void manage_submit_cb(void *data); +static int manage_finish_result(int subid,int uid,int proid,int result,double score,int runtime,int memory,bool rejudge_flag); static int manage_notice(int subid,int uid,int proid,int result,double score,int runtime,int memory,bool rejudge_flag); static int manage_updatepro(int proid,int cacheid,center_jmod_info *jmod_info,int lang_flag); diff --git a/toj/center/src/judge_manage.cpp b/toj/center/src/judge_manage.cpp index 6901565..32181bc 100644 --- a/toj/center/src/judge_manage.cpp +++ b/toj/center/src/judge_manage.cpp @@ -194,7 +194,7 @@ static void manage_updatepro_cb(void *data){ } -int judge_manage_submit(int subid,int proid,int lang,char *set_data){ +int judge_manage_submit(int subid,int proid,int lang,char *set_data,int set_len){ judge_pro_info *pro_info; judge_submit_info *sub_info; @@ -202,7 +202,7 @@ int judge_manage_submit(int subid,int proid,int lang,char *set_data){ struct stat st; pro_info = judge_manage_getprobyid(proid); - sub_info = new judge_submit_info(subid,pro_info,lang,set_data); + sub_info = new judge_submit_info(subid,pro_info,lang,set_data,set_len); if(manage_submap.find(subid) == manage_submap.end()){ snprintf(tpath,sizeof(tpath),"tmp/code/%d",subid); diff --git a/toj/center/src/judge_manage.h b/toj/center/src/judge_manage.h index 00abc22..594ea71 100644 --- a/toj/center/src/judge_manage.h +++ b/toj/center/src/judge_manage.h @@ -44,7 +44,7 @@ int judge_manage_getpro(judge_pro_info *pro_info); int judge_manage_putpro(judge_pro_info *pro_info); int judge_manage_updatepro(int proid,int cacheid,bool check_flag,judge_pro_info **update_pro_info); int judge_manage_done_updatepro(judge_pro_info *pro_info); -int judge_manage_submit(int subid,int proid,int lang,char *set_data); +int judge_manage_submit(int subid,int proid,int lang,char *set_data,int set_len); int judge_manage_done_code(int subid); std::map<int,judge_pro_info*> judge_manage_promap; diff --git a/toj/center/src/judge_server.cpp b/toj/center/src/judge_server.cpp index 7a2bb6a..66b4d01 100755 --- a/toj/center/src/judge_server.cpp +++ b/toj/center/src/judge_server.cpp @@ -216,7 +216,7 @@ void server_conn::recv_submit(void *buf,size_t len,void *data){ center_com_submit *sub; sub = (center_com_submit*)buf; - judge_manage_submit(sub->subid,sub->proid,sub->lang,(char*)((char*)buf + sizeof(center_com_submit))); + judge_manage_submit(sub->subid,sub->proid,sub->lang,(char*)((char*)buf + sizeof(center_com_submit)),len - sizeof(center_com_submit)); delete sub; } diff --git a/toj/center/src/judge_server.h b/toj/center/src/judge_server.h index fadde93..90a4e7c 100755 --- a/toj/center/src/judge_server.h +++ b/toj/center/src/judge_server.h @@ -82,6 +82,6 @@ extern int judge_manage_getpro(judge_pro_info *pro_info); extern int judge_manage_putpro(judge_pro_info *pro_info); extern int judge_manage_updatepro(int proid,int cacheid,bool check_flag,judge_pro_info **update_pro_info); extern int judge_manage_done_updatepro(judge_pro_info *pro_info); -extern int judge_manage_submit(int subid,int proid,int lang,char *set_data); +extern int judge_manage_submit(int subid,int proid,int lang,char *set_data,int set_len); extern int judge_manage_done_code(int subid); |