tokyocabinet을 사용중인데
잘 되다가 가끔 threading error이라는 메세지를 리턴한다.
읽을려는 파일이 read only라서 thread가 충돌할 일이 없다.
파일을 직접 열어서 확인하니
파일을 읽기 전용으로 열었는지에 대한 확인이 없고
절대 패스에 대해 lock을 거는 것 같다.
tcpathlock() 이부분에서 threading error를 리턴하는데
아래와 같이 간단히 해당 부분 회피 코드를 만들었다.
tchdbopen 의 세번째 파라미터 omoderk O_RDONLY일때
tcpathlock()함수 호출전 omode 가 1이 아닐 경우만 tcpathlock()를 호출하도록
file일 명 : tchdb.c
함수명 : tchdbopen
349 /* Open a database file and connect a hash database object. */
350 bool tchdbopen(TCHDB *hdb, const char *path, int omode){
351 assert(hdb && path);
352 if(!HDBLOCKMETHOD(hdb, true)) return false;
353 if(hdb->fd >= 0){
354 tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);
355 HDBUNLOCKMETHOD(hdb);
356 return false;
357 }
358 char *rpath = tcrealpath(path);
359 if(!rpath){
360 int ecode = TCEOPEN;
361 switch(errno){
362 case EACCES: ecode = TCENOPERM; break;
363 case ENOENT: ecode = TCENOFILE; break;
364 case ENOTDIR: ecode = TCENOFILE; break;
365 }
366 tchdbsetecode(hdb, ecode, __FILE__, __LINE__, __func__);
367 HDBUNLOCKMETHOD(hdb);
368 return false;
369 }
if( omode != 1 ) /// => 95 BDBOREADER = 1 << 0, /* open as a reader */
370 if(!tcpathlock(rpath)){
371 tchdbsetecode(hdb, TCETHREAD, __FILE__, __LINE__, __func__);
372 TCFREE(rpath);
373 HDBUNLOCKMETHOD(hdb);
374 return false;
375 }
376 bool rv = tchdbopenimpl(hdb, path, omode);
377 if(rv){
378 hdb->rpath = rpath;
379 } else {
'C언어' 카테고리의 다른 글
clock_gettime (0) | 2015.04.16 |
---|---|
c11 추가된 내용 (0) | 2015.03.20 |
thread deadlock debugging (0) | 2015.03.06 |
pthread automic operation (0) | 2015.03.04 |
pthread_create@@GLIBC_2.2.5 (in /lib64/libpthread-2.12.so) (0) | 2015.03.03 |