Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

pthread handle to int

577 views
Skip to first unread message

red floyd

unread,
Mar 14, 2011, 4:49:42 PM3/14/11
to
I've got some third party code that I'm trying to port to OSS (H RVU).

The code is trying to convert a pthread_t to an int (to create a
unique ID).

Now, since under both SPT and PUT models, pthread_t is a structure,
this cast is failing (for the obvious reasons).

Does anyone have any ideas as how to deal with this ? Are any of the
three fields in pthread_handle_t unique and invariant on a per-thread
basis, so that I can use that field to convert to int?

Thanks.


DanBar

unread,
Mar 15, 2011, 11:49:11 AM3/15/11
to

I know what you mean. I found this piece of code that may help, just
adapt it for your particular need. It is taken from ACE_wrappers code

/**
* @file tid_to_int.h
*
* $Id: tid_to_int.h 79902 2007-10-31 09:46:36Z johnnyw $
*
* Convert an ACE_thread_t to an integer in a way that doesn't rely
* heavily on platform-specific configuration.
*
* @author Ossama Othman
*/

namespace
{
template<typename thread_id_type, typename ace_thread_id_type>
struct ACE_thread_t_to_integer_i
{
thread_id_type operator() (ace_thread_id_type tid)
{
// We assume sizeof(thread_id_type) >=
sizeof(ace_thread_id_type).
return (thread_id_type) (tid);
}
};

template<typename thread_id_type, typename ace_thread_id_type>
struct ACE_thread_t_to_integer_i<thread_id_type,
ace_thread_id_type*>
{
thread_id_type operator() (ace_thread_id_type* tid)
{
// ACE_thread_t is a pointer. Cast to an intermediate integer
// type large enough to hold a pointer.
#if defined (ACE_OPENVMS) && (!defined (__INITIAL_POINTER_SIZE) ||
(__INITIAL_POINTER_SIZE < 64))
int const tmp = reinterpret_cast<int> (tid);
#else
intptr_t const tmp = reinterpret_cast<intptr_t> (tid);
#endif

// We assume sizeof(thread_id_type) >=
sizeof(ace_thread_id_type).
return (thread_id_type) tmp;
}
};

template<typename thread_id_type>
thread_id_type
ACE_thread_t_to_integer (ACE_thread_t tid)
{
return ACE_thread_t_to_integer_i<thread_id_type, ACE_thread_t>()
(tid);
}
}

good luck,

Daniel.

red floyd

unread,
Mar 15, 2011, 2:24:36 PM3/15/11
to

Thanks. Unfortunately, I'm dealing with raw pthread_t, which is
defined as a 3 element struct (pointer, short, short).
I appreciate the help, though.


0 new messages