aboutsummaryrefslogtreecommitdiffstats
path: root/toj/center
diff options
context:
space:
mode:
authorpzread <netfirewall@gmail.com>2013-04-09 09:37:29 +0800
committerpzread <netfirewall@gmail.com>2013-04-09 09:44:11 +0800
commit31e170379d567a71f1792e0bad9aea6ca3c6478a (patch)
tree73cac5d618f466db3b5be6982824cc0e1b421f90 /toj/center
parent3c6abbe11d9f2d173020add74217af2d450a1d16 (diff)
downloadtaiwan-online-judge-31e170379d567a71f1792e0bad9aea6ca3c6478a.tar
taiwan-online-judge-31e170379d567a71f1792e0bad9aea6ca3c6478a.tar.gz
taiwan-online-judge-31e170379d567a71f1792e0bad9aea6ca3c6478a.tar.bz2
taiwan-online-judge-31e170379d567a71f1792e0bad9aea6ca3c6478a.tar.lz
taiwan-online-judge-31e170379d567a71f1792e0bad9aea6ca3c6478a.tar.xz
taiwan-online-judge-31e170379d567a71f1792e0bad9aea6ca3c6478a.tar.zst
taiwan-online-judge-31e170379d567a71f1792e0bad9aea6ca3c6478a.zip
Fix segment fault(use deleted memory). Add square-problem manage. Check setting file exist
Diffstat (limited to 'toj/center')
-rwxr-xr-xtoj/center/src/center_judge.cpp47
-rwxr-xr-xtoj/center/src/center_judge.h14
-rwxr-xr-xtoj/center/src/center_manage.cpp165
-rwxr-xr-xtoj/center/src/center_manage.h1
-rw-r--r--toj/center/src/judge_manage.cpp4
-rw-r--r--toj/center/src/judge_manage.h2
-rwxr-xr-xtoj/center/src/judge_server.cpp2
-rwxr-xr-xtoj/center/src/judge_server.h2
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);