Changeset 134ac5d in mainline for uspace/lib/pcut/src/os/helenos.c
- Timestamp:
- 2014-06-06T07:54:24Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8db09e4
- Parents:
- eeb23f2d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/pcut/src/os/helenos.c
reeb23f2d r134ac5d 34 34 #include <stdlib.h> 35 35 #include <str.h> 36 #include <str_error.h> 36 37 #include <unistd.h> 37 38 #include <sys/types.h> … … 41 42 #include <task.h> 42 43 #include <fcntl.h> 44 #include <fibril_synch.h> 43 45 #include "../internal.h" 44 46 … … 68 70 } 69 71 72 void pcut_str_error(int error, char *buffer, int size) { 73 const char *str = str_error(error); 74 if (str == NULL) { 75 str = "(strerror failure)"; 76 } 77 str_cpy(buffer, size, str); 78 } 79 70 80 71 81 /* Forking-mode related functions. */ … … 89 99 static char extra_output_buffer[OUTPUT_BUFFER_SIZE]; 90 100 91 /** Prepare for a new test. */ 101 /** Prepare for a new test. 102 * 103 * @param test Test that is about to be run. 104 */ 92 105 static void before_test_start(pcut_item_t *test) { 93 106 pcut_report_test_start(test); … … 95 108 memset(error_message_buffer, 0, OUTPUT_BUFFER_SIZE); 96 109 memset(extra_output_buffer, 0, OUTPUT_BUFFER_SIZE); 110 } 111 112 /** Mutex guard for forced_termination_cv. */ 113 static fibril_mutex_t forced_termination_mutex 114 = FIBRIL_MUTEX_INITIALIZER(forced_termination_mutex); 115 116 /** Condition-variable for checking whether test timed-out. */ 117 static fibril_condvar_t forced_termination_cv 118 = FIBRIL_CONDVAR_INITIALIZER(forced_termination_cv); 119 120 /** Spawned task id. */ 121 static task_id_t test_task_id; 122 123 /** Flag whether test is still running. 124 * 125 * This flag is used when checking whether test timed-out. 126 */ 127 static int test_running; 128 129 /** Main fibril for checking whether test timed-out. 130 * 131 * @param arg Test that is currently running (pcut_item_t *). 132 * @return EOK Always. 133 */ 134 static int test_timeout_handler_fibril(void *arg) { 135 pcut_item_t *test = arg; 136 int timeout_sec = pcut_get_test_timeout(test); 137 suseconds_t timeout_us = (suseconds_t) timeout_sec * 1000 * 1000; 138 139 fibril_mutex_lock(&forced_termination_mutex); 140 if (!test_running) { 141 goto leave_no_kill; 142 } 143 int rc = fibril_condvar_wait_timeout(&forced_termination_cv, 144 &forced_termination_mutex, timeout_us); 145 if (rc == ETIMEOUT) { 146 task_kill(test_task_id); 147 } 148 leave_no_kill: 149 fibril_mutex_unlock(&forced_termination_mutex); 150 return EOK; 97 151 } 98 152 … … 131 185 int status = TEST_OUTCOME_PASS; 132 186 133 task_id_t task_id; 134 int rc = task_spawnvf(&task_id, self_path, arguments, files); 187 int rc = task_spawnvf(&test_task_id, self_path, arguments, files); 135 188 if (rc != EOK) { 136 189 status = TEST_OUTCOME_ERROR; … … 138 191 } 139 192 193 test_running = 1; 194 195 fid_t killer_fibril = fibril_create(test_timeout_handler_fibril, test); 196 if (killer_fibril == 0) { 197 /* FIXME: somehow announce this problem. */ 198 task_kill(test_task_id); 199 } else { 200 fibril_add_ready(killer_fibril); 201 } 202 140 203 task_exit_t task_exit; 141 204 int task_retval; 142 rc = task_wait(t ask_id, &task_exit, &task_retval);205 rc = task_wait(test_task_id, &task_exit, &task_retval); 143 206 if (rc != EOK) { 144 207 status = TEST_OUTCOME_ERROR; … … 151 214 } 152 215 216 fibril_mutex_lock(&forced_termination_mutex); 217 test_running = 0; 218 fibril_condvar_signal(&forced_termination_cv); 219 fibril_mutex_unlock(&forced_termination_mutex); 220 153 221 read_all(tempfile, extra_output_buffer, OUTPUT_BUFFER_SIZE); 154 222
Note:
See TracChangeset
for help on using the changeset viewer.