Is there the ability to define the core to which a given thread will be pinned to?
Yes, you can set the thread affinity of the automatically created context thread.
The relevant context properties for the underlying C API can be found here.
From within JavaRTO, you can provide the required “CONTEXT_THREAD_AFFINITY” property on context creation like so:
String contextProperties = new String;
int index = 0;
contextProperties[index++] = "CONTEXT_THREAD_AFFINITY";
contextProperties[index++] = "255";
contextProperties[index++] = "CONTEXT_CREATE_THREAD";
contextProperties[index++] = "1";
rc = Solclient.createContextForHandle(contextHandle, contextProperties);
Note: if you pass context properties to createContextForHandle(), you must include CONTEXT_CREATE_THREAD with a value of 1. (Its default is 0, meaning disabled, which is not supported).
Huh! I didn't know that. Cool!
As an alternative, I usually handle my CPU affinity at the shell using taskset. That way I can change at runtime.
How did you calculate 255 ? I used 10 for using core 4 but don't think it worked.
See the docs for the C API here: https://docs.solace.com/API-Developer-Online-Ref-Documentation/c/group___context_props.html
(Note, the JavaRTO API is a JNI wrapper around the C API... if you need pure Java, there is the new Java API, and the older JCSMP API)
It is a bitmask. So if you want core 4 (numbering starts at 0), you'll want to set only the 5th bit from the right, or 0b00010000, which is 16.
255 means 0b11111111, or setting the mask so it can run on any core from 0-7.
Thanks @Aaron. Is it possible to busy spin? I saw if using shares memory there is an option to spin but I am using tcp protocol and couldn't find any way to spin.
0x0000000000000010 is the bit mask I used as per https://bitsum.com/tools/cpu-affinity-calculator/ for core 4. But after reading your response its clear that it is incorrect. Many thanks