Hi,

i detected a problem, when a uv_cond_t isn't aligned to a valid 4Byte 
boundary (?). 

I'm created the following code. Tested with libuv 1.13.1 on arch linux.

#include <uv.h>
#include <stdio.h>
#include <string.h>  // memset


typedef struct {
  uv_mutex_t mutex;
  uv_cond_t cond;
  uint16_t data;
} WorkerConfig;


typedef struct {
  WorkerConfig producer;
  WorkerConfig consumer;
} GlobalConfig;


void checkError(int line, int val)
{
  printf("%s called: Line %d: ReturnCode: %d\n", __func__, line, val);
  if(val)
  {
    printf("File: %s Line %d failed: ReturnCode: %d\n", __FILE__, line, val
);
  }
}


void initGlobalConfig(GlobalConfig* globalConfig)
{
  printf("%s called\n", __func__);
  memset(globalConfig, 0, sizeof(GlobalConfig));

  checkError(__LINE__, uv_cond_init(&globalConfig->consumer.cond));
    checkError(__LINE__, uv_mutex_init(&globalConfig->producer.mutex));

    checkError(__LINE__, uv_cond_init(&globalConfig->consumer.cond));
    checkError(__LINE__, uv_mutex_init(&globalConfig->producer.mutex));
}


void waitForSignal(WorkerConfig* config)
{
  printf("%s called\n", __func__);
  uv_mutex_lock(&config->mutex);
  uv_cond_wait(&config->cond, &config->mutex);
  uv_mutex_unlock(&config->mutex);
}

int main(int argc, char* argv[])
{
  setbuf(stdout, NULL);

  GlobalConfig globalConfig;
  initGlobalConfig(&globalConfig);
  waitForSignal(&globalConfig.consumer);

  return 0;
}


Compiling the code with the following is working fine:

> gcc test/tasktestwithoutstruct.c -luv; ./a.out 
> initGlobalConfig called 

checkError called: Line 30: ReturnCode: 0 

checkError called: Line 31: ReturnCode: 0

checkError called: Line 33: ReturnCode: 0 

checkError called: Line 34: ReturnCode: 0

waitForSignal called


But with -fpack-struct parameter, a core dump occure.

> gcc test/tasktestwithoutstruct.c -luv -fpack-struct; ./a.out 
> initGlobalConfig called
>
checkError called: Line 30: ReturnCode: 0 

checkError called: Line 31: ReturnCode: 0

checkError called: Line 33: ReturnCode: 0 

checkError called: Line 34: ReturnCode: 0

waitForSignal called
> The futex facility returned an unexpected error code.Aborted (core dumped)


Is this a bug, or do i have (as user) to take care about the memory 
position of the elements? At least, i would expect, that the uv_cond_init 
method would check during the initialization, if the positions are valid.


Marcel

-- 
You received this message because you are subscribed to the Google Groups 
"libuv" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to libuv+unsubscr...@googlegroups.com.
To post to this group, send email to libuv@googlegroups.com.
Visit this group at https://groups.google.com/group/libuv.
For more options, visit https://groups.google.com/d/optout.

Reply via email to