#include <stdarg.h> /* va_* */
#include <stdio.h> /* FILE */
-#ifdef _MSC_VER
-#define strcasecmp _stricmp
-#endif
-
SG_BEGIN_DECL()
/** @addtogroup XBT_str
XBT_PUBLIC(char *) xbt_str_join(xbt_dynar_t dynar, const char *sep);
XBT_PUBLIC(char *) xbt_str_join_array(const char *const *strs, const char *sep);
-/* */
XBT_PUBLIC(void) xbt_str_subst(char *str, char from, char to, int amount);
XBT_PUBLIC(char *) xbt_str_varsubst(const char *str, xbt_dict_t patterns);
-/* */
XBT_PUBLIC(char *) xbt_str_from_file(FILE * file);
XBT_PUBLIC(long int) xbt_str_parse_int(const char* str, const char* error_msg);
*/
static inline unsigned int xbt_str_hash_ext(const char *str, int str_len)
{
-
#ifdef DJB2_HASH_FUNCTION
/* fast implementation of djb2 algorithm */
int c;
while (*str) {
/* multiply by the 32 bit FNV magic prime mod 2^32 */
- hash +=
- (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) +
- (hash << 24);
+ hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
/* xor the bottom with the current byte */
hash ^= (unsigned int) *str++;
}
/**@}*/
-
SG_END_DECL()
#endif /* XBT_STR_H */
return label;
}
-
xbt_dynar_t xbt_automaton_get_states(xbt_automaton_t a){
return a->states;
}
printf("\n\nCurrent state: %s\n", a->current_state->id);
printf("\nStates' List: %lu\n\n", xbt_dynar_length(a->states));
-
-
+
xbt_dynar_foreach(a->states, cursor, state)
printf("ID: %s, type: %d\n", state->id, state->type);
xbt_automaton_transition_t transition;
printf("\nTransitions: %lu\n\n", xbt_dynar_length(a->transitions));
-
+
xbt_dynar_foreach(a->transitions, cursor, transition){
printf("label:");
xbt_automaton_exp_label_display(transition->label);
}
void xbt_automaton_exp_label_display(xbt_automaton_exp_label_t label){
-
switch(label->type){
case 0 :
printf("(");
printf("(1)");
break;
}
-
}
xbt_automaton_state_t xbt_automaton_get_current_state(xbt_automaton_t a){
return 1;
switch(l1->type){
-
case 0 : // OR
case 1 : // AND
if(xbt_automaton_exp_label_compare(l1->u.or_and.left_exp, l2->u.or_and.left_exp))
else
return xbt_automaton_exp_label_compare(l1->u.or_and.right_exp, l2->u.or_and.right_exp);
break;
-
case 2 : // NOT
return xbt_automaton_exp_label_compare(l1->u.exp_not, l2->u.exp_not);
break;
-
case 3 : // predicat
return (strcmp(l1->u.predicat, l2->u.predicat));
break;
-
case 4 : // 1
return 0;
break;
-
default :
return -1;
break;
-
}
-
}
-
int xbt_automaton_propositional_symbols_compare_value(xbt_dynar_t s1, xbt_dynar_t s2){
-
int *iptr1, *iptr2;
unsigned int cursor;
unsigned int nb_elem = xbt_dynar_length(s1);
return 0;
}
-/************ Free functions ****************/
-
static void xbt_automaton_transition_free(xbt_automaton_transition_t t);
static void xbt_automaton_exp_label_free(xbt_automaton_exp_label_t e);
static void xbt_automaton_propositional_symbol_free(xbt_automaton_propositional_symbol_t ps);
core_bind++;
else
core_bind = 0;
-#endif
+#endif
}
return parmap;
}
data = xbt_new0(s_xbt_parmap_thread_data_t, 1);
data->parmap = parmap;
data->worker_id = i;
- parmap->workers[i] = xbt_os_thread_create(NULL, xbt_parmap_mc_worker_main,
- data, NULL);
+ parmap->workers[i] = xbt_os_thread_create(NULL, xbt_parmap_mc_worker_main, data, NULL);
}
return parmap;
}
parmap->mode = mode;
switch (mode) {
-
case XBT_PARMAP_POSIX:
parmap->master_wait_f = xbt_parmap_posix_master_wait;
parmap->worker_signal_f = xbt_parmap_posix_worker_signal;
parmap->done_cond = xbt_os_cond_init();
parmap->done_mutex = xbt_os_mutex_init();
break;
-
-
case XBT_PARMAP_FUTEX:
#if HAVE_FUTEX_H
parmap->master_wait_f = xbt_parmap_futex_master_wait;
#else
xbt_die("Futex is not available on this OS.");
#endif
-
case XBT_PARMAP_BUSY_WAIT:
-#ifndef _MSC_VER
parmap->master_wait_f = xbt_parmap_busy_master_wait;
parmap->worker_signal_f = xbt_parmap_busy_worker_signal;
parmap->master_signal_f = xbt_parmap_busy_master_signal;
xbt_os_cond_destroy(parmap->done_cond);
xbt_os_mutex_destroy(parmap->done_mutex);
break;
-#else
- xbt_die("Busy waiting not implemented on Windows yet.");
-#endif
-
case XBT_PARMAP_DEFAULT:
THROW_IMPOSSIBLE;
break;
static void xbt_parmap_work(xbt_parmap_t parmap)
{
unsigned index;
- while ((index = parmap->index++)
- < xbt_dynar_length(parmap->data))
+ while ((index = parmap->index++) < xbt_dynar_length(parmap->data))
parmap->fun(xbt_dynar_get_as(parmap->data, index, void*));
}
while (1) {
parmap->worker_wait_f(parmap, ++round);
if (parmap->status == XBT_PARMAP_WORK) {
-
XBT_DEBUG("Worker %d got a job", data->worker_id);
xbt_parmap_work(parmap);
parmap->worker_signal_f(parmap);
XBT_DEBUG("Worker %d has finished", data->worker_id);
-
/* We are destroying the parmap */
} else {
SIMIX_context_free(context);
}
#if HAVE_MC
-
/**
* \brief Applies a list of tasks in parallel.
* \param parmap a parallel map object
static void xbt_parmap_mc_work(xbt_parmap_t parmap, int worker_id)
{
- unsigned int data_size = (parmap->length / parmap->num_workers) +
- ((parmap->length % parmap->num_workers) ? 1 :0);
+ unsigned int data_size = (parmap->length / parmap->num_workers) + ((parmap->length % parmap->num_workers) ? 1 :0);
void* start = (char*)parmap->mc_data + (data_size*worker_id*sizeof(void*));
void* end = MIN((char *)start + data_size* sizeof(void*), (char*)parmap->mc_data + parmap->length*sizeof(void*));
-
+
//XBT_CRITICAL("Worker %d : %p -> %p (%d)", worker_id, start, end, data_size);
while ( start < end && parmap->finish == -1) {
int res = parmap->snapshot_compare(*(void**)start, parmap->ref_snapshot);
start = (char *)start + sizeof(start);
if (!res){
-
parmap->finish = ((char*)start - (char*)parmap->mc_data) / sizeof(void*);
//XBT_CRITICAL("Find good one %p (%p)", start, parmap->mc_data);
break;
while (1) {
parmap->worker_wait_f(parmap, ++round);
if (parmap->status == XBT_PARMAP_WORK) {
-
XBT_DEBUG("Worker %d got a job", data->worker_id);
xbt_parmap_mc_work(parmap, data->worker_id);
parmap->worker_signal_f(parmap);
XBT_DEBUG("Worker %d has finished", data->worker_id);
-
/* We are destroying the parmap */
} else {
xbt_free(data);
}
#endif
-#ifndef _MSC_VER
/**
* \brief Starts the parmap: waits for all workers to be ready and returns.
*
xbt_os_thread_yield();
}
}
-#endif /* ! _MSC_VER */
#include <windows.h>
#endif
-#ifndef _MSC_VER
#include "libgen.h" /* POSIX dirname */
-#endif
/** @brief Get a single line from the stream (reimplementation of the GNU getline)
*
* The argument is never modified, and the returned value must be freed after use.
*/
char *xbt_dirname(const char *path) {
-#ifdef _MSC_VER
- char drive[_MAX_DRIVE];
- char dir[_MAX_DIR];
- errno_t err;
- err = _splitpath_s(path, drive, _MAX_DRIVE, dir, _MAX_DIR, NULL,0, NULL,0);
- return bprintf("%s%s",drive,dir);
-#else
- char *tmp = xbt_strdup(path);
- char *res = xbt_strdup(dirname(tmp));
- free(tmp);
- return res;
-#endif
+ char *tmp = xbt_strdup(path);
+ char *res = xbt_strdup(dirname(tmp));
+ free(tmp);
+ return res;
}
+
/** @brief Returns the file component of a path (reimplementation of POSIX basename)
*
* The argument is never modified, and the returned value must be freed after use.
*/
char *xbt_basename(const char *path) {
-#ifdef _MSC_VER
- char file[1024];
- char ext[1024];
- errno_t err;
- err = _splitpath_s(path, NULL,0, NULL,0, file,1024, ext,1024);
- return bprintf("%s.%s",file,ext);
-#else
- char *tmp = xbt_strdup(path);
- char *res = xbt_strdup(basename(tmp));
- free(tmp);
- return res;
-#endif
+ char *tmp = xbt_strdup(path);
+ char *res = xbt_strdup(basename(tmp));
+ free(tmp);
+ return res;
}
static int growsdown(int *x)
{
int y = (x > &y);
-
+
if (--iterate > 0)
y = growsdown(&y);
#ifdef _MSC_VER
__declspec(thread)
-#else
+#else
__thread
#endif
int thread_specific_variable = 0;
int main(void) {
-
thread_specific_variable++;
printf("%d\n", thread_specific_variable);
return 0;