This uses format %pt.  (%pT is existing, and results in tid in
decimal.)  The display will use lower-case a-f.

Comments/concerns?

I have a small itch for APR_PID_T_HEX_FMT as well.

My understanding is that this feature can go in trunk because trunk
isn't a released version yet, and it can go in 0.9.x because that is <
1.0 and not covered by the versioning guidelines (other than binary
compatibility), but 1.0 and 1.1 are feature-frozen.
Index: strings/apr_snprintf.c
===================================================================
--- strings/apr_snprintf.c      (revision 190567)
+++ strings/apr_snprintf.c      (working copy)
@@ -665,7 +665,28 @@
     return (p);
 }
 
+#if APR_HAS_THREADS
+static char *conv_os_thread_t_hex(apr_os_thread_t *tid, char *buf_end, 
apr_size_t *len)
+{
+    union {
+        apr_os_thread_t tid;
+        apr_uint64_t alignme;
+    } u;
+    int is_negative;
 
+    u.tid = *tid;
+    switch(sizeof(u.tid)) {
+    case sizeof(apr_int32_t):
+        return conv_p2(*(apr_uint32_t *)&u.tid, 4, 'x', buf_end, len);
+    case sizeof(apr_int64_t):
+        return conv_p2_quad(*(apr_uint64_t *)&u.tid, 4, 'x', buf_end, len);
+    default:
+        /* not implemented; stick 0 in the buffer */
+        return conv_10(0, TRUE, &is_negative, buf_end, len);
+    }
+}
+#endif
+
 /*
  * Do format conversion placing the output in buffer
  */
@@ -1170,6 +1191,31 @@
 #endif
                     break;
 
+                case 't':
+#if APR_HAS_THREADS
+                {
+                    apr_os_thread_t *tid;
+
+                    tid = va_arg(ap, apr_os_thread_t *);
+                    if (tid != NULL) {
+                        s = conv_os_thread_t_hex(tid, &num_buf[NUM_BUF_SIZE], 
&s_len);
+                        if (adjust_precision && precision < s_len)
+                            s_len = precision;
+                    }
+                    else {
+                        s = S_NULL;
+                        s_len = S_NULL_LEN;
+                    }
+                    pad_char = ' ';
+                }
+#else
+                    char_buf[0] = '0';
+                    s = &char_buf[0];
+                    s_len = 1;
+                    pad_char = ' ';
+#endif
+                    break;
+
                 case NUL:
                     /* if %p ends the string, oh well ignore it */
                     continue;
Index: include/apr_lib.h
===================================================================
--- include/apr_lib.h   (revision 190567)
+++ include/apr_lib.h   (working copy)
@@ -116,6 +116,8 @@
  *      [ipv6-address]:port
  * %%pT takes an apr_os_thread_t * and prints it in decimal
  *      ('0' is printed if !APR_HAS_THREADS)
+ * %%pt takes an apr_os_thread_t * and prints it in hexadecimal
+ *      ('0' is printed if !APR_HAS_THREADS)
  * %%pp takes a void * and outputs it in hex
  *
  * The %%p hacks are to force gcc's printf warning code to skip

Reply via email to