Rev 2670 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2670 | Rev 3348 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | /* |
1 | /* |
2 | * Copyright (c) 2006 Josef Cejka |
2 | * Copyright (c) 2006 Josef Cejka |
- | 3 | * Copyright (c) 2008 Jakub Jermar |
|
3 | * All rights reserved. |
4 | * All rights reserved. |
4 | * |
5 | * |
5 | * Redistribution and use in source and binary forms, with or without |
6 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions |
7 | * modification, are permitted provided that the following conditions |
7 | * are met: |
8 | * are met: |
Line 32... | Line 33... | ||
32 | /** @file |
33 | /** @file |
33 | */ |
34 | */ |
34 | 35 | ||
35 | #include <stdarg.h> |
36 | #include <stdarg.h> |
36 | #include <stdio.h> |
37 | #include <stdio.h> |
37 | #include <unistd.h> |
38 | #include <stdlib.h> |
38 | #include <io/printf_core.h> |
39 | #include <io/printf_core.h> |
39 | #include <futex.h> |
- | |
40 | #include <async.h> |
- | |
41 | 40 | ||
42 | static atomic_t printf_futex = FUTEX_INITIALIZER; |
- | |
43 | - | ||
44 | static int vprintf_write(const char *str, size_t count, void *unused) |
41 | static int asprintf_prewrite(const char *str, size_t count, void *unused) |
45 | { |
42 | { |
46 | return write_stdout(str, count); |
43 | return count; |
47 | } |
44 | } |
48 | 45 | ||
49 | /** Print formatted text. |
- | |
50 | * @param fmt format string |
- | |
51 | * @param ap format parameters |
- | |
52 | * \see For more details about format string see printf_core. |
- | |
53 | */ |
- | |
54 | int vprintf(const char *fmt, va_list ap) |
46 | int asprintf(char **strp, const char *fmt, ...) |
55 | { |
47 | { |
56 | struct printf_spec ps = { |
48 | struct printf_spec ps = { |
57 | (int (*)(void *, size_t, void *)) vprintf_write, |
49 | asprintf_prewrite, |
58 | NULL |
50 | NULL |
59 | }; |
51 | }; |
60 | /* |
52 | int ret; |
61 | * Prevent other threads to execute printf_core() |
53 | va_list args; |
62 | */ |
54 | |
63 | futex_down(&printf_futex); |
55 | va_start(args, fmt); |
64 | /* |
- | |
65 | * Prevent other pseudo threads of the same thread |
56 | ret = printf_core(fmt, &ps, args); |
- | 57 | va_end(args); |
|
- | 58 | if (ret > 0) { |
|
66 | * to execute printf_core() |
59 | *strp = malloc(ret + 20); |
67 | */ |
60 | if (!*strp) |
68 | async_serialize_start(); |
61 | return -1; |
69 | int ret = printf_core(fmt, &ps, ap); |
62 | va_start(args, fmt); |
70 | async_serialize_end(); |
63 | vsprintf(*strp, fmt, args); |
71 | futex_up(&printf_futex); |
64 | va_end(args); |
- | 65 | } |
|
- | 66 | ||
72 | return ret; |
67 | return ret; |
73 | } |
68 | } |
74 | 69 | ||
75 | /** @} |
70 | /** @} |
76 | */ |
71 | */ |