4 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);
7 reader_start_routine(void* p);
10 reader_new(command_t command)
12 reader_t reader = xbt_new0(s_reader_t, 1);
14 reader->thread = NULL;
15 reader->command = command;
16 reader->broken_pipe = 0;
20 reader->started = xbt_os_sem_init(0);
26 reader_free(reader_t* reader)
33 reader_read(reader_t reader)
35 reader->thread = xbt_os_thread_create("", reader_start_routine, reader);
40 reader_start_routine(void* p)
42 reader_t reader = (reader_t)p;
43 command_t command = reader->command;
45 xbt_strbuff_t output = command->output;
46 HANDLE stdout_fd = command->stdout_fd;
48 DWORD number_of_bytes_to_read = 4096;
49 DWORD number_of_bytes_readed;
51 char* buffer = (char*)calloc(number_of_bytes_to_read,sizeof(char));
53 while(!command->failed && !command->interrupted && !command->successeded && !reader->failed && !reader->broken_pipe)
55 if(!ReadFile(reader->command->stdout_fd, buffer, number_of_bytes_to_read, &number_of_bytes_readed, NULL) || (0 == number_of_bytes_readed))
57 if(GetLastError() == ERROR_BROKEN_PIPE)
58 reader->broken_pipe = 1;
64 if(number_of_bytes_readed > 0)
66 buffer[number_of_bytes_readed]='\0';
67 xbt_strbuff_append(output,buffer);
71 xbt_os_thread_yield();
78 if(reader->failed && !command->failed && !command->interrupted && !command->successeded)
80 command_kill(command);
82 command_handle_failure(command, csr_read_failure);
89 reader_start_routine(void* p)
91 reader_t reader = (reader_t)p;
92 command_t command = reader->command;
93 xbt_strbuff_t output = command->output;
94 int stdout_fd = command->stdout_fd;
95 int number_of_bytes_readed;
96 int number_of_bytes_to_read = (1024 > SSIZE_MAX) ? SSIZE_MAX : 1024;
98 char* buffer = (char*)calloc(number_of_bytes_to_read,sizeof(char));
99 xbt_os_sem_release(reader->started);
103 number_of_bytes_readed = read(stdout_fd, buffer, number_of_bytes_to_read);
105 if(number_of_bytes_readed < 0 && errno != EINTR && errno != EAGAIN)
110 if(number_of_bytes_readed > 0)
112 buffer[number_of_bytes_readed]='\0';
113 xbt_strbuff_append(output,buffer);
120 }while(!command->failed && !command->interrupted && !command->successeded && !reader->failed && (number_of_bytes_readed != 0 /* end of file <-> normal exit */));
124 if(reader->failed && !command->failed && !command->interrupted && !command->successeded)
126 command_kill(command);
128 command_handle_failure(command, csr_read_failure);
138 reader_wait(reader_t reader)
140 xbt_os_thread_join(reader->thread, NULL);