diff options
Diffstat (limited to 'src/libtools/myalign.c')
| -rw-r--r-- | src/libtools/myalign.c | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/src/libtools/myalign.c b/src/libtools/myalign.c index 6cb96ab7..7958960f 100644 --- a/src/libtools/myalign.c +++ b/src/libtools/myalign.c @@ -7,6 +7,7 @@ #include <fts.h> #include <sys/stat.h> #include <sys/sem.h> +#include <pthread.h> #include "x64emu.h" #include "emu/x64emu_private.h" @@ -1131,3 +1132,187 @@ void myStackAlignScanfWValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, } #endif + +typedef struct my_xcb_ext_s { + pthread_mutex_t lock; + struct lazyreply *extensions; + int extensions_size; +} my_xcb_ext_t; + +typedef struct x64_xcb_ext_s { + uint8_t lock[60]; + struct lazyreply *extensions; + int extensions_size; +} x64_xcb_ext_t; + +typedef struct my_xcb_xid_s { + pthread_mutex_t lock; + uint32_t last; + uint32_t base; + uint32_t max; + uint32_t inc; +} my_xcb_xid_t; + +typedef struct x64_xcb_xid_s { + uint8_t lock[60]; + uint32_t last; + uint32_t base; + uint32_t max; + uint32_t inc; +} x64_xcb_xid_t; + +typedef struct my_xcb_fd_s { + int fd[16]; + int nfd; + int ifd; +} my_xcb_fd_t; + +typedef struct my_xcb_in_s { + pthread_cond_t event_cond; + int reading; + char queue[4096]; + int queue_len; + uint64_t request_expected; + uint64_t request_read; + uint64_t request_completed; + struct reply_list *current_reply; + struct reply_list **current_reply_tail; + void* replies; + struct event_list *events; + struct event_list **events_tail; + struct reader_list *readers; + struct special_list *special_waiters; + struct pending_reply *pending_replies; + struct pending_reply **pending_replies_tail; + my_xcb_fd_t in_fd; + struct xcb_special_event *special_events; +} my_xcb_in_t; + +typedef struct my_xcb_out_s { + pthread_cond_t cond; + int writing; + pthread_cond_t socket_cond; + void (*return_socket)(void *closure); + void *socket_closure; + int socket_moving; + char queue[16384]; + int queue_len; + uint64_t request; + uint64_t request_written; + pthread_mutex_t reqlenlock; + int maximum_request_length_tag; + uint32_t maximum_request_length; + my_xcb_fd_t out_fd; +} my_xcb_out_t; + +typedef struct my_xcb_connection_s { + int has_error; + void *setup; + int fd; + pthread_mutex_t iolock; + my_xcb_in_t in; + my_xcb_out_t out; + my_xcb_ext_t ext; + my_xcb_xid_t xid; +} my_xcb_connection_t; + +typedef struct x64_xcb_connection_s { + int has_error; + void *setup; + int fd; + uint8_t iolock[60]; + my_xcb_in_t in; + my_xcb_out_t out; + x64_xcb_ext_t ext; + x64_xcb_xid_t xid; +} x64_xcb_connection_t; + +#define NXCB 4 +my_xcb_connection_t* my_xcb_connects[NXCB] = {0}; +x64_xcb_connection_t x64_xcb_connects[NXCB] = {0}; + +void* align_xcb_connection(void* src) +{ + if(!src) + return src; + // find it + my_xcb_connection_t * dest = NULL; + for(int i=0; i<NXCB && !dest; ++i) + if(src==&x64_xcb_connects[i]) + dest = my_xcb_connects[i]; + if(!dest) + dest = add_xcb_connection(src); + if(!dest) { + printf_log(LOG_NONE, "BOX64: Error, xcb_connect %p not found\n", src); + return src; + } + // do not update most values + x64_xcb_connection_t* source = src; + dest->has_error = source->has_error; + dest->setup = source->setup; + dest->fd = source->fd; + //memcpy(&dest->iolock, source->iolock, 60); + //dest->in = source->in; + //dest->out = source->out; + //memcpy(&dest->ext.lock, source->ext.lock, 60); + dest->ext.extensions = source->ext.extensions; + dest->ext.extensions_size = source->ext.extensions_size; + //memcpy(&dest->xid.lock, source->xid.lock, 60); + dest->xid.base = source->xid.base; + dest->xid.inc = source->xid.inc; + dest->xid.last = source->xid.last; + dest->xid.max = source->xid.last; + return dest; +} + +void unalign_xcb_connection(void* src, void* dst) +{ + if(!src || !dst || src==dst) + return; + // update values + my_xcb_connection_t* source = src; + x64_xcb_connection_t* dest = dst; + dest->has_error = source->has_error; + dest->setup = source->setup; + dest->fd = source->fd; + memcpy(dest->iolock, &source->iolock, 60); + dest->in = source->in; + dest->out = source->out; + memcpy(dest->ext.lock, &source->ext.lock, 60); + dest->ext.extensions = source->ext.extensions; + dest->ext.extensions_size = source->ext.extensions_size; + memcpy(dest->xid.lock, &source->xid.lock, 60); + dest->xid.base = source->xid.base; + dest->xid.inc = source->xid.inc; + dest->xid.last = source->xid.last; + dest->xid.max = source->xid.last; +} + +void* add_xcb_connection(void* src) +{ + if(!src) + return src; + // find a free slot + for(int i=0; i<NXCB; ++i) + if(!my_xcb_connects[i]) { + my_xcb_connects[i] = src; + unalign_xcb_connection(src, &x64_xcb_connects[i]); + return &x64_xcb_connects[i]; + } + printf_log(LOG_NONE, "BOX64: Error, no more free xcb_connect slot for %p\n", src); + return src; +} + +void del_xcb_connection(void* src) +{ + if(!src) + return; + // find it + for(int i=0; i<NXCB; ++i) + if(src==my_xcb_connects[i]) { + my_xcb_connects[i] = 0; + memset(&x64_xcb_connects[i], 0, sizeof(x64_xcb_connection_t)); + return; + } + printf_log(LOG_NONE, "BOX64: Error, xcb_connect %p not found for deletion\n", src); +} |