Changes in / [4006447:463e734] in mainline
- Files:
-
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
Makefile
r4006447 r463e734 41 41 CONFIG_HEADER = config.h 42 42 43 .PHONY: all precheck cscope autotool config_ auto config_default config distclean clean43 .PHONY: all precheck cscope autotool config_default config distclean clean 44 44 45 45 all: $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) … … 66 66 67 67 config_default: $(CONFIG_RULES) 68 ifeq ($(HANDS_OFF),y) 69 $(CONFIG) $< hands-off $(PROFILE) 70 else 71 $(CONFIG) $< default $(PROFILE) 72 endif 68 $(CONFIG) $< default 73 69 74 70 config: $(CONFIG_RULES) -
tools/config.py
r4006447 r463e734 3 3 # Copyright (c) 2006 Ondrej Palkovsky 4 4 # Copyright (c) 2009 Martin Decky 5 # Copyright (c) 2010 Jiri Svoboda6 5 # All rights reserved. 7 6 # … … 41 40 import xtui 42 41 43 RULES_FILE= sys.argv[1]42 INPUT = sys.argv[1] 44 43 MAKEFILE = 'Makefile.config' 45 44 MACROS = 'config.h' 46 PRE SETS_DIR= 'defaults'47 48 def read_ config(fname, config):49 "Read saved values from last configuration run or a preset file"45 PRECONF = 'defaults' 46 47 def read_defaults(fname, defaults): 48 "Read saved values from last configuration run" 50 49 51 50 inf = open(fname, 'r') … … 53 52 for line in inf: 54 53 res = re.match(r'^(?:#!# )?([^#]\w*)\s*=\s*(.*?)\s*$', line) 55 if res:56 config[res.group(1)] = res.group(2)54 if (res): 55 defaults[res.group(1)] = res.group(2) 57 56 58 57 inf.close() 59 58 60 def check_condition(text, config, rules):59 def check_condition(text, defaults, ask_names): 61 60 "Check that the condition specified on input line is True (only CNF and DNF is supported)" 62 61 63 62 ctype = 'cnf' 64 63 65 if ( ')|' in text) or ('|(' in text):64 if ((')|' in text) or ('|(' in text)): 66 65 ctype = 'dnf' 67 66 68 if ctype == 'cnf':67 if (ctype == 'cnf'): 69 68 conds = text.split('&') 70 69 else: … … 72 71 73 72 for cond in conds: 74 if cond.startswith('(') and cond.endswith(')'):73 if (cond.startswith('(')) and (cond.endswith(')')): 75 74 cond = cond[1:-1] 76 75 77 inside = check_inside(cond, config, ctype)76 inside = check_inside(cond, defaults, ctype) 78 77 79 78 if (ctype == 'cnf') and (not inside): 80 79 return False 81 80 82 if (ctype == 'dnf') and inside:81 if (ctype == 'dnf') and (inside): 83 82 return True 84 83 85 if ctype == 'cnf':84 if (ctype == 'cnf'): 86 85 return True 87 86 return False 88 87 89 def check_inside(text, config, ctype):88 def check_inside(text, defaults, ctype): 90 89 "Check for condition" 91 90 92 if ctype == 'cnf':91 if (ctype == 'cnf'): 93 92 conds = text.split('|') 94 93 else: … … 97 96 for cond in conds: 98 97 res = re.match(r'^(.*?)(!?=)(.*)$', cond) 99 if not res:98 if (not res): 100 99 raise RuntimeError("Invalid condition: %s" % cond) 101 100 … … 104 103 condval = res.group(3) 105 104 106 if not condname in config:105 if (not condname in defaults): 107 106 varval = '' 108 107 else: 109 varval = config[condname]108 varval = defaults[condname] 110 109 if (varval == '*'): 111 110 varval = 'y' 112 111 113 if ctype == 'cnf':112 if (ctype == 'cnf'): 114 113 if (oper == '=') and (condval == varval): 115 114 return True … … 124 123 return False 125 124 126 if ctype == 'cnf':125 if (ctype == 'cnf'): 127 126 return False 128 127 129 128 return True 130 129 131 def parse_ rules(fname, rules):132 "Parse rulesfile"130 def parse_config(fname, ask_names): 131 "Parse configuration file" 133 132 134 133 inf = open(fname, 'r') … … 139 138 for line in inf: 140 139 141 if line.startswith('!'):140 if (line.startswith('!')): 142 141 # Ask a question 143 142 res = re.search(r'!\s*(?:\[(.*?)\])?\s*([^\s]+)\s*\((.*)\)\s*$', line) 144 143 145 if not res:144 if (not res): 146 145 raise RuntimeError("Weird line: %s" % line) 147 146 … … 150 149 vartype = res.group(3) 151 150 152 rules.append((varname, vartype, name, choices, cond))151 ask_names.append((varname, vartype, name, choices, cond)) 153 152 name = '' 154 153 choices = [] 155 154 continue 156 155 157 if line.startswith('@'):156 if (line.startswith('@')): 158 157 # Add new line into the 'choices' array 159 158 res = re.match(r'@\s*(?:\[(.*?)\])?\s*"(.*?)"\s*(.*)$', line) … … 165 164 continue 166 165 167 if line.startswith('%'):166 if (line.startswith('%')): 168 167 # Name of the option 169 168 name = line[1:].strip() 170 169 continue 171 170 172 if line.startswith('#') or (line == '\n'):171 if ((line.startswith('#')) or (line == '\n')): 173 172 # Comment or empty line 174 173 continue … … 182 181 "Return '*' if yes, ' ' if no" 183 182 184 if default == 'y':183 if (default == 'y'): 185 184 return '*' 186 185 … … 200 199 cnt = 0 201 200 for key, val in choices: 202 if ( default) and (key == default):201 if ((default) and (key == default)): 203 202 position = cnt 204 203 … … 208 207 (button, value) = xtui.choice_window(screen, name, 'Choose value', options, position) 209 208 210 if button == 'cancel':209 if (button == 'cancel'): 211 210 return None 212 211 213 212 return choices[value][0] 214 213 215 ## Infer and verify configuration values. 216 # 217 # Augment @a config with values that can be inferred, purge invalid ones 218 # and verify that all variables have a value (previously specified or inferred). 219 # 220 # @param config Configuration to work on 221 # @param rules Rules 222 # 223 # @return True if configuration is complete and valid, False 224 # otherwise. 225 # 226 def infer_verify_choices(config, rules): 227 "Infer and verify configuration values." 228 229 for rule in rules: 230 varname, vartype, name, choices, cond = rule 231 232 if cond and (not check_condition(cond, config, rules)): 233 continue 234 235 if not varname in config: 236 value = None 237 else: 238 value = config[varname] 239 240 if not validate_rule_value(rule, value): 241 value = None 242 243 default = get_default_rule(rule) 244 if default != None: 245 config[varname] = default 246 247 if not varname in config: 214 def check_choices(defaults, ask_names): 215 "Check whether all accessible variables have a default" 216 217 for varname, vartype, name, choices, cond in ask_names: 218 if ((cond) and (not check_condition(cond, defaults, ask_names))): 219 continue 220 221 if (not varname in defaults): 248 222 return False 249 223 250 224 return True 251 225 252 ## Get default value from a rule. 253 def get_default_rule(rule): 254 varname, vartype, name, choices, cond = rule 255 256 default = None 257 258 if vartype == 'choice': 259 # If there is just one option, use it 260 if len(choices) == 1: 261 default = choices[0][0] 262 elif vartype == 'y': 263 default = '*' 264 elif vartype == 'n': 265 default = 'n' 266 elif vartype == 'y/n': 267 default = 'y' 268 elif vartype == 'n/y': 269 default = 'n' 270 else: 271 raise RuntimeError("Unknown variable type: %s" % vartype) 272 273 return default 274 275 ## Get option from a rule. 276 # 277 # @param rule Rule for a variable 278 # @param value Current value of the variable 279 # 280 # @return Option (string) to ask or None which means not to ask. 281 # 282 def get_rule_option(rule, value): 283 varname, vartype, name, choices, cond = rule 284 285 option = None 286 287 if vartype == 'choice': 288 # If there is just one option, don't ask 289 if len(choices) != 1: 290 if (value == None): 291 option = "? %s --> " % name 292 else: 293 option = " %s [%s] --> " % (name, value) 294 elif vartype == 'y': 295 pass 296 elif vartype == 'n': 297 pass 298 elif vartype == 'y/n': 299 option = " <%s> %s " % (yes_no(value), name) 300 elif vartype == 'n/y': 301 option =" <%s> %s " % (yes_no(value), name) 302 else: 303 raise RuntimeError("Unknown variable type: %s" % vartype) 304 305 return option 306 307 ## Check if variable value is valid. 308 # 309 # @param rule Rule for the variable 310 # @param value Value of the variable 311 # 312 # @return True if valid, False if not valid. 313 # 314 def validate_rule_value(rule, value): 315 varname, vartype, name, choices, cond = rule 316 317 if value == None: 318 return True 319 320 if vartype == 'choice': 321 if not value in [choice[0] for choice in choices]: 322 return False 323 elif vartype == 'y': 324 if value != 'y': 325 return False 326 elif vartype == 'n': 327 if value != 'n': 328 return False 329 elif vartype == 'y/n': 330 if not value in ['y', 'n']: 331 return False 332 elif vartype == 'n/y': 333 if not value in ['y', 'n']: 334 return False 335 else: 336 raise RuntimeError("Unknown variable type: %s" % vartype) 337 338 return True 339 340 def create_output(mkname, mcname, config, rules): 226 def create_output(mkname, mcname, defaults, ask_names): 341 227 "Create output configuration" 342 228 … … 352 238 sys.stderr.write("failed\n") 353 239 354 if len(version) == 3:240 if (len(version) == 3): 355 241 revision = version[1] 356 if version[0] != 1:242 if (version[0] != 1): 357 243 revision += 'M' 358 244 revision += ' (%s)' % version[2] … … 373 259 defs = 'CONFIG_DEFS =' 374 260 375 for varname, vartype, name, choices, cond in rules:376 if cond and (not check_condition(cond, config, rules)):377 continue 378 379 if not varname in config:380 value= ''261 for varname, vartype, name, choices, cond in ask_names: 262 if ((cond) and (not check_condition(cond, defaults, ask_names))): 263 continue 264 265 if (not varname in defaults): 266 default = '' 381 267 else: 382 value = config[varname]383 if ( value== '*'):384 value= 'y'385 386 outmk.write('# %s\n%s = %s\n\n' % (name, varname, value))387 388 if vartype in ["y", "n", "y/n", "n/y"]:389 if value == "y":268 default = defaults[varname] 269 if (default == '*'): 270 default = 'y' 271 272 outmk.write('# %s\n%s = %s\n\n' % (name, varname, default)) 273 274 if ((vartype == "y") or (vartype == "n") or (vartype == "y/n") or (vartype == "n/y")): 275 if (default == "y"): 390 276 outmc.write('/* %s */\n#define %s\n\n' % (name, varname)) 391 277 defs += ' -D%s' % varname 392 278 else: 393 outmc.write('/* %s */\n#define %s %s\n#define %s_%s\n\n' % (name, varname, value, varname, value))394 defs += ' -D%s=%s -D%s_%s' % (varname, value, varname, value)395 396 if revision is not None:279 outmc.write('/* %s */\n#define %s %s\n#define %s_%s\n\n' % (name, varname, default, varname, default)) 280 defs += ' -D%s=%s -D%s_%s' % (varname, default, varname, default) 281 282 if (revision is not None): 397 283 outmk.write('REVISION = %s\n' % revision) 398 284 outmc.write('#define REVISION %s\n' % revision) … … 413 299 return list 414 300 415 ## Ask user to choose a configuration profile. 416 # 417 def choose_profile(root, fname, screen, config): 301 def read_preconfigured(root, fname, screen, defaults): 418 302 options = [] 419 303 opt2path = {} … … 425 309 canon = os.path.join(path, fname) 426 310 427 if os.path.isdir(path) and os.path.exists(canon) and os.path.isfile(canon):311 if ((os.path.isdir(path)) and (os.path.exists(canon)) and (os.path.isfile(canon))): 428 312 subprofile = False 429 313 … … 433 317 subcanon = os.path.join(subpath, fname) 434 318 435 if os.path.isdir(subpath) and os.path.exists(subcanon) and os.path.isfile(subcanon):319 if ((os.path.isdir(subpath)) and (os.path.exists(subcanon)) and (os.path.isfile(subcanon))): 436 320 subprofile = True 437 321 options.append("%s (%s)" % (name, subname)) 438 opt2path[cnt] = [name, subname]322 opt2path[cnt] = (canon, subcanon) 439 323 cnt += 1 440 324 441 if not subprofile:325 if (not subprofile): 442 326 options.append(name) 443 opt2path[cnt] = [name]327 opt2path[cnt] = (canon, None) 444 328 cnt += 1 445 329 446 330 (button, value) = xtui.choice_window(screen, 'Load preconfigured defaults', 'Choose configuration profile', options, None) 447 331 448 if button == 'cancel':332 if (button == 'cancel'): 449 333 return None 450 334 451 return opt2path[value] 452 453 ## Read presets from a configuration profile. 454 # 455 # @param profile Profile to load from (a list of string components) 456 # @param config Output configuration 457 # 458 def read_presets(profile, config): 459 path = os.path.join(PRESETS_DIR, profile[0], MAKEFILE) 460 read_config(path, config) 461 462 if len(profile) > 1: 463 path = os.path.join(PRESETS_DIR, profile[0], profile[1], MAKEFILE) 464 read_config(path, config) 465 466 ## Parse profile name (relative OS path) into a list of components. 467 # 468 # @param profile_name Relative path (using OS separator) 469 # @return List of components 470 # 471 def parse_profile_name(profile_name): 472 profile = [] 473 474 head, tail = os.path.split(profile_name) 475 if head != '': 476 profile.append(head) 477 478 profile.append(tail) 479 return profile 335 read_defaults(opt2path[value][0], defaults) 336 if (opt2path[value][1] != None): 337 read_defaults(opt2path[value][1], defaults) 480 338 481 339 def main(): 482 profile = None 483 config = {} 484 rules = [] 485 486 # Parse rules file 487 parse_rules(RULES_FILE, rules) 488 489 # Input configuration file can be specified on command line 490 # otherwise configuration from previous run is used. 491 if len(sys.argv) >= 4: 492 profile = parse_profile_name(sys.argv[3]) 493 read_presets(profile, config) 494 elif os.path.exists(MAKEFILE): 495 read_config(MAKEFILE, config) 496 497 # Default mode: check values and regenerate configuration files 498 if (len(sys.argv) >= 3) and (sys.argv[2] == 'default'): 499 if (infer_verify_choices(config, rules)): 500 create_output(MAKEFILE, MACROS, config, rules) 340 defaults = {} 341 ask_names = [] 342 343 # Parse configuration file 344 parse_config(INPUT, ask_names) 345 346 # Read defaults from previous run 347 if os.path.exists(MAKEFILE): 348 read_defaults(MAKEFILE, defaults) 349 350 # Default mode: only check defaults and regenerate configuration 351 if ((len(sys.argv) >= 3) and (sys.argv[2] == 'default')): 352 if (check_choices(defaults, ask_names)): 353 create_output(MAKEFILE, MACROS, defaults, ask_names) 501 354 return 0 502 355 503 # Hands-off mode: check values and regenerate configuration files, 504 # but no interactive fallback 505 if (len(sys.argv) >= 3) and (sys.argv[2] == 'hands-off'): 506 # We deliberately test sys.argv >= 4 because we do not want 507 # to read implicitly any possible previous run configuration 508 if len(sys.argv) < 4: 509 sys.stderr.write("Configuration error: No presets specified\n") 510 return 2 511 512 if (infer_verify_choices(config, rules)): 513 create_output(MAKEFILE, MACROS, config, rules) 514 return 0 515 516 sys.stderr.write("Configuration error: The presets are ambiguous\n") 517 return 1 518 519 # Check mode: only check configuration 520 if (len(sys.argv) >= 3) and (sys.argv[2] == 'check'): 521 if infer_verify_choices(config, rules): 356 # Check mode: only check defaults 357 if ((len(sys.argv) >= 3) and (sys.argv[2] == 'check')): 358 if (check_choices(defaults, ask_names)): 522 359 return 0 523 360 return 1 … … 529 366 while True: 530 367 531 # Cancel out all values which have to be deduced532 for varname, vartype, name, choices, cond in rules:533 if ( vartype == 'y') and (varname in config) and (config[varname] == '*'):534 config[varname] = None368 # Cancel out all defaults which have to be deduced 369 for varname, vartype, name, choices, cond in ask_names: 370 if ((vartype == 'y') and (varname in defaults) and (defaults[varname] == '*')): 371 defaults[varname] = None 535 372 536 373 options = [] … … 540 377 options.append(" --- Load preconfigured defaults ... ") 541 378 542 for rule in rules: 543 varname, vartype, name, choices, cond = rule 544 545 if cond and (not check_condition(cond, config, rules)): 379 for varname, vartype, name, choices, cond in ask_names: 380 381 if ((cond) and (not check_condition(cond, defaults, ask_names))): 546 382 continue 547 383 548 if varname == selname:384 if (varname == selname): 549 385 position = cnt 550 386 551 if not varname in config:552 value= None387 if (not varname in defaults): 388 default = None 553 389 else: 554 value = config[varname] 555 556 if not validate_rule_value(rule, value): 557 value = None 558 559 default = get_default_rule(rule) 560 if default != None: 561 if value == None: 562 value = default 563 config[varname] = value 564 565 option = get_rule_option(rule, value) 566 if option != None: 567 options.append(option) 390 default = defaults[varname] 391 392 if (vartype == 'choice'): 393 # Check if the default is an acceptable value 394 if ((default) and (not default in [choice[0] for choice in choices])): 395 default = None 396 defaults.pop(varname) 397 398 # If there is just one option, use it 399 if (len(choices) == 1): 400 defaults[varname] = choices[0][0] 401 continue 402 403 if (default == None): 404 options.append("? %s --> " % name) 405 else: 406 options.append(" %s [%s] --> " % (name, default)) 407 elif (vartype == 'y'): 408 defaults[varname] = '*' 409 continue 410 elif (vartype == 'n'): 411 defaults[varname] = 'n' 412 continue 413 elif (vartype == 'y/n'): 414 if (default == None): 415 default = 'y' 416 defaults[varname] = default 417 options.append(" <%s> %s " % (yes_no(default), name)) 418 elif (vartype == 'n/y'): 419 if (default == None): 420 default = 'n' 421 defaults[varname] = default 422 options.append(" <%s> %s " % (yes_no(default), name)) 568 423 else: 569 continue424 raise RuntimeError("Unknown variable type: %s" % vartype) 570 425 571 426 opt2row[cnt] = (varname, vartype, name, choices) … … 578 433 (button, value) = xtui.choice_window(screen, 'HelenOS configuration', 'Choose configuration option', options, position) 579 434 580 if button == 'cancel':435 if (button == 'cancel'): 581 436 return 'Configuration canceled' 582 437 583 if button == 'done':584 if ( infer_verify_choices(config, rules)):438 if (button == 'done'): 439 if (check_choices(defaults, ask_names)): 585 440 break 586 441 else: … … 588 443 continue 589 444 590 if value == 0: 591 profile = choose_profile(PRESETS_DIR, MAKEFILE, screen, config) 592 if profile != None: 593 read_presets(profile, config) 445 if (value == 0): 446 read_preconfigured(PRECONF, MAKEFILE, screen, defaults) 594 447 position = 1 595 448 continue 596 449 597 450 position = None 598 if not value in opt2row:451 if (not value in opt2row): 599 452 raise RuntimeError("Error selecting value: %s" % value) 600 453 601 454 (selname, seltype, name, choices) = opt2row[value] 602 455 603 if not selname in config:604 value= None456 if (not selname in defaults): 457 default = None 605 458 else: 606 value = config[selname]607 608 if seltype == 'choice':609 config[selname] = subchoice(screen, name, choices, value)610 elif ( seltype == 'y/n') or (seltype == 'n/y'):611 if config[selname] == 'y':612 config[selname] = 'n'459 default = defaults[selname] 460 461 if (seltype == 'choice'): 462 defaults[selname] = subchoice(screen, name, choices, default) 463 elif ((seltype == 'y/n') or (seltype == 'n/y')): 464 if (defaults[selname] == 'y'): 465 defaults[selname] = 'n' 613 466 else: 614 config[selname] = 'y'467 defaults[selname] = 'y' 615 468 finally: 616 469 xtui.screen_done(screen) 617 470 618 create_output(MAKEFILE, MACROS, config, rules)471 create_output(MAKEFILE, MACROS, defaults, ask_names) 619 472 return 0 620 473 -
uspace/app/netecho/print_error.c
r4006447 r463e734 164 164 case EDESTADDRREQ: 165 165 fprintf(output, "Destination address required (%d) error", error_code); 166 case EAGAIN:166 case TRY_AGAIN: 167 167 fprintf(output, "Try again (%d) error", error_code); 168 168 default: -
uspace/lib/c/generic/adt/char_map.c
r4006447 r463e734 90 90 } 91 91 92 map->items[map->next]->c = * identifier;93 identifier++;94 map->next++;95 if ((length > 1) || ((length == 0) && *identifier)) {92 map->items[map->next]->c = * identifier; 93 ++ identifier; 94 ++ map->next; 95 if ((length > 1) || ((length == 0) && (*identifier))) { 96 96 map->items[map->next - 1]->value = CHAR_MAP_NULL; 97 97 return char_map_add_item(map->items[map->next - 1], identifier, … … 142 142 const int value) 143 143 { 144 if (char_map_is_valid(map) && identifier && (length || *identifier)) { 144 if (char_map_is_valid(map) && (identifier) && 145 ((length) || (*identifier))) { 145 146 int index; 146 147 147 for (index = 0; index < map->next; index++) {148 for (index = 0; index < map->next; ++ index) { 148 149 if (map->items[index]->c != *identifier) 149 150 continue; 150 151 151 identifier++;152 if((length > 1) || ((length == 0) && *identifier)) {152 ++ identifier; 153 if((length > 1) || ((length == 0) && (*identifier))) { 153 154 return char_map_add(map->items[index], 154 155 identifier, length ? length - 1 : 0, value); … … 177 178 178 179 map->magic = 0; 179 for (index = 0; index < map->next; index++)180 for (index = 0; index < map->next; ++index) 180 181 char_map_destroy(map->items[index]); 181 182 … … 206 207 return NULL; 207 208 208 if (length || *identifier) {209 if (length || (*identifier)) { 209 210 int index; 210 211 211 for (index = 0; index < map->next; index++) {212 for (index = 0; index < map->next; ++index) { 212 213 if (map->items[index]->c == *identifier) { 213 identifier++;214 ++identifier; 214 215 if (length == 1) 215 216 return map->items[index]; -
uspace/lib/c/include/adt/generic_field.h
r4006447 r463e734 91 91 } \ 92 92 field->items[field->next] = value; \ 93 field->next++; \93 ++field->next; \ 94 94 field->items[field->next] = NULL; \ 95 95 return field->next - 1; \ … … 108 108 int index; \ 109 109 field->magic = 0; \ 110 for (index = 0; index < field->next; index++) { \110 for (index = 0; index < field->next; ++ index) { \ 111 111 if (field->items[index]) \ 112 112 free(field->items[index]); \ -
uspace/lib/c/include/errno.h
r4006447 r463e734 83 83 #define ENOTCONN (-10057) 84 84 85 /** The requested operation was not performed. Try again later. */ 86 #define EAGAIN (-11002) 85 /** The requested operation was not performed. 86 * Try again later. 87 */ 88 #define TRY_AGAIN (-11002) 87 89 88 90 /** No data. -
uspace/lib/c/include/ipc/vfs.h
r4006447 r463e734 36 36 #define LIBC_IPC_VFS_H_ 37 37 38 #include <sys/types.h> 38 39 #include <ipc/ipc.h> 39 #include <sys/types.h>40 #include <bool.h>41 40 42 41 #define FS_NAME_MAXLEN 20 … … 56 55 /** Unique identifier of the fs. */ 57 56 char name[FS_NAME_MAXLEN + 1]; 58 bool concurrent_read_write;59 bool write_retains_size;60 57 } vfs_info_t; 61 58 -
uspace/lib/drv/generic/driver.c
r4006447 r463e734 418 418 goto failure; 419 419 420 return EOK;420 goto leave; 421 421 422 422 failure: … … 431 431 } 432 432 433 leave: 433 434 return rc; 434 435 } -
uspace/srv/devman/devman.c
r4006447 r463e734 766 766 start_driver(drv); 767 767 } 768 fibril_mutex_unlock(&drv->driver_mutex); 769 770 fibril_mutex_lock(&drv->driver_mutex); 768 771 bool is_running = drv->state == DRIVER_RUNNING; 769 772 fibril_mutex_unlock(&drv->driver_mutex); -
uspace/srv/devman/main.c
r4006447 r463e734 246 246 247 247 /* 248 * Try to find a suitable driver and assign it to the device. We do249 * not want to block the current fibril that is used forprocessing250 * incoming calls: we will launch a separate fibril to handle the251 * driver assigning. That is because assign_driver can actually include252 * task spawning which could take some time.248 * Try to find suitable driver and assign it to the device. 249 * We do not want to block current fibril that is used to processing 250 * incoming calls: we will launch a separate fibril to handle 251 * the driver assigning. That is because assign_driver can actually 252 * include task spawning which could take some time. 253 253 */ 254 254 fid_t assign_fibril = fibril_create(assign_driver_fibril, node); -
uspace/srv/devman/match.c
r4006447 r463e734 46 46 if (str_cmp(driver->id, device->id) == 0) { 47 47 /* 48 * The strings match , return the product of their scores.48 * The strings matches, return their score multiplied. 49 49 */ 50 50 return driver->score * device->score; … … 66 66 67 67 /* 68 * Go through all pairs, return the highest score obtaine d.68 * Go through all pairs, return the highest score obtainetd. 69 69 */ 70 70 int highest_score = 0; -
uspace/srv/fs/devfs/devfs.c
r4006447 r463e734 53 53 static vfs_info_t devfs_vfs_info = { 54 54 .name = NAME, 55 .concurrent_read_write = false,56 .write_retains_size = false,57 55 }; 58 56 -
uspace/srv/fs/fat/fat.c
r4006447 r463e734 52 52 vfs_info_t fat_vfs_info = { 53 53 .name = NAME, 54 .concurrent_read_write = false,55 .write_retains_size = false,56 54 }; 57 55 -
uspace/srv/fs/tmpfs/tmpfs.c
r4006447 r463e734 57 57 vfs_info_t tmpfs_vfs_info = { 58 58 .name = NAME, 59 .concurrent_read_write = false,60 .write_retains_size = false,61 59 }; 62 60 -
uspace/srv/net/il/arp/arp.c
r4006447 r463e734 72 72 #define NAME "arp" 73 73 74 /** Number of microseconds to wait for an ARP reply. */75 #define ARP_TRANS_WAIT 100000076 77 74 /** ARP global data. */ 78 75 arp_globals_t arp_globals; … … 80 77 DEVICE_MAP_IMPLEMENT(arp_cache, arp_device_t); 81 78 INT_MAP_IMPLEMENT(arp_protos, arp_proto_t); 82 GENERIC_CHAR_MAP_IMPLEMENT(arp_addr, arp_trans_t); 83 84 static void arp_clear_trans(arp_trans_t *trans) 85 { 86 if (trans->hw_addr) { 87 free(trans->hw_addr); 88 trans->hw_addr = NULL; 89 } 90 fibril_condvar_broadcast(&trans->cv); 91 } 92 93 static void arp_clear_addr(arp_addr_t *addresses) 94 { 95 int count; 96 arp_trans_t *trans; 97 98 for (count = arp_addr_count(addresses) - 1; count >= 0; count--) { 99 trans = arp_addr_items_get_index(&addresses->values, count); 100 if (trans) 101 arp_clear_trans(trans); 102 } 103 } 104 79 GENERIC_CHAR_MAP_IMPLEMENT(arp_addr, measured_string_t); 105 80 106 81 /** Clears the device specific data. … … 121 96 if (proto->addr_data) 122 97 free(proto->addr_data); 123 arp_clear_addr(&proto->addresses);124 98 arp_addr_destroy(&proto->addresses); 125 99 } … … 133 107 arp_device_t *device; 134 108 135 fibril_ mutex_lock(&arp_globals.lock);109 fibril_rwlock_write_lock(&arp_globals.lock); 136 110 for (count = arp_cache_count(&arp_globals.cache) - 1; count >= 0; 137 111 count--) { … … 146 120 } 147 121 arp_cache_clear(&arp_globals.cache); 148 fibril_ mutex_unlock(&arp_globals.lock);122 fibril_rwlock_write_unlock(&arp_globals.lock); 149 123 printf("Cache cleaned\n"); 150 124 return EOK; … … 156 130 arp_device_t *device; 157 131 arp_proto_t *proto; 158 arp_trans_t *trans; 159 160 fibril_mutex_lock(&arp_globals.lock); 132 133 fibril_rwlock_write_lock(&arp_globals.lock); 161 134 device = arp_cache_find(&arp_globals.cache, device_id); 162 135 if (!device) { 163 fibril_ mutex_unlock(&arp_globals.lock);136 fibril_rwlock_write_unlock(&arp_globals.lock); 164 137 return ENOENT; 165 138 } 166 139 proto = arp_protos_find(&device->protos, protocol); 167 140 if (!proto) { 168 fibril_ mutex_unlock(&arp_globals.lock);141 fibril_rwlock_write_unlock(&arp_globals.lock); 169 142 return ENOENT; 170 143 } 171 trans = arp_addr_find(&proto->addresses, address->value, address->length);172 if (trans)173 arp_clear_trans(trans);174 144 arp_addr_exclude(&proto->addresses, address->value, address->length); 175 fibril_ mutex_unlock(&arp_globals.lock);145 fibril_rwlock_write_unlock(&arp_globals.lock); 176 146 return EOK; 177 147 } … … 182 152 arp_device_t *device; 183 153 184 fibril_ mutex_lock(&arp_globals.lock);154 fibril_rwlock_write_lock(&arp_globals.lock); 185 155 device = arp_cache_find(&arp_globals.cache, device_id); 186 156 if (!device) { 187 fibril_ mutex_unlock(&arp_globals.lock);157 fibril_rwlock_write_unlock(&arp_globals.lock); 188 158 return ENOENT; 189 159 } 190 160 arp_clear_device(device); 191 161 printf("Device %d cleared\n", device_id); 192 fibril_ mutex_unlock(&arp_globals.lock);162 fibril_rwlock_write_unlock(&arp_globals.lock); 193 163 return EOK; 194 164 } … … 251 221 int rc; 252 222 253 fibril_ mutex_lock(&arp_globals.lock);223 fibril_rwlock_write_lock(&arp_globals.lock); 254 224 255 225 /* An existing device? */ … … 259 229 if (device->service != service) { 260 230 printf("Device %d already exists\n", device->device_id); 261 fibril_ mutex_unlock(&arp_globals.lock);231 fibril_rwlock_write_unlock(&arp_globals.lock); 262 232 return EEXIST; 263 233 } … … 271 241 rc = arp_proto_create(&proto, protocol, address); 272 242 if (rc != EOK) { 273 fibril_ mutex_unlock(&arp_globals.lock);243 fibril_rwlock_write_unlock(&arp_globals.lock); 274 244 return rc; 275 245 } … … 277 247 proto); 278 248 if (index < 0) { 279 fibril_ mutex_unlock(&arp_globals.lock);249 fibril_rwlock_write_unlock(&arp_globals.lock); 280 250 free(proto); 281 251 return index; … … 292 262 device = (arp_device_t *) malloc(sizeof(arp_device_t)); 293 263 if (!device) { 294 fibril_ mutex_unlock(&arp_globals.lock);264 fibril_rwlock_write_unlock(&arp_globals.lock); 295 265 return ENOMEM; 296 266 } … … 299 269 rc = arp_protos_initialize(&device->protos); 300 270 if (rc != EOK) { 301 fibril_ mutex_unlock(&arp_globals.lock);271 fibril_rwlock_write_unlock(&arp_globals.lock); 302 272 free(device); 303 273 return rc; … … 305 275 rc = arp_proto_create(&proto, protocol, address); 306 276 if (rc != EOK) { 307 fibril_ mutex_unlock(&arp_globals.lock);277 fibril_rwlock_write_unlock(&arp_globals.lock); 308 278 free(device); 309 279 return rc; … … 311 281 index = arp_protos_add(&device->protos, proto->service, proto); 312 282 if (index < 0) { 313 fibril_ mutex_unlock(&arp_globals.lock);283 fibril_rwlock_write_unlock(&arp_globals.lock); 314 284 arp_protos_destroy(&device->protos); 315 285 free(device); … … 323 293 arp_globals.client_connection); 324 294 if (device->phone < 0) { 325 fibril_ mutex_unlock(&arp_globals.lock);295 fibril_rwlock_write_unlock(&arp_globals.lock); 326 296 arp_protos_destroy(&device->protos); 327 297 free(device); … … 333 303 &device->packet_dimension); 334 304 if (rc != EOK) { 335 fibril_ mutex_unlock(&arp_globals.lock);305 fibril_rwlock_write_unlock(&arp_globals.lock); 336 306 arp_protos_destroy(&device->protos); 337 307 free(device); … … 343 313 &device->addr_data); 344 314 if (rc != EOK) { 345 fibril_ mutex_unlock(&arp_globals.lock);315 fibril_rwlock_write_unlock(&arp_globals.lock); 346 316 arp_protos_destroy(&device->protos); 347 317 free(device); … … 353 323 &device->broadcast_addr, &device->broadcast_data); 354 324 if (rc != EOK) { 355 fibril_ mutex_unlock(&arp_globals.lock);325 fibril_rwlock_write_unlock(&arp_globals.lock); 356 326 free(device->addr); 357 327 free(device->addr_data); … … 364 334 device); 365 335 if (rc != EOK) { 366 fibril_ mutex_unlock(&arp_globals.lock);336 fibril_rwlock_write_unlock(&arp_globals.lock); 367 337 free(device->addr); 368 338 free(device->addr_data); … … 377 347 device->service, protocol); 378 348 } 379 fibril_ mutex_unlock(&arp_globals.lock);349 fibril_rwlock_write_unlock(&arp_globals.lock); 380 350 381 351 return EOK; … … 393 363 int rc; 394 364 395 fibril_ mutex_initialize(&arp_globals.lock);396 fibril_ mutex_lock(&arp_globals.lock);365 fibril_rwlock_initialize(&arp_globals.lock); 366 fibril_rwlock_write_lock(&arp_globals.lock); 397 367 arp_globals.client_connection = client_connection; 398 368 rc = arp_cache_initialize(&arp_globals.cache); 399 fibril_ mutex_unlock(&arp_globals.lock);369 fibril_rwlock_write_unlock(&arp_globals.lock); 400 370 401 371 return rc; … … 413 383 arp_device_t *device; 414 384 415 fibril_ mutex_lock(&arp_globals.lock);385 fibril_rwlock_write_lock(&arp_globals.lock); 416 386 device = arp_cache_find(&arp_globals.cache, device_id); 417 387 if (!device) { 418 fibril_ mutex_unlock(&arp_globals.lock);388 fibril_rwlock_write_unlock(&arp_globals.lock); 419 389 return ENOENT; 420 390 } 421 391 device->packet_dimension.content = mtu; 422 fibril_ mutex_unlock(&arp_globals.lock);392 fibril_rwlock_write_unlock(&arp_globals.lock); 423 393 printf("arp - device %d changed mtu to %zu\n\n", device_id, mtu); 424 394 return EOK; … … 451 421 arp_device_t *device; 452 422 arp_proto_t *proto; 453 arp_trans_t *trans;423 measured_string_t *hw_source; 454 424 uint8_t *src_hw; 455 425 uint8_t *src_proto; … … 482 452 des_hw = src_proto + header->protocol_length; 483 453 des_proto = des_hw + header->hardware_length; 484 trans= arp_addr_find(&proto->addresses, (char *) src_proto,454 hw_source = arp_addr_find(&proto->addresses, (char *) src_proto, 485 455 CONVERT_SIZE(uint8_t, char, header->protocol_length)); 486 456 /* Exists? */ 487 if ( trans && trans->hw_addr) {488 if ( trans->hw_addr->length != CONVERT_SIZE(uint8_t, char,457 if (hw_source) { 458 if (hw_source->length != CONVERT_SIZE(uint8_t, char, 489 459 header->hardware_length)) { 490 460 return EINVAL; 491 461 } 492 memcpy( trans->hw_addr->value, src_hw, trans->hw_addr->length);462 memcpy(hw_source->value, src_hw, hw_source->length); 493 463 } 494 464 /* Is my protocol address? */ … … 500 470 proto->addr->length)) { 501 471 /* Not already updated? */ 502 if (!trans) { 503 trans = (arp_trans_t *) malloc(sizeof(arp_trans_t)); 504 if (!trans) 472 if (!hw_source) { 473 hw_source = measured_string_create_bulk((char *) src_hw, 474 CONVERT_SIZE(uint8_t, char, 475 header->hardware_length)); 476 if (!hw_source) 505 477 return ENOMEM; 506 trans->hw_addr = NULL; 507 fibril_condvar_initialize(&trans->cv); 478 508 479 rc = arp_addr_add(&proto->addresses, (char *) src_proto, 509 CONVERT_SIZE(uint8_t, char, header->protocol_length), 510 trans); 511 if (rc != EOK) { 512 /* The generic char map has already freed trans! */ 480 CONVERT_SIZE(uint8_t, char, 481 header->protocol_length), hw_source); 482 if (rc != EOK) 513 483 return rc; 514 }515 }516 if (!trans->hw_addr) {517 trans->hw_addr = measured_string_create_bulk(518 (char *) src_hw, CONVERT_SIZE(uint8_t, char,519 header->hardware_length));520 if (!trans->hw_addr)521 return ENOMEM;522 523 /* Notify the fibrils that wait for the translation. */524 fibril_condvar_broadcast(&trans->cv);525 484 } 526 485 if (ntohs(header->operation) == ARPOP_REQUEST) { … … 531 490 memcpy(src_hw, device->addr->value, 532 491 device->packet_dimension.addr_len); 533 memcpy(des_hw, trans->hw_addr->value,492 memcpy(des_hw, hw_source->value, 534 493 header->hardware_length); 535 494 … … 557 516 * @param[in] protocol The protocol service. 558 517 * @param[in] target The target protocol address. 559 * @param[out] translation Where the hardware address of the target is stored. 560 * @return EOK on success. 561 * @return EAGAIN if the caller should try again. 562 * @return Other error codes in case of error. 563 */ 564 static int 518 * @return The hardware address of the target. 519 * @return NULL if the target parameter is NULL. 520 * @return NULL if the device is not found. 521 * @return NULL if the device packet is too small to send a 522 * request. 523 * @return NULL if the hardware address is not found in the cache. 524 */ 525 static measured_string_t * 565 526 arp_translate_message(device_id_t device_id, services_t protocol, 566 measured_string_t *target , measured_string_t **translation)527 measured_string_t *target) 567 528 { 568 529 arp_device_t *device; 569 530 arp_proto_t *proto; 570 arp_trans_t *trans;531 measured_string_t *addr; 571 532 size_t length; 572 533 packet_t *packet; 573 534 arp_header_t *header; 574 bool retry = false; 575 int rc; 576 577 restart: 578 if (!target || !translation) 579 return EBADMEM; 535 536 if (!target) 537 return NULL; 580 538 581 539 device = arp_cache_find(&arp_globals.cache, device_id); 582 540 if (!device) 583 return ENOENT;541 return NULL; 584 542 585 543 proto = arp_protos_find(&device->protos, protocol); 586 544 if (!proto || (proto->addr->length != target->length)) 587 return ENOENT; 588 589 trans = arp_addr_find(&proto->addresses, target->value, target->length); 590 if (trans) { 591 if (trans->hw_addr) { 592 *translation = trans->hw_addr; 593 return EOK; 594 } 595 if (retry) 596 return EAGAIN; 597 rc = fibril_condvar_wait_timeout(&trans->cv, &arp_globals.lock, 598 ARP_TRANS_WAIT); 599 if (rc == ETIMEOUT) 600 return ENOENT; 601 retry = true; 602 goto restart; 603 } 604 if (retry) 605 return EAGAIN; 545 return NULL; 546 547 addr = arp_addr_find(&proto->addresses, target->value, target->length); 548 if (addr) 549 return addr; 606 550 607 551 /* ARP packet content size = header + (address + translation) * 2 */ … … 609 553 CONVERT_SIZE(char, uint8_t, device->addr->length)); 610 554 if (length > device->packet_dimension.content) 611 return ELIMIT;555 return NULL; 612 556 613 557 packet = packet_get_4_remote(arp_globals.net_phone, … … 615 559 length, device->packet_dimension.suffix); 616 560 if (!packet) 617 return ENOMEM;561 return NULL; 618 562 619 563 header = (arp_header_t *) packet_suffix(packet, length); 620 564 if (!header) { 621 565 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 622 return ENOMEM;566 return NULL; 623 567 } 624 568 … … 639 583 memcpy(((uint8_t *) header) + length, target->value, target->length); 640 584 641 rc =packet_set_addr(packet, (uint8_t *) device->addr->value,585 if (packet_set_addr(packet, (uint8_t *) device->addr->value, 642 586 (uint8_t *) device->broadcast_addr->value, 643 CONVERT_SIZE(char, uint8_t, device->addr->length)); 644 if (rc != EOK) { 587 CONVERT_SIZE(char, uint8_t, device->addr->length)) != EOK) { 645 588 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 646 return rc;589 return NULL; 647 590 } 648 591 649 592 nil_send_msg(device->phone, device_id, packet, SERVICE_ARP); 650 651 trans = (arp_trans_t *) malloc(sizeof(arp_trans_t)); 652 if (!trans) 653 return ENOMEM; 654 trans->hw_addr = NULL; 655 fibril_condvar_initialize(&trans->cv); 656 rc = arp_addr_add(&proto->addresses, target->value, target->length, 657 trans); 658 if (rc != EOK) { 659 /* The generic char map has already freed trans! */ 660 return rc; 661 } 662 663 rc = fibril_condvar_wait_timeout(&trans->cv, &arp_globals.lock, 664 ARP_TRANS_WAIT); 665 if (rc == ETIMEOUT) 666 return ENOENT; 667 retry = true; 668 goto restart; 593 return NULL; 669 594 } 670 595 … … 717 642 return rc; 718 643 719 fibril_ mutex_lock(&arp_globals.lock);720 rc= arp_translate_message(IPC_GET_DEVICE(call),721 IPC_GET_SERVICE(call), address , &translation);644 fibril_rwlock_read_lock(&arp_globals.lock); 645 translation = arp_translate_message(IPC_GET_DEVICE(call), 646 IPC_GET_SERVICE(call), address); 722 647 free(address); 723 648 free(data); 724 if (rc != EOK) {725 fibril_mutex_unlock(&arp_globals.lock);726 return rc;727 }728 649 if (!translation) { 729 fibril_ mutex_unlock(&arp_globals.lock);650 fibril_rwlock_read_unlock(&arp_globals.lock); 730 651 return ENOENT; 731 652 } 732 653 rc = measured_strings_reply(translation, 1); 733 fibril_ mutex_unlock(&arp_globals.lock);654 fibril_rwlock_read_unlock(&arp_globals.lock); 734 655 return rc; 735 656 … … 761 682 return rc; 762 683 763 fibril_ mutex_lock(&arp_globals.lock);684 fibril_rwlock_read_lock(&arp_globals.lock); 764 685 do { 765 686 next = pq_detach(packet); … … 771 692 packet = next; 772 693 } while (packet); 773 fibril_ mutex_unlock(&arp_globals.lock);694 fibril_rwlock_read_unlock(&arp_globals.lock); 774 695 775 696 return EOK; -
uspace/srv/net/il/arp/arp.h
r4006447 r463e734 65 65 typedef struct arp_proto arp_proto_t; 66 66 67 /** Type definition of the ARP address translation record.68 * @see arp_trans69 */70 typedef struct arp_trans arp_trans_t;71 72 67 /** ARP address map. 73 68 * … … 75 70 * @see generic_char_map.h 76 71 */ 77 GENERIC_CHAR_MAP_DECLARE(arp_addr, arp_trans_t);72 GENERIC_CHAR_MAP_DECLARE(arp_addr, measured_string_t); 78 73 79 74 /** ARP address cache. … … 94 89 struct arp_device { 95 90 /** Actual device hardware address. */ 96 measured_string_t * addr;91 measured_string_t * addr; 97 92 /** Actual device hardware address data. */ 98 93 char *addr_data; 99 94 /** Broadcast device hardware address. */ 100 measured_string_t * broadcast_addr;95 measured_string_t * broadcast_addr; 101 96 /** Broadcast device hardware address data. */ 102 97 char *broadcast_data; … … 134 129 int net_phone; 135 130 /** Safety lock. */ 136 fibril_ mutex_t lock;131 fibril_rwlock_t lock; 137 132 }; 138 133 … … 149 144 }; 150 145 151 /** ARP address translation record. */152 struct arp_trans {153 /**154 * Hardware address for the translation. NULL denotes an incomplete155 * record with possible waiters.156 */157 measured_string_t *hw_addr;158 /** Condition variable used for waiting for completion of the record. */159 fibril_condvar_t cv;160 };161 162 146 #endif 163 147 164 148 /** @} 165 149 */ 166 -
uspace/srv/vfs/vfs.h
r4006447 r463e734 172 172 173 173 extern fs_handle_t fs_name_to_handle(char *, bool); 174 extern vfs_info_t *fs_handle_to_info(fs_handle_t);175 174 176 175 extern int vfs_lookup_internal(char *, int, vfs_lookup_res_t *, -
uspace/srv/vfs/vfs_ops.c
r4006447 r463e734 781 781 static void vfs_rdwr(ipc_callid_t rid, ipc_call_t *request, bool read) 782 782 { 783 vfs_info_t *vi;784 783 785 784 /* … … 808 807 fibril_mutex_lock(&file->lock); 809 808 810 vi = fs_handle_to_info(file->node->fs_handle);811 assert(vi);812 813 809 /* 814 810 * Lock the file's node so that no other client can read/write to it at 815 * the same time unless the FS supports concurrent reads/writes and its 816 * write implementation does not modify the file size. 817 */ 818 if (read || (vi->concurrent_read_write && vi->write_retains_size)) 811 * the same time. 812 */ 813 if (read) 819 814 fibril_rwlock_read_lock(&file->node->contents_rwlock); 820 815 else … … 862 857 863 858 /* Unlock the VFS node. */ 864 if (read || (vi->concurrent_read_write && vi->write_retains_size))859 if (read) 865 860 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 866 861 else { -
uspace/srv/vfs/vfs_register.c
r4006447 r463e734 333 333 } 334 334 335 /** Find the VFS info structure.336 *337 * @param handle FS handle for which the VFS info structure is sought.338 * @return VFS info structure on success or NULL otherwise.339 */340 vfs_info_t *fs_handle_to_info(fs_handle_t handle)341 {342 vfs_info_t *info = NULL;343 link_t *cur;344 345 fibril_mutex_lock(&fs_head_lock);346 for (cur = fs_head.next; cur != &fs_head; cur = cur->next) {347 fs_info_t *fs = list_get_instance(cur, fs_info_t, fs_link);348 if (fs->fs_handle == handle) {349 info = &fs->vfs_info;350 break;351 }352 }353 fibril_mutex_unlock(&fs_head_lock);354 355 return info;356 }357 358 335 /** 359 336 * @}
Note:
See TracChangeset
for help on using the changeset viewer.