diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/qpthreads.c | 81 | ||||
-rw-r--r-- | lib/qpthreads.h | 3 | ||||
-rw-r--r-- | lib/stream.h | 23 |
3 files changed, 57 insertions, 50 deletions
diff --git a/lib/qpthreads.c b/lib/qpthreads.c index ebaf6f19..4288b9ff 100644 --- a/lib/qpthreads.c +++ b/lib/qpthreads.c @@ -568,9 +568,8 @@ qpt_thread_create(void* (*start)(void*), void* arg, qpt_thread_attr_t* attr) { qstring qs ; - qs = qpt_thread_attr_form(&thread_attr, " ") ; - - fputs(qs_string(qs), stderr) ; + qs = qpt_thread_attr_form(&thread_attr) ; + zlog_info("Thread created: %s", qs_string(qs)) ; qs_free(qs) ; } @@ -1392,7 +1391,7 @@ qpt_data_delete(qpt_data data) * NB: it is the caller's responsibility to dispose of the qstring */ extern qstring -qpt_thread_attr_form(qpt_thread_attr_t* attr, const char *prefix) +qpt_thread_attr_form(qpt_thread_attr_t* attr) { int err, i ; qstring qs ; @@ -1402,131 +1401,117 @@ qpt_thread_attr_form(qpt_thread_attr_t* attr, const char *prefix) qs = qs_new(500) ; - /* 12345678901234567890 */ - qs_printf_a(qs, "%sDetach state ", prefix) ; err = pthread_attr_getdetachstate(attr, &i); if (err != 0) - qs_printf_a(qs, " *error* %s\n", errtoa(err, 0).str) ; + qs_printf_a(qs, "[getdetachstate *error* %s]", errtoa(err, 0).str) ; else { switch(i) { case PTHREAD_CREATE_DETACHED: - qs_printf_a(qs, "= %s\n", "PTHREAD_CREATE_DETACHED") ; + qs_printf_a(qs, "Detached") ; break ; case PTHREAD_CREATE_JOINABLE: - qs_printf_a(qs, "= %s\n", "PTHREAD_CREATE_JOINABLE") ; + qs_printf_a(qs, "Joinable") ; break ; default: - qs_printf_a(qs, "= *UNKNOWN* %d\n", i) ; + qs_printf_a(qs, "[getdetachstate *unknown* %d]", i) ; break ; } ; } ; - /* 12345678901234567890 */ - qs_printf_a(qs, "%sScope ", prefix) ; - err = pthread_attr_getscope(attr, &i); + err = pthread_attr_getinheritsched(attr, &i); if (err != 0) - qs_printf_a(qs, " *error* %s\n", errtoa(err, 0).str) ; + qs_printf_a(qs, " [getinheritsched *error* %s]", errtoa(err, 0).str) ; else { switch(i) { - case PTHREAD_SCOPE_SYSTEM: - qs_printf_a(qs, "= %s\n", "PTHREAD_SCOPE_SYSTEM") ; + case PTHREAD_INHERIT_SCHED: + qs_printf_a(qs, " Inherit-Sched") ; break ; - case PTHREAD_SCOPE_PROCESS: - qs_printf_a(qs, "= %s\n", "PTHREAD_SCOPE_PROCESS") ; + case PTHREAD_EXPLICIT_SCHED: + qs_printf_a(qs, " Explicit-Sched") ; break ; default: - qs_printf_a(qs, "= *UNKNOWN* %d\n", i) ; + qs_printf_a(qs, " [getinheritsched *unknown* %d]", i) ; break ; } ; } ; - /* 12345678901234567890 */ - qs_printf_a(qs, "%sInherit scheduler ", prefix) ; - err = pthread_attr_getinheritsched(attr, &i); + err = pthread_attr_getscope(attr, &i); if (err != 0) - qs_printf_a(qs, " *error* %s\n", errtoa(err, 0).str) ; + qs_printf_a(qs, " [getscope *error* %s]", errtoa(err, 0).str) ; else { switch(i) { - case PTHREAD_INHERIT_SCHED: - qs_printf_a(qs, "= %s\n", "PTHREAD_INHERIT_SCHED") ; + case PTHREAD_SCOPE_SYSTEM: + qs_printf_a(qs, " System-Scope") ; break ; - case PTHREAD_EXPLICIT_SCHED: - qs_printf_a(qs, "= %s\n", "PTHREAD_EXPLICIT_SCHED") ; + case PTHREAD_SCOPE_PROCESS: + qs_printf_a(qs, " Process-Scope") ; break ; default: - qs_printf_a(qs, "= *UNKNOWN* %d\n", i) ; + qs_printf_a(qs, " [getscope *unknown* %d]", i) ; break ; } ; } ; - /* 12345678901234567890 */ - qs_printf_a(qs, "%sScheduling policy ", prefix) ; err = pthread_attr_getschedpolicy(attr, &i); if (err != 0) - qs_printf_a(qs, " *error* %s\n", errtoa(err, 0).str) ; + qs_printf_a(qs, " [getschedpolicy *error* %s]", errtoa(err, 0).str) ; else { switch(i) { case SCHED_OTHER: - qs_printf_a(qs, "= %s\n", "SCHED_OTHER") ; + qs_printf_a(qs, " SCHED_OTHER") ; break ; case SCHED_FIFO: - qs_printf_a(qs, "= %s\n", "SCHED_FIFO") ; + qs_printf_a(qs, " SCHED_FIFO") ; break ; case SCHED_RR: - qs_printf_a(qs, "= %s\n", "SCHED_RR") ; + qs_printf_a(qs, " SCHED_RR") ; break ; #ifdef SCHED_SPORADIC case SCHED_SPORADIC: - qs_printf_a(qs, "= %s\n", "SCHED_SPORADIC") ; + qs_printf_a(qs, " SCHED_SPORADIC") ; break ; #endif default: - qs_printf_a(qs, "= *UNKNOWN* %d\n", i) ; + qs_printf_a(qs, " SCHED_UNKNOWN=%d", i) ; break ; } ; } ; - /* 12345678901234567890 */ - qs_printf_a(qs, "%sScheduling priority ", prefix) ; err = pthread_attr_getschedparam(attr, sp); if (err != 0) - qs_printf_a(qs, " *error* %s\n", errtoa(err, 0).str) ; + qs_printf_a(qs, " [getschedparam *error* %s]", errtoa(err, 0).str) ; else - qs_printf_a(qs, "= %d\n", sp->sched_priority) ; + qs_printf_a(qs, " Priority=%d", sp->sched_priority) ; - /* 12345678901234567890 */ - qs_printf_a(qs, "%sGuard size ", prefix) ; err = pthread_attr_getguardsize(attr, &v); if (err != 0) - qs_printf_a(qs, " *error* %s\n", errtoa(err, 0).str) ; + qs_printf_a(qs, " [getguardsize *error* %s]", errtoa(err, 0).str) ; else - qs_printf_a(qs, "= %u\n", (uint)v) ; + qs_printf_a(qs, " Guard-Size=%u", (uint)v) ; - /* 12345678901234567890 */ - qs_printf_a(qs, "%sStack address/size ", prefix) ; err = pthread_attr_getstack(attr, &stkaddr, &v) ; if (err != 0) - qs_printf_a(qs, " *error* %s\n", errtoa(err, 0).str) ; + qs_printf_a(qs, " [getstack *error* %s]", errtoa(err, 0).str) ; else - qs_printf_a(qs, "= %p/%u\n", stkaddr, (uint)v) ; + qs_printf_a(qs, " Stack=%p/%u", stkaddr, (uint)v) ; return qs ; } ; diff --git a/lib/qpthreads.h b/lib/qpthreads.h index 363fbead..78c39a6e 100644 --- a/lib/qpthreads.h +++ b/lib/qpthreads.h @@ -194,8 +194,7 @@ qpt_thread_join(qpt_thread_t thread_id) ; extern clockid_t qpt_get_cpu_clock(qpt_thread_t thread_id) ; extern qtime_t qpt_cpu_time(clockid_t clock_id) ; -extern qstring qpt_thread_attr_form(qpt_thread_attr_t* attr, - const char *prefix) ; +extern qstring qpt_thread_attr_form(qpt_thread_attr_t* attr) ; /*============================================================================== * Signal Handling. diff --git a/lib/stream.h b/lib/stream.h index b4d981b1..a7906573 100644 --- a/lib/stream.h +++ b/lib/stream.h @@ -177,6 +177,8 @@ Inline bool stream_has_overflowed(struct stream* s) ; Inline void stream_clear_overrun(struct stream* s) ; Inline void stream_clear_overflow(struct stream* s) ; +Inline bool stream_has_written_beyond(struct stream* s, size_t limit) ; + Inline void stream_set_getp(struct stream *, size_t); Inline void stream_set_endp(struct stream *, size_t); Inline void stream_set_startp(struct stream* s, size_t) ; @@ -503,6 +505,27 @@ stream_clear_overflow(struct stream* s) } /*------------------------------------------------------------------------------ + * Test if the endp is beyond the given limit + * + * A stream may be set up to be longer than some actual limit, so that the + * extent of overflowing beyond that limit can be measured. This test can + * then be used to see if the endp is *currently* within the given limit. + * + * Returns: true <=> endp is *beyond* the given limit. + * + * NB: the limit MUST be less than the size -- for if not, this is *always* + * going to return false, because the s->endp is *always* <= s->size ! + */ +Inline bool +stream_has_written_beyond(struct stream* s, size_t limit) +{ + qassert_stream(s) ; + qassert(limit < s->size) ; + + return (s->endp > limit) ; +} ; + +/*------------------------------------------------------------------------------ * Set s->getp to given value. * * If value > s->endp will force to s->endp and set s->overrun. |