fluid_timer_t* new_fluid_timer (int msec, fluid_timer_callback_t callback, void* data, int new_thread, int auto_destroy, int high_priority) { fluid_timer_t *timer; timer = FLUID_NEW (fluid_timer_t); if (timer == NULL) { FLUID_LOG (FLUID_ERR, "Out of memory"); return NULL; } timer->msec = msec; timer->callback = callback; timer->data = data; timer->cont = TRUE ; timer->thread = NULL; timer->auto_destroy = auto_destroy; if (new_thread) { timer->thread = new_fluid_thread ("timer", fluid_timer_run, timer, high_priority ? FLUID_SYS_TIMER_HIGH_PRIO_LEVEL : 0, FALSE); if (!timer->thread) { FLUID_FREE (timer); return NULL; } } else fluid_timer_run (timer); /* Run directly, instead of as a separate thread */ return timer; }
fluid_server_socket_t* new_fluid_server_socket(int port, fluid_server_func_t func, void* data) { fluid_server_socket_t* server_socket; struct sockaddr_in addr; fluid_socket_t sock; g_return_val_if_fail (func != NULL, NULL); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { FLUID_LOG(FLUID_ERR, "Failed to create server socket"); return NULL; } FLUID_MEMSET((char *)&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(port); if (bind(sock, (const struct sockaddr *) &addr, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { FLUID_LOG(FLUID_ERR, "Failed to bind server socket"); fluid_socket_close(sock); return NULL; } if (listen(sock, 10) == SOCKET_ERROR) { FLUID_LOG(FLUID_ERR, "Failed listen on server socket"); fluid_socket_close(sock); return NULL; } server_socket = FLUID_NEW(fluid_server_socket_t); if (server_socket == NULL) { FLUID_LOG(FLUID_ERR, "Out of memory"); fluid_socket_close(sock); return NULL; } server_socket->socket = sock; server_socket->func = func; server_socket->data = data; server_socket->cont = 1; server_socket->thread = new_fluid_thread(fluid_server_socket_run, server_socket, 0, FALSE); if (server_socket->thread == NULL) { FLUID_FREE(server_socket); fluid_socket_close(sock); return NULL; } return server_socket; }
fluid_server_socket_t* new_fluid_server_socket(int port, fluid_server_func_t func, void* data) { fluid_server_socket_t* server_socket; #ifdef IPV6 struct sockaddr_in6 addr; #else struct sockaddr_in addr; #endif fluid_socket_t sock; WSADATA wsaData; int retval; if (func == NULL) { FLUID_LOG(FLUID_ERR, "func is NULL"); return NULL; } // Win32 requires initialization of winsock retval = WSAStartup (MAKEWORD (2,2), &wsaData); if (retval != 0) { FLUID_LOG(FLUID_ERR, "Server socket creation error: WSAStartup failed: %d", retval); return NULL; } #ifdef IPV6 sock = socket (AF_INET6, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { FLUID_LOG (FLUID_ERR, "Failed to create server socket: %ld", WSAGetLastError ()); WSACleanup (); return NULL; } addr.sin6_family = AF_INET6; addr.sin6_port = htons (port); addr.sin6_addr = in6addr_any; #else sock = socket (AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { FLUID_LOG (FLUID_ERR, "Failed to create server socket: %ld", WSAGetLastError ()); WSACleanup (); return NULL; } addr.sin_family = AF_INET; addr.sin_port = htons (port); addr.sin_addr.s_addr = htonl (INADDR_ANY); #endif retval = bind (sock, (struct sockaddr *)&addr, sizeof (addr)); if (retval == SOCKET_ERROR) { FLUID_LOG (FLUID_ERR, "Failed to bind server socket: %ld", WSAGetLastError ()); fluid_socket_close (sock); WSACleanup (); return NULL; } if (listen (sock, SOMAXCONN) == SOCKET_ERROR) { FLUID_LOG (FLUID_ERR, "Failed to listen on server socket: %ld", WSAGetLastError ()); fluid_socket_close (sock); WSACleanup (); return NULL; } server_socket = FLUID_NEW (fluid_server_socket_t); if (server_socket == NULL) { FLUID_LOG (FLUID_ERR, "Out of memory"); fluid_socket_close (sock); WSACleanup (); return NULL; } server_socket->socket = sock; server_socket->func = func; server_socket->data = data; server_socket->cont = 1; server_socket->thread = new_fluid_thread("server", fluid_server_socket_run, server_socket, 0, FALSE); if (server_socket->thread == NULL) { FLUID_FREE (server_socket); fluid_socket_close (sock); WSACleanup (); return NULL; } return server_socket; }