# HG changeset patch # User Ryoma SHINYA # Date 1288971969 -32400 # Node ID c981dc66b258016b08ca90b5df793c33a467beee # Parent 020ba001c58a690d0ba5b7167e8d268c1ac8e61a add (maybe :-p) non_blocking_print_line. it's used pthread. diff -r 020ba001c58a -r c981dc66b258 pyrect/translator/grep_translator.py --- a/pyrect/translator/grep_translator.py Fri Nov 05 01:39:42 2010 +0900 +++ b/pyrect/translator/grep_translator.py Sat Nov 06 00:46:09 2010 +0900 @@ -47,6 +47,7 @@ self.emit("#include ") self.emit("#include ") self.emit("#include ") + self.emit("#include ") self.emit_skip() @@ -125,7 +126,8 @@ self.emit( 'if (ret == NULL) {fprintf(stderr, "memchr NULL err!"); exit(0);}') self.emiti( "if (ret > end) {") self.emit( "ret--;") - self.emit( "print_line(beg, ret);") + self.emit( "non_block_print_line(beg, ret);") + #self.emit( "print_line(beg, ret);") self.emit( "return;") self.emitd( "}") self.emit( "print_line(beg, ret);") diff -r 020ba001c58a -r c981dc66b258 pyrect/translator/template/grep.c --- a/pyrect/translator/template/grep.c Fri Nov 05 01:39:42 2010 +0900 +++ b/pyrect/translator/template/grep.c Sat Nov 06 00:46:09 2010 +0900 @@ -1,46 +1,33 @@ -/* -typedef struct _thread_arg { - unsigned char *buf; - int len; - int match; -} thread_arg_t; +typedef struct _targ_t { + char *beg; + char *end; + struct _targ_t *p; + pthread_t *t; + pthread_attr_t *a; +} targ_t; -void* thread_dfa(void *arg) { - thread_arg_t* targ = (thread_arg_t*)arg; - targ->match = DFA(targ->buf, targ->len); - return NULL; +void *print_line_(void *arg) { + targ_t *targ = (targ_t *)arg; + fwrite(targ->beg, sizeof(char), (targ->end - targ->beg + 1), stdout); + pthread_attr_destroy(targ->a); + free(targ->a); + free(targ->t); + free(targ->p); } -int paradfa(unsigned char *text, int len) { - pthread_t hundle[THREAD_NUM]; - thread_arg_t targ[THREAD_NUM]; - - if (len + REG_MAX_LEN <= REG_MAX_LEN) - return dfa(text, len); - - int i, t_len = (len + THREAD_NUM - 1) / THREAD_NUM; - for (i = 0; i < THREAD_NUM; i++) { - targ[i].buf = text + (unsigned char)(i * t_len); - targ[i].len = t_len + REG_MAX_LEN; - } - targ[THREAD_NUM - 1].len = len - (t_len * (THREAD_NUM - 1)); +void non_block_print_line(unsigned char *beg, unsigned char *end) { + targ_t *targ = (targ_t *)malloc(sizeof(targ_t)); + targ->a = (pthread_attr_t *)malloc(sizeof(pthread_attr_t)); + targ->t = (pthread_t *)malloc(sizeof(pthread_t)); + targ->p = targ; - for (i = 0; i < THREAD_NUM; i++) { - pthread_create(&hundle[i], NULL, (void *)thread_dfa, (void *)&targ[i]); - } - - for (i = 0; i < THREAD_NUM; i++) { - pthread_join(hundle[i], NULL); - } + pthread_attr_init(targ->a); + pthread_attr_setdetachstate(targ->a , PTHREAD_CREATE_DETACHED); + pthread_create(targ->t , targ->a , print_line_ , NULL); - for (i = 0; i < THREAD_NUM; i++) { - if (targ[i].match) return 1; - } - return 0; + fwrite(beg, sizeof(char), (end - beg + 1), stdout); } -*/ - void print_line(unsigned char *beg, unsigned char *end) { fwrite(beg, sizeof(char), (end - beg + 1), stdout); } @@ -70,6 +57,7 @@ dfa(beg, beg, end); munmap(file_mmap, size); + pthread_exit(NULL); return; }