changeset 64:c981dc66b258

add (maybe :-p) non_blocking_print_line. it's used pthread.
author Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp>
date Sat, 06 Nov 2010 00:46:09 +0900
parents 020ba001c58a
children
files pyrect/translator/grep_translator.py pyrect/translator/template/grep.c
diffstat 2 files changed, 27 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- 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 <sys/stat.h>")
         self.emit("#include <fcntl.h>")
         self.emit("#include <string.h>")
+        self.emit("#include <pthread.h>")
 
         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);")
--- 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;
 }